internal SSearchTree(T n, SSearchTree <T>?lf, SSearchTree <T>?rg)
     : base(1 + lf?.Length ?? 0 + rg?.Length ?? 0)
 {
     node  = n;
     left  = lf;
     right = rg;
 }
        public void deepCopyAndFindTest()
        {
            tml.setTestCaseName("DeepCopyAndFindIn100");
            SSearchTree <Payload> tree = createTreeOfSize(100);

            tml.setInitialTimeAndMemory();
            SSearchTree <Payload> treeCpy = tree;

            treeCpy.Contains(new Payload("Load 25"));
            tml.logTimeAndMemoryUsage(25);
            ///////////
            tree = createTreeOfSize(100);
            this.callTheGC();
            tml.setInitialTimeAndMemory();
            treeCpy = tree;
            treeCpy.Contains(new Payload("Load 50"));
            tml.logTimeAndMemoryUsage(50);
            ///////////////
            tree = createTreeOfSize(100);
            this.callTheGC();
            tml.setInitialTimeAndMemory();
            treeCpy = tree;
            treeCpy.Contains(new Payload("Load 75"));
            tml.logTimeAndMemoryUsage(75);
            //////////////
            tree = createTreeOfSize(100);
            this.callTheGC();
            tml.setInitialTimeAndMemory();
            treeCpy = tree;
            treeCpy.Contains(new Payload("Load 99"));
            tml.logTimeAndMemoryUsage(100);
        }
        private SSearchTree <Payload> createTreeOfSize(int numberOfElements)
        {
            SSearchTree <Payload> tree = SSearchTree <Payload> .New(new Payload("Load 0"));


            for (int i = 1; i < numberOfElements; i++)
            {
                tree += new Payload("Load " + i);
            }

            return(tree);
        }
        private void reusableSTreeTestCase(String caseName, int numberOfElements)
        {
            tml.setTestCaseName(caseName);

            SSearchTree <Payload> tree = SSearchTree <Payload> .New(new Payload("Load 0"));


            for (int i = 1; i < numberOfElements; i++)
            {
                tree += new Payload("Load " + i);
                tml.logTimeAndMemoryUsage(i + 1);
            }
        }
 internal SSearchTreeBookmark(SSearchTree <T> s, bool doLeft,
                              SList <SSearchTree <T> >?stk = null,
                              int p = 0) : base(p)
 {
     if (stk == null)
     {
         stk = SList <SSearchTree <T> > .Empty;
     }
     for (; doLeft && s.left != SSearchTree <T> .Empty;
          s = s.left ?? throw new System.Exception("PE22"))
     {
         stk = stk + (s, 0);
     }
     _s = s; _stk = stk;
 }
        public void FindElementIn100()
        {
            tml.setTestCaseName("Find elements in 100");

            SSearchTree <Payload> tree = createTreeOfSize(100);

            Payload toBeFound_25  = new Payload("Load 25");
            Payload toBeFound_50  = new Payload("Load 50");
            Payload toBeFound_75  = new Payload("Load 75");
            Payload toBeFound_100 = new Payload("Load 99");

            tml.setInitialTimeAndMemory();
            tree.Contains(toBeFound_25);
            tml.logTimeAndMemoryUsage(25);
            tree.Contains(toBeFound_50);
            tml.logTimeAndMemoryUsage(50);
            tree.Contains(toBeFound_75);
            tml.logTimeAndMemoryUsage(75);
            tree.Contains(toBeFound_100);
            tml.logTimeAndMemoryUsage(100);
        }
 SSearchTree() : base(0)
 {
     node = default(T); left = null; right = null;
 }
        static void Main(string[] args)
        {
            // Tests for SList (unordered list)
            var sl = SList <string> .New("Red", "Blue", "Green");

            sl = sl.InsertAt("Yellow", 0);
            var s2 = sl;

            sl = sl.RemoveAt(3);
            sl = sl.UpdateAt("Pink", 1);
            sl = sl.InsertAt("Orange", 2);
            Check <string>(sl.ToArray(), "Yellow", "Pink", "Orange", "Blue");
            Check <string>(s2.ToArray(), "Yellow", "Red", "Blue", "Green");
            Console.WriteLine("SList done");
            // Tests for SArray
            var sa = new SArray <string>("Red", "Blue", "Green");

            sa = sa.InsertAt(0, "Yellow");
            sa = sa.RemoveAt(3);
            var sb = sa;

            sa = sa.InsertAt(2, "Orange", "Violet");
            Check(sa.ToArray(), "Yellow", "Red", "Orange", "Violet", "Blue");
            Check(sb.ToArray(), "Yellow", "Red", "Blue");
            Console.WriteLine("SArray done");
            // Tests for SSearchTree<string>
            var ss = SSearchTree <string> .New("InfraRed", "Red", "Orange", "Yellow", "Green", "Blue", "Violet");

            Check(ss.ToArray(), "Blue", "Green", "InfraRed", "Orange", "Red", "Violet", "Yellow");
            var si = SSearchTree <int> .New(56, 22, 24, 31, 23);

            Check(si.ToArray(), 22, 23, 24, 31, 56);
            Console.WriteLine("SSearchTree done");
            // Tests for SDict
            var sd = SDict <string, string> .Empty;

            sd = sd.Add("Y", "Yellow");
            sd = sd.Add("G", "Green");
            sd = sd.Add("B", "Blue");
            sd = sd.Remove("G");
            var sr = new string[sd.Count];
            var j  = 0;

            for (var b = sd.First(); b != null; b = b.Next())
            {
                sr[j++] = b.Value.key + ": " + b.Value.val;
            }
            Check(sr, "B: Blue", "Y: Yellow");
            Console.WriteLine("SDict done");
            // Tests for SMTree
            var ti = SList <TreeInfo> .Empty;

            ti = ti.InsertAt(new TreeInfo("0", 'D', 'D'), 0); // onDuplicate must be Disallow on all except last entry
            ti = ti.InsertAt(new TreeInfo("1", 'A', 'A'), 1);
            var sm   = new SMTree(ti);
            var test = new string[] { "BALTIM", "ANNU", "A", "ANNO", "BALTIC", "BRAIL" };

            for (var i = 0; i < test.Length; i++)
            {
                sm = Add(sm, test[i], i);
            }
            var sorted = new string[test.Length];

            j = 0;
            for (var b = sm.First(); b != null; b = b.Next())
            {
                sorted[j++] = test[((MTreeBookmark)b).value()];
            }
            // we are only sorting on the first two letters!
            // Check() we should offer some alternatives here
            Check(sorted, "A", "ANNU", "ANNO", "BALTIM", "BALTIC", "BRAIL");
            Console.WriteLine("SMTree done");
            File.Delete("strong");
            File.Create("strong").Close();
            var d  = SDatabase.Open("strong");
            var tr = new STransaction(d);

            tr = new STransaction(tr, new SString("This is Strong"));
            tr = new STransaction(tr, new STable(tr, "tbl"));
            var c = tr.Commit();

            d.Close();
            d = SDatabase.Open("strong");
            Console.WriteLine(d.objects.First().Value.val.ToString());
            Console.ReadKey();
        }