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; } } }