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 WaveletLeaf (node, symbol); // this.Alphabet.Add (leaf); this.Alphabet [symbol] = leaf; node.Right = leaf; } else { (node.Right as WaveletLeaf).Increment (); } } else { if (node.Right == null) { node.Right = new WaveletInner (node, true); } node = node.Right as WaveletInner; } } else { if (numbits == b + 1) { if (node.Left == null) { var leaf = new WaveletLeaf (node, symbol); // this.Alphabet.Add (leaf); this.Alphabet [symbol] = leaf; node.Left = leaf; } else { (node.Left as WaveletLeaf).Increment (); } } else { if (node.Left == null) { node.Left = new WaveletInner (node, true); } node = node.Left as WaveletInner; } } } }