static void SetValues(IOPointer p, IEnumerable children, object parent) { var method = addMethodInfo.MakeGenericMethod(p.Field.Types[p.Rank]); foreach (var child in children) { method.Invoke(parent, new[] { child }); } }
static object MakeArray(IOPointer p, IList children) { var result = (IList)Array.CreateInstance(p.Field.Types[p.Rank + 1], children.Count); for (int i = 0; i < children.Count; i++) { result[i] = children[i]; } return(result); }
void WriteSheet(IOPointer pointer, object obj) { if (pointer.Rank == pointer.Field.Rank) { WriteType(pointer.Field.Meta, pointer.Name, obj); } else { obj.ForEachChild(IOPointer.GetSheetPointers(pointer), WriteSheet); } }
public void WriteRegion(IOPointer pointer, object obj) { if (pointer.IsValue) { WriteValue(obj, pointer.Pos); } else { obj.ForEachChild(IOPointer.GetRegionPointers(pointer), WriteRegion); } } // todo: highlight elements of free array with color (chessboard-ish order) with ((index.X + index.Y) & 1) ? color1 : color2
static object MakeObject(IOPointer p, ArrayList children) { if (p.Field.Types[p.Rank].IsArray) { return(MakeArray(p, children)); } var result = Activator.CreateInstance(p.TargetType); AddChildrenToObject(p, children, result); return(result); }
static bool TryGetChild(object parent, IOPointer p, out object child) { if (parent != null && p.Rank == 0) { child = p.Field.FieldInfo.GetValue(parent); return(true); } if (parent is IList list && list.Count > p.Index) { child = list[p.Index]; return(true); } child = null; return(!p.IsFreeSize); }
static void AddChildrenToObject(IOPointer p, ArrayList children, object parent) { if (p.Rank == p.Field.Rank) { parent.SetFields(p.Field.Meta.Regions.Select(x => x.FieldInfo), children); } else if (parent is IList list) { foreach (var child in children) { list.Add(child); } } else { SetValues(p, children, parent); } }
public static IEnumerable <IOPointer> GetSheetPointers(IOPointer p) => p.Rank == p.Field.Rank ? p.Field.Meta.GetSheetPointers(p.Name) : p.ChildIndices.Select(i => new IOPointer(p.Field, p.Rank + 1, i, V2Int.Zero, $"{p.Name} {i + 1}"));
public static IEnumerable <IOPointer> GetRegionPointers(IOPointer p) => p.Rank == p.Field.Rank ? p.Field.Meta.GetPointers(p.Pos) : p.ChildIndices.Select(i => new IOPointer(p.Field, p.Rank + 1, i, p.Pos.Add(p.Field.Offsets[p.Rank + 1].Scale(i)), ""));
bool TryReadRegion(IOPointer p, out object result) => (result = values.TryGetElement(p.Pos.X, out var column) && column.TryGetElement(p.Pos.Y, out var cell)
bool TryCreate(IOPointer p, out object result) => (p.IsValue ? TryReadRegion(p, out result) : p.TryCreateFromChildren(TryCreate, IOPointer.GetRegionPointers, out result)) || p.Optional;
public static bool TryCreateFromChildren(this IOPointer p, SheetsIO.ReadObjectDelegate create, Func <IOPointer, IEnumerable <IOPointer> > func, out object result) => (result = func(p).TryGetChildren(create, out var childrenList) || p.IsValidContent(childrenList)