/// <summary> /// Fills in stringIndexMap with data from stringIndex and write to stringWriter. /// Releases stringIndex as the stringTable is sealed after this point. /// </summary> private void SerializeStringHeap() { // Sort by suffix and remove stringIndex var sorted = new List <KeyValuePair <string, StringIdx> >(_strings); sorted.Sort(new SuffixSort()); _strings = null; _stringWriter = new BlobBuilder(1024); // Create VirtIdx to Idx map and add entry for empty string _stringIndexToHeapPositionMap = new int[sorted.Count + 1]; _stringIndexToHeapPositionMap[0] = 0; _stringWriter.WriteByte(0); // Find strings that can be folded string prev = string.Empty; foreach (KeyValuePair <string, StringIdx> entry in sorted) { int position = _stringWriter.Position; // It is important to use ordinal comparison otherwise we'll use the current culture! if (prev.EndsWith(entry.Key, StringComparison.Ordinal)) { // Map over the tail of prev string. Watch for null-terminator of prev string. _stringIndexToHeapPositionMap[entry.Value.MapIndex] = position - (s_utf8Encoding.GetByteCount(entry.Key) + 1); } else { _stringIndexToHeapPositionMap[entry.Value.MapIndex] = position; _stringWriter.WriteString(entry.Key, s_utf8Encoding); _stringWriter.WriteByte(0); } prev = entry.Key; } }