+ // More succinct solution via StringIterator, see below.
+/* unsigned* maptexts = new unsigned[n+1];
+ // Map text chars to [0..255+numberOfTexts]
+ unsigned count = 0;
+ for (ulong i = 0; i < n; ++i)
+ if (texts[i] == 0)
+ maptexts[i] = ++count; // endmarkers \in [1..numberOfTexts]
+ else {
+ uchar c = (uchar)texts[i];
+ maptexts[i] = (unsigned)c + numberOfTexts;
+ }
+ maptexts[n] = '\0';
+ assert(count == numberOfTexts);
+
+ std::cout << "maptext: ";
+ for (ulong i = 0; i <= n; ++i)
+ std::cout << maptexts[i] << ", ";
+ std::cout << std::endl;*/
+
+ // Mark endmarker positions into bitvector
+ ulong * endmarkers = new ulong[n/W+1];
+ for (ulong i = 0; i < n/W+1; ++i)
+ endmarkers[i] = 0;
+ for (ulong i = 0; i < n; ++i)
+ if (texts[i] == 0)
+ Tools::SetField(endmarkers, 1, i, 1);
+ BitRank* br = new BitRank(endmarkers, n, true);
+ assert(numberOfTexts == br->rank(n-1));
+
+ // Build iterators, FIXME clean up iterator construction.
+ StringIterator itBegin((uchar const *)texts.c_str(), (uchar const *)texts.c_str(), n, numberOfTexts, br);
+ StringIterator itEnd((uchar const *)texts.c_str() + n,(uchar const *)texts.c_str(), n, numberOfTexts, br);