WT_Node LoadNode(BinaryReader Input, WT_Inner parent) { // Console.WriteLine ("xxxxxxxxx LoadNode"); var isInner = Input.ReadBoolean (); if (isInner) { var node = new WT_Inner (parent, false); node.B = GenericIO<Bitmap>.Load (Input); var hasLeft = Input.ReadBoolean (); if (hasLeft) { node.Left = this.LoadNode (Input, node); } var hasRight = Input.ReadBoolean (); if (hasRight) { node.Right = this.LoadNode (Input, node); } return node; } else { // var count = Input.ReadInt32 (); var symbol = Input.ReadInt32 (); // Console.WriteLine ("--leaf> count: {0}, symbol: {1}", count, symbol); //var leaf = new WT_Leaf (parent, symbol, count); var leaf = new WT_Leaf (parent, symbol); this.Alphabet[symbol] = leaf; return leaf; } }
protected void Add(int symbol) { var coderstream = new BitStream32 (); coderstream.Clear (); this.Coder.Encode(coderstream, symbol); var ctx = new BitStreamCtx (0); // this.CoderStream.Seek (0); int numbits = (int)coderstream.CountBits; var node = this.Root; for (int b = 0; b < numbits; b++) { var bitcode = coderstream.Read (ctx); (node.B as FakeBitmap).Write (bitcode); if (bitcode) { if (numbits == b + 1) { if (node.Right == null) { var leaf = new WT_Leaf (node, symbol); // this.Alphabet.Add (leaf); this.Alphabet [symbol] = leaf; node.Right = leaf; // } else { // (node.Right as WT_Leaf).Increment (); } } else { if (node.Right == null) { node.Right = new WT_Inner (node, true); } node = node.Right as WT_Inner; } } else { if (numbits == b + 1) { if (node.Left == null) { var leaf = new WT_Leaf (node, symbol); // this.Alphabet.Add (leaf); this.Alphabet [symbol] = leaf; node.Left = leaf; // } else { // (node.Left as WT_Leaf).Increment (); } } else { if (node.Left == null) { node.Left = new WT_Inner (node, true); } node = node.Left as WT_Inner; } } } }