using System;
using System.Collections.Generic;
using System.Text;
namespace Island.StandardLib.Storage
{
///
/// 表示一个每项长度不固定的可序列化变长数组(不定项长可变数组)
///
public class StorableMultArray : IStorable
{
List array;
///
/// 初始化不定项长可变数组
///
public StorableMultArray()
{
array = new List();
}
public StorableMultArray DeepCopy()
{
StorableMultArray newArray = new StorableMultArray();
for (int i = 0; i < Length; i++)
newArray.Add(this[i].DeepCopy());
return newArray;
}
public void ReadFromData(DataStorage data)
{
data.ReadUncheck(out int size);
for (int i = 0; i < size; i++)
array.Add(new MultData(data.Read()));
}
public void WriteToData(DataStorage data)
{
data.WriteUncheck(array.Count);
for (int i = 0; i < array.Count; i++)
data.Write(array[i].Data);
}
public override bool Equals(object obj)
{
StorableMultArray other = obj as StorableMultArray;
if (other == null) return false;
if (other.Length != Length) return false;
for (int i = 0; i < Length; i++)
if (!other[i].Equals(this[i])) return false;
return true;
}
public void Add(IStorable data) => array.Add(new MultData(data));
public void Add(MultData data) => array.Add(data);
public void Add(byte[] data) => array.Add(new MultData(data));
public void RemoveAt(int index) => array.RemoveAt(index);
public void Clear() => array.Clear();
public int Count => array.Count;
public int Size => array.Count;
public int Length => array.Count;
public MultData this[int index] => array[index];
}
///
/// 表示一个不定项长可变数组的项
///
public class MultData
{
public byte[] Data;
public MultData DeepCopy()
{
byte[] b = new byte[Data.Length];
Array.Copy(Data, b, b.Length);
return new MultData(b);
}
public MultData(byte[] data) => Data = data;
public MultData(int data) => Data = BitConverter.GetBytes(data);
public MultData(char data) => Data = BitConverter.GetBytes(data);
public MultData(bool data) => Data = BitConverter.GetBytes(data);
public MultData(float data) => Data = BitConverter.GetBytes(data);
public MultData(string data) => Data = Encoding.UTF8.GetBytes(data);
public MultData(long data) => Data = BitConverter.GetBytes(data);
public MultData(uint data) => Data = BitConverter.GetBytes(data);
public MultData(ulong data) => Data = BitConverter.GetBytes(data);
public MultData(double data) => Data = BitConverter.GetBytes(data);
public MultData(IStorable data)
{
DataStorage ds = new DataStorage();
data.WriteToData(ds);
Data = ds.Bytes;
}
public override bool Equals(object obj)
{
MultData other = obj as MultData;
if (other == null) return false;
return other.Data.ByteEquals(Data);
}
public int AsInt() => BitConverter.ToInt32(Data, 0);
public char AsChar() => BitConverter.ToChar(Data, 0);
public bool AsBool() => BitConverter.ToBoolean(Data, 0);
public float AsFloat() => BitConverter.ToSingle(Data, 0);
public string AsString() => Encoding.UTF8.GetString(Data);
public long AsLong() => BitConverter.ToInt64(Data, 0);
public uint AsUInt() => BitConverter.ToUInt32(Data, 0);
public ulong AsULong() => BitConverter.ToUInt64(Data, 0);
public double AsDouble() => BitConverter.ToDouble(Data, 0);
public T As() where T : IStorable, new() => Data.ReadData();
public override int GetHashCode()
{
return BitConverter.ToInt32(Data.Hash16(), 0);
}
}
}