using HslCommunication.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HslCommunication.BasicFramework
{
/****************************************************************************
*
* 日期: 2017年6月28日 18:34:14
* 功能: 一个泛型的数组缓冲类,支持高性能存储
*
***************************************************************************/
///
/// 内存队列的基类
///
public abstract class SoftCacheArrayBase
{
///
/// 字节数据流
///
protected byte[] DataBytes = null;
///
/// 数据的长度
///
public int ArrayLength { get; protected set; }
///
/// 数据数组变动时的数据锁
///
protected SimpleHybirdLock HybirdLock = new SimpleHybirdLock();
///
/// 用于从保存的数据对象初始化的
///
///
///
public virtual void LoadFromBytes(byte[] dataSave)
{
}
///
/// 获取原本的数据字节
///
///
public byte[] GetAllData()
{
byte[] result = new byte[DataBytes.Length];
DataBytes.CopyTo(result, 0);
return result;
}
}
///
/// 一个内存队列缓存的类,数据类型为Int64
///
public sealed class SoftCacheArrayLong : SoftCacheArrayBase
{
///
/// 数据的本身面貌
///
private long[] DataArray = null;
///
/// 实例化一个数据对象
///
///
///
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;
}
}
}
///
/// 用于从保存的数据对象初始化的
///
///
///
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);
}
}
///
/// 线程安全的添加数据
///
/// 值
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();
}
}
///
/// 一个内存队列缓存的类,数据类型为Int32
///
public sealed class SoftCacheArrayInt : SoftCacheArrayBase
{
///
/// 数据的本身面貌
///
private int[] DataArray = null;
///
/// 实例化一个数据对象
///
///
///
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;
}
}
}
///
/// 用于从保存的数据对象初始化的
///
///
///
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);
}
}
///
/// 线程安全的添加数据
///
/// 值
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();
}
///
/// 安全的获取数组队列
///
///
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;
}
}
}