} // setclear // set assignment, s1 = s2 public static void setcpy(ref Set256 s1, Set256 s2) { //-----------------------------------|---------------------------------------- for (int i = 0; i < SET256_LEN; i++) { s1.ushorts[i] = s2.ushorts[i]; } } // setcpy
} // setdiff // clear s, s = {} public static void setclear(ref Set256 s) { //-----------------------------------|---------------------------------------- for (int i = 0; i < SET256_LEN; i++) { s.ushorts[i] = 0; } } // setclear
} // setinters // s1 = s1 union s2 public static void setunion(ref Set256 s1, Set256 s2) { //-----------------------------------|---------------------------------------- int i = 0; while (i < SET256_LEN) { s1.ushorts[i] |= s2.ushorts[i]; i++; } // while } // setunion
} // setunion // s1 = s1 - s2 public static void setdiff(ref Set256 s1, Set256 s2) { //-----------------------------------|---------------------------------------- int i = 0; while (i < SET256_LEN) { s1.ushorts[i] &= (ushort)(~(s2.ushorts[i])); i++; } // while } // setdiff
} // setcpy // set comparison, s1 == s2? public static bool seteq(Set256 s1, Set256 s2) { //-----------------------------------|---------------------------------------- for (int i = 0; i < SET256_LEN; i++) { if (s1.ushorts[i] != s2.ushorts[i]) { return(false); } } return(true); } // seteq
} // seteq // s empty? public static bool setempty(Set256 s) { //-----------------------------------|---------------------------------------- for (int i = 0; i < SET256_LEN; i++) { if (s.ushorts[i] != 0) { return(false); } } return(true); } // setempty
} // setle // sets s1 and s2 disjoint? public static bool setdisjoint(Set256 s1, Set256 s2) { //-----------------------------------|---------------------------------------- int i = 0; while (i < SET256_LEN) { if ((s1.ushorts[i] & s2.ushorts[i]) != 0) { return(false); } i++; } // while return(true); } // setdisjoint
public static void SetsMethod(Utils.ModuleAction action, out String moduleName) { //-----------------------------------|---------------------------------------- moduleName = MODULENAME; switch (action) { case Utils.ModuleAction.getModuleName: return; case Utils.ModuleAction.initModule: emptySet = new Set256(); break; case Utils.ModuleAction.resetModule: break; case Utils.ModuleAction.cleanupModule: break; } // switch } // SetsFunc
public static void SetsMethod(Utils.ModuleAction action, out String moduleName) { //-----------------------------------|---------------------------------------- moduleName = MODULENAME; switch (action) { case Utils.ModuleAction.getModuleName: return; case Utils.ModuleAction.initModule: emptySet = new Set256(); break; case Utils.ModuleAction.resetModule: break; case Utils.ModuleAction.cleanupModule: break; } // switch } // SetsFunc
} // setexcl // --- operations for type Set256 only --- // init s, use // e or E for an <e>lement, e.g., setinit(s, "E", e) // r or R for a <r>ange, e.g., setinit(s, "R", lb, ub) public static void setinit(out Set256 s, String form, params ushort[] p) { //-----------------------------------|---------------------------------------- int pi = 0; ushort e, lb, ub; s = new Set256(); foreach (char op in form) { switch (op) { case 'E': case 'e': e = p[pi++]; // single element e setincl(ref s, e); break; case 'R': case 'r': lb = p[pi++]; // range lb .. ub ub = p[pi++]; if (lb > ub) { Utils.FatalError(MODULENAME, "setinit", "lb > ub"); } e = lb; while (e <= ub) { setincl(ref s, e); e++; } // while break; default: Utils.FatalError(MODULENAME, "setinit", "unknown operation \'{0}\'", op.ToString()); break; } // switch } // while } // setinit
} // setle // sets s1 and s2 disjoint? public static bool setdisjoint(Set256 s1, Set256 s2) { //-----------------------------------|---------------------------------------- int i = 0; while (i < SET256_LEN) { if ((s1.ushorts[i] & s2.ushorts[i]) != 0) return false; i++; } // while return true; } // setdisjoint
} // setincl // exclude x from s //-----------------------------------|---------------------------------------- public static void setexcl(ref Set256 s, ushort x) { checkVal(x); Utils.ClrBit(ref s.ushorts[x / BITSET_BIT], (ushort)(x & BITSET_MASK)); } // setexcl
} // member // include x in s public static void setincl(ref Set256 s, ushort x) { //-----------------------------------|---------------------------------------- checkVal(x); Utils.SetBit(ref s.ushorts[x / BITSET_BIT], (ushort)(x & BITSET_MASK)); } // setincl
} // setdiff // clear s, s = {} public static void setclear(ref Set256 s) { //-----------------------------------|---------------------------------------- for (int i = 0; i < SET256_LEN; i++) s.ushorts[i] = 0; } // setclear
} // setinters // s1 = s1 union s2 public static void setunion(ref Set256 s1, Set256 s2) { //-----------------------------------|---------------------------------------- int i = 0; while (i < SET256_LEN) { s1.ushorts[i] |= s2.ushorts[i]; i++; } // while } // setunion
} // setempty #if TEST_SETS public static void Main(String[] args) { Console.WriteLine("START: Sets"); Console.WriteLine("installing ..."); Utils.InstallModule("Utils", new Utils.ModuleMethodDelegate(Utils.UtilsMethod)); Utils.InstallModule("Sets", new Utils.ModuleMethodDelegate(Sets.SetsMethod )); Console.WriteLine("initModule ..."); Utils.Modules(Utils.ModuleAction.initModule); Console.WriteLine("emptySet = " + emptySet); Set256 s = new Set256(); Console.WriteLine("s = " + s); setincl(ref s, 177); setincl(ref s, 4); Console.WriteLine("after setincl(ref s, 177) and setincl(ref s, 4), s = " + s); setexcl(ref s, 177); setexcl(ref s, 4); Console.WriteLine("after setexcl(ref s, 177) and setexcl(ref s, 4), s = " + s); setinit(out s, "E", 4); Console.WriteLine("after setinit(out s, \"E\", 4), s = " + s); setinit(out s, "R", 4, 177); Console.WriteLine("after setinit(out s, \"R\", 4, 177), s = " + s); Set256 a, b; setinit(out a, "E", 4); setinit(out b, "E", 5); Console.WriteLine("setle(a, b) = " + setle(a, b)); setinit(out a, "R", 0, 9); setinit(out b, "R", 9, 100); Console.WriteLine("setdisjoint(a, b) = " + setdisjoint(a, b)); setinit(out a, "R", 0, 99); setinit(out b, "R", 80, 100); setinters(ref a, b); Console.WriteLine("setinters(ref a, b) = " + a); setinit(out a, "R", 0, 9); setinit(out b, "R", 100, 109); setunion(ref a, b); Console.WriteLine("setunion(ref a, b) = " + a); setinit(out a, "R", 0, 99); setinit(out b, "R", 1, 98); setdiff(ref a, b); Console.WriteLine("setdiff(ref a, b) = " + a); setclear(ref a); Console.WriteLine("setclear(a) = " + a); setinit(out b, "R", 0, 9); setcpy(ref a, b); Console.WriteLine("setcpy(a) = " + a); Console.WriteLine("seteq(a, b) = " + seteq(a, b)); Console.WriteLine("setempty(a) = " + setempty(a)); Console.WriteLine("setempty(emptySet) = " + setempty(emptySet)); Console.WriteLine("resetModule ..."); Utils.Modules(Utils.ModuleAction.resetModule); Console.WriteLine("cleanupModule ..."); Utils.Modules(Utils.ModuleAction.cleanupModule); Console.WriteLine("END"); // Console.WriteLine("type [CR] to continue ..."); // Console.ReadLine(); } // Main
} // seteq // s empty? public static bool setempty(Set256 s) { //-----------------------------------|---------------------------------------- for (int i = 0; i < SET256_LEN; i++) if (s.ushorts[i] != 0) return false; return true; } // setempty
} // setcpy // set comparison, s1 == s2? public static bool seteq(Set256 s1, Set256 s2) { //-----------------------------------|---------------------------------------- for (int i = 0; i < SET256_LEN; i++) if (s1.ushorts[i] != s2.ushorts[i]) return false; return true; } // seteq
} // setclear // set assignment, s1 = s2 public static void setcpy(ref Set256 s1, Set256 s2) { //-----------------------------------|---------------------------------------- for (int i = 0; i < SET256_LEN; i++) s1.ushorts[i] = s2.ushorts[i]; } // setcpy
} // setexcl // --- operations for type Set256 only --- // init s, use // e or E for an <e>lement, e.g., setinit(s, "E", e) // r or R for a <r>ange, e.g., setinit(s, "R", lb, ub) public static void setinit(out Set256 s, String form, params ushort[] p) { //-----------------------------------|---------------------------------------- int pi = 0; ushort e, lb, ub; s = new Set256(); foreach (char op in form) { switch (op) { case 'E': case 'e': e = p[pi++]; // single element e setincl(ref s, e); break; case 'R': case 'r': lb = p[pi++]; // range lb .. ub ub = p[pi++]; if (lb > ub) Utils.FatalError(MODULENAME, "setinit", "lb > ub"); e = lb; while (e <= ub) { setincl(ref s, e); e++; } // while break; default: Utils.FatalError(MODULENAME, "setinit", "unknown operation \'{0}\'", op.ToString()); break; } // switch } // while } // setinit
} //checkVal // x member of s? public static bool member(ushort x, Set256 s) { //-----------------------------------|---------------------------------------- checkVal(x); return Utils.TestBit(s.ushorts[x / BITSET_BIT], (ushort)(x & BITSET_MASK)); } // member
} // setunion // s1 = s1 - s2 public static void setdiff(ref Set256 s1, Set256 s2) { //-----------------------------------|---------------------------------------- int i = 0; while (i < SET256_LEN) { s1.ushorts[i] &= (ushort)(~(s2.ushorts[i])); i++; } // while } // setdiff
} // member // include x in s public static void setincl(ref Set256 s, ushort x) { //-----------------------------------|---------------------------------------- checkVal(x); Utils.SetBit(ref s.ushorts[x / BITSET_BIT], (ushort)(x & BITSET_MASK)); } // setincl
} //checkVal // x member of s? public static bool member(ushort x, Set256 s) { //-----------------------------------|---------------------------------------- checkVal(x); return(Utils.TestBit(s.ushorts[x / BITSET_BIT], (ushort)(x & BITSET_MASK))); } // member
} // setempty #if TEST_SETS public static void Main(String[] args) { Console.WriteLine("START: Sets"); Console.WriteLine("installing ..."); Utils.InstallModule("Utils", new Utils.ModuleMethodDelegate(Utils.UtilsMethod)); Utils.InstallModule("Sets", new Utils.ModuleMethodDelegate(Sets.SetsMethod)); Console.WriteLine("initModule ..."); Utils.Modules(Utils.ModuleAction.initModule); Console.WriteLine("emptySet = " + emptySet); Set256 s = new Set256(); Console.WriteLine("s = " + s); setincl(ref s, 177); setincl(ref s, 4); Console.WriteLine("after setincl(ref s, 177) and setincl(ref s, 4), s = " + s); setexcl(ref s, 177); setexcl(ref s, 4); Console.WriteLine("after setexcl(ref s, 177) and setexcl(ref s, 4), s = " + s); setinit(out s, "E", 4); Console.WriteLine("after setinit(out s, \"E\", 4), s = " + s); setinit(out s, "R", 4, 177); Console.WriteLine("after setinit(out s, \"R\", 4, 177), s = " + s); Set256 a, b; setinit(out a, "E", 4); setinit(out b, "E", 5); Console.WriteLine("setle(a, b) = " + setle(a, b)); setinit(out a, "R", 0, 9); setinit(out b, "R", 9, 100); Console.WriteLine("setdisjoint(a, b) = " + setdisjoint(a, b)); setinit(out a, "R", 0, 99); setinit(out b, "R", 80, 100); setinters(ref a, b); Console.WriteLine("setinters(ref a, b) = " + a); setinit(out a, "R", 0, 9); setinit(out b, "R", 100, 109); setunion(ref a, b); Console.WriteLine("setunion(ref a, b) = " + a); setinit(out a, "R", 0, 99); setinit(out b, "R", 1, 98); setdiff(ref a, b); Console.WriteLine("setdiff(ref a, b) = " + a); setclear(ref a); Console.WriteLine("setclear(a) = " + a); setinit(out b, "R", 0, 9); setcpy(ref a, b); Console.WriteLine("setcpy(a) = " + a); Console.WriteLine("seteq(a, b) = " + seteq(a, b)); Console.WriteLine("setempty(a) = " + setempty(a)); Console.WriteLine("setempty(emptySet) = " + setempty(emptySet)); Console.WriteLine("resetModule ..."); Utils.Modules(Utils.ModuleAction.resetModule); Console.WriteLine("cleanupModule ..."); Utils.Modules(Utils.ModuleAction.cleanupModule); Console.WriteLine("END"); // Console.WriteLine("type [CR] to continue ..."); // Console.ReadLine(); } // Main
} // setincl // exclude x from s //-----------------------------------|---------------------------------------- public static void setexcl(ref Set256 s, ushort x) { checkVal(x); Utils.ClrBit(ref s.ushorts[x / BITSET_BIT], (ushort)(x & BITSET_MASK)); } // setexcl