You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

232 lines
6.3 KiB
C#

using HslCommunication.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HslCommunication.BasicFramework
{
/****************************************************************************
*
* 2017628 18:34:14
*
*
***************************************************************************/
/// <summary>
/// 内存队列的基类
/// </summary>
public abstract class SoftCacheArrayBase
{
/// <summary>
/// 字节数据流
/// </summary>
protected byte[] DataBytes = null;
/// <summary>
/// 数据的长度
/// </summary>
public int ArrayLength { get; protected set; }
/// <summary>
/// 数据数组变动时的数据锁
/// </summary>
protected SimpleHybirdLock HybirdLock = new SimpleHybirdLock();
/// <summary>
/// 用于从保存的数据对象初始化的
/// </summary>
/// <param name="dataSave"></param>
/// <exception cref="NullReferenceException"></exception>
public virtual void LoadFromBytes(byte[] dataSave)
{
}
/// <summary>
/// 获取原本的数据字节
/// </summary>
/// <returns></returns>
public byte[] GetAllData()
{
byte[] result = new byte[DataBytes.Length];
DataBytes.CopyTo(result, 0);
return result;
}
}
/// <summary>
/// 一个内存队列缓存的类数据类型为Int64
/// </summary>
public sealed class SoftCacheArrayLong : SoftCacheArrayBase
{
/// <summary>
/// 数据的本身面貌
/// </summary>
private long[] DataArray = null;
/// <summary>
/// 实例化一个数据对象
/// </summary>
/// <param name="capacity"></param>
/// <param name="defaultValue"></param>
public SoftCacheArrayLong(int capacity, int defaultValue)
{
if (capacity < 10) capacity = 10;
ArrayLength = capacity;
DataArray = new long[capacity];
DataBytes = new byte[capacity * 8];
if (defaultValue != 0)
{
for (int i = 0; i < capacity; i++)
{
DataArray[i] = defaultValue;
}
}
}
/// <summary>
/// 用于从保存的数据对象初始化的
/// </summary>
/// <param name="dataSave"></param>
/// <exception cref="NullReferenceException"></exception>
public override void LoadFromBytes(byte[] dataSave)
{
int capacity = dataSave.Length / 8;
ArrayLength = capacity;
DataArray = new long[capacity];
DataBytes = new byte[capacity * 8];
for (int i = 0; i < capacity; i++)
{
DataArray[i] = BitConverter.ToInt64(dataSave, i * 8);
}
}
/// <summary>
/// 线程安全的添加数据
/// </summary>
/// <param name="value">值</param>
public void AddValue(long value)
{
HybirdLock.Enter();
//进入混合锁模式
for (int i = 0; i < ArrayLength - 1; i++)
{
DataArray[i] = DataArray[i + 1];
}
DataArray[ArrayLength - 1] = value;
for (int i = 0; i < ArrayLength; i++)
{
BitConverter.GetBytes(DataArray[i]).CopyTo(DataBytes, 8 * i);
}
HybirdLock.Leave();
}
}
/// <summary>
/// 一个内存队列缓存的类数据类型为Int32
/// </summary>
public sealed class SoftCacheArrayInt : SoftCacheArrayBase
{
/// <summary>
/// 数据的本身面貌
/// </summary>
private int[] DataArray = null;
/// <summary>
/// 实例化一个数据对象
/// </summary>
/// <param name="capacity"></param>
/// <param name="defaultValue"></param>
public SoftCacheArrayInt(int capacity, int defaultValue)
{
if (capacity < 10) capacity = 10;
ArrayLength = capacity;
DataArray = new int[capacity];
DataBytes = new byte[capacity * 4];
if (defaultValue != 0)
{
for (int i = 0; i < capacity; i++)
{
DataArray[i] = defaultValue;
}
}
}
/// <summary>
/// 用于从保存的数据对象初始化的
/// </summary>
/// <param name="dataSave"></param>
/// <exception cref="NullReferenceException"></exception>
public override void LoadFromBytes(byte[] dataSave)
{
int capacity = dataSave.Length / 4;
ArrayLength = capacity;
DataArray = new int[capacity];
DataBytes = new byte[capacity * 4];
for (int i = 0; i < capacity; i++)
{
DataArray[i] = BitConverter.ToInt32(dataSave, i * 4);
}
}
/// <summary>
/// 线程安全的添加数据
/// </summary>
/// <param name="value">值</param>
public void AddValue(int value)
{
HybirdLock.Enter();
//进入混合锁模式
for (int i = 0; i < ArrayLength - 1; i++)
{
DataArray[i] = DataArray[i + 1];
}
DataArray[ArrayLength - 1] = value;
for (int i = 0; i < ArrayLength; i++)
{
BitConverter.GetBytes(DataArray[i]).CopyTo(DataBytes, 4 * i);
}
HybirdLock.Leave();
}
/// <summary>
/// 安全的获取数组队列
/// </summary>
/// <returns></returns>
public int[] GetIntArray()
{
int[] result = null;
HybirdLock.Enter();
result = new int[ArrayLength];
//进入混合锁模式
for (int i = 0; i < ArrayLength; i++)
{
result[i] = DataArray[i];
}
HybirdLock.Leave();
return result;
}
}
}