Example #1
0
        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 });
            }
        }
Example #2
0
        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);
        }
Example #3
0
 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);
     }
 }
Example #4
0
 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
Example #5
0
        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);
        }
Example #6
0
 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);
 }
Example #7
0
 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);
     }
 }
Example #8
0
 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}"));
Example #9
0
 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)), ""));
Example #10
0
 bool TryReadRegion(IOPointer p, out object result) => (result = values.TryGetElement(p.Pos.X, out var column) && column.TryGetElement(p.Pos.Y, out var cell)
Example #11
0
 bool TryCreate(IOPointer p, out object result) => (p.IsValue
                                                        ? TryReadRegion(p, out result)
                                                        : p.TryCreateFromChildren(TryCreate, IOPointer.GetRegionPointers, out result)) ||
 p.Optional;
Example #12
0
 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)