Advertisement
apieceoffruit

Flat2DArray

Apr 12th, 2023 (edited)
857
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.16 KB | None | 0 0
  1.  [Serializable]
  2.     public class Flat2DArray<T> : ISerializationCallbackReceiver
  3.     {
  4.         [SerializeField] T[] _items;
  5.         [SerializeField] int _x;
  6.         [SerializeField] int _y;
  7.         public int X => _x;
  8.         public int Y => _y;
  9.         public T[] Items
  10.         {
  11.             get => _items;
  12.             private set => _items = value;
  13.         }
  14.  
  15.         public Flat2DArray(int x = 0, int y = 0)
  16.         {
  17.             _x = x;
  18.             _y = y;
  19.             Items = new T[X * Y];
  20.         }
  21.  
  22.         public void ForEach(Action<int, int> action)
  23.         {
  24.             for (int x = 0; x < X; x++)
  25.             for (int y = 0; y < Y; y++)
  26.                 action?.Invoke(x, y);
  27.         }
  28.  
  29.         public T this[int x, int y]
  30.         {
  31.             get => Items[(x * Y) + y];
  32.             set => Items[(x * Y) + y] = value;
  33.         }
  34.  
  35.         public void OnBeforeSerialize() { }
  36.  
  37.         public void OnAfterDeserialize()
  38.         {
  39.             Items ??= new T[X * Y];
  40.             var newSize = X * Y;
  41.             int oldSize = Items.Length;
  42.             Array.Resize(ref _items, newSize);
  43.             if (newSize <= oldSize) return;
  44.             for (int i = oldSize; i < newSize; i++) Items[i] = default;
  45.         }
  46.  
  47.         public void Populate(T[] items)
  48.         {
  49.             if (items.Length < Items.Length)
  50.                 Array.Copy(items, _items, items.Length);
  51.         }
  52.        
  53.         public class Flat2DArrayConverter : JsonConverter<Flat2DArray<T>>
  54.     {
  55.         public override void WriteJson(JsonWriter writer, Flat2DArray<T> value, JsonSerializer serializer)
  56.         {
  57.             writer.WriteStartObject();
  58.             writer.WritePropertyName("x");
  59.             writer.WriteValue(value._x);
  60.             writer.WritePropertyName("y");
  61.             writer.WriteValue(value._y);
  62.             writer.WritePropertyName("items");
  63.             serializer.Serialize(writer, value._items);
  64.             writer.WriteEndObject();
  65.         }
  66.  
  67.         public override Flat2DArray<T> ReadJson(JsonReader reader, Type objectType, Flat2DArray<T> existingValue, bool hasExistingValue, JsonSerializer serializer)
  68.         {
  69.             var x = 0;
  70.             var y = 0;
  71.             T[] items = null;
  72.  
  73.             while (reader.Read())
  74.             {
  75.                 if (reader.TokenType == JsonToken.PropertyName)
  76.                 {
  77.                     var propertyName = reader.Value.ToString();
  78.                     reader.Read();
  79.  
  80.                     switch (propertyName)
  81.                     {
  82.                         case "x":
  83.                             x = Convert.ToInt32(reader.Value);
  84.                             break;
  85.                         case "y":
  86.                             y = Convert.ToInt32(reader.Value);
  87.                             break;
  88.                         case "items":
  89.                             items = serializer.Deserialize<T[]>(reader);
  90.                             break;
  91.                     }
  92.                 }
  93.                 else if (reader.TokenType == JsonToken.EndObject)
  94.                     break;
  95.             }
  96.             return new Flat2DArray<T>(x, y) { _items = items };
  97.         }
  98.     }
  99.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement