////////////////////////////////////////////////////////////////////////////// public static Obj Copy(SymBinaryTable[] tables) { int size = 0; for (int i = 0; i < tables.Length; i++) { size += tables[i].Size(); } if (size == 0) { return(EmptyRelObj.singleton); } Obj[] objs1 = new Obj[size]; Obj[] objs2 = new Obj[size]; int[] buffer = new int[32]; int next = 0; for (int iT = 0; iT < tables.Length; iT++) { SymBinaryTable table = tables[iT]; OneWayBinTable oneWayTable = table.table; SurrObjMapper mapper = table.mapper; int len = oneWayTable.column.Length; for (int iS = 0; iS < len; iS++) { int count1 = oneWayTable.Count(iS); if (count1 != 0) { if (count1 > buffer.Length) { buffer = new int[Array.Capacity(buffer.Length, count1)]; } Obj obj1 = mapper(iS); int _count1 = oneWayTable.Restrict(iS, buffer); Debug.Assert(_count1 == count1); for (int i = 0; i < count1; i++) { int surr2 = buffer[i]; if (iS <= surr2) { objs1[next] = obj1; objs2[next++] = mapper(surr2); } } } } } Debug.Assert(next == size); return(Builder.CreateBinRel(objs1, objs2, size)); //## THIS COULD BE MADE MORE EFFICIENT }
////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// public static void Write(DataWriter writer, int fieldSymbId, SymBinaryTable[] tables, int indentation, bool indentFirstLine, bool writeSeparator) { string baseWs = new string(Array.Repeat(' ', indentation)); string entryWs = new string(Array.Repeat(' ', indentation + 2)); int count = 0; for (int i = 0; i < tables.Length; i++) { count += tables[i].Size(); } if (indentFirstLine) { writer.Write(baseWs); } writer.Write(SymbObj.IdxToStr(fieldSymbId)); writer.Write(": ["); if (count > 0) { writer.Write("\n"); int written = 0; for (int i = 0; i < tables.Length; i++) { SymBinaryTable table = tables[i]; SurrObjMapper mapper = table.mapper; SymBinaryTable.Iter it = table.GetIter(); while (!it.Done()) { writer.Write(entryWs); Obj obj1 = mapper(it.Get1()); Obj obj2 = mapper(it.Get2()); ObjPrinter.PrintNoFlush(obj1, writer); writer.Write(", "); ObjPrinter.PrintNoFlush(obj2, writer); written++; writer.Write(written < count || count == 1 ? ";\n" : "\n"); it.Next(); } } Debug.Assert(written == count); writer.Write(baseWs); } writer.Write(writeSeparator ? "],\n" : "]\n"); }
public SymBinaryTableUpdater(string relvarName, SymBinaryTable table, ValueStoreUpdater store) { this.relvarName = relvarName; this.table = table; this.store = store; }