WaveletNode LoadNode(BinaryReader Input, WaveletInner parent) { // Console.WriteLine ("xxxxxxxxx LoadNode"); var isInner = Input.ReadBoolean (); if (isInner) { var node = new WaveletInner (parent, false); node.B = RankSelectGenericIO.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 WaveletLeaf (parent, symbol, count); 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 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; } } } }