int32 WriterImplBase::WriteCachedStrings(const StringCache& cache, uint32 minUsageCount) { // create an array of the cached strings int32 count = cache.CountElements(); CachedString** cachedStrings = new CachedString*[count]; ArrayDeleter<CachedString*> cachedStringsDeleter(cachedStrings); int32 index = 0; for (CachedStringTable::Iterator it = cache.GetIterator(); CachedString* string = it.Next();) { cachedStrings[index++] = string; } // sort it by descending usage count std::sort(cachedStrings, cachedStrings + count, CachedStringUsageGreater()); // assign the indices and write entries to disk int32 stringsWritten = 0; for (int32 i = 0; i < count; i++) { CachedString* cachedString = cachedStrings[i]; // empty strings must be stored inline, as they can't be distinguished // from the end-marker! if (strlen(cachedString->string) == 0) continue; // strings that are used only once are better stored inline if (cachedString->usageCount < minUsageCount) break; WriteString(cachedString->string); cachedString->index = stringsWritten++; } // write a terminating 0 byte Write<uint8>(0); return stringsWritten; }
int32 PackageWriter::_WriteCachedStrings() { // create an array of the cached strings int32 count = fCachedStrings->CountElements(); CachedString** cachedStrings = new CachedString*[count]; ArrayDeleter<CachedString*> cachedStringsDeleter(cachedStrings); int32 index = 0; for (CachedStringTable::Iterator it = fCachedStrings->GetIterator(); CachedString* string = it.Next();) { cachedStrings[index++] = string; } // sort it by descending usage count std::sort(cachedStrings, cachedStrings + count, CachedStringUsageGreater()); // assign the indices and write entries to disk int32 stringsWritten = 0; for (int32 i = 0; i < count; i++) { CachedString* cachedString = cachedStrings[i]; // strings that are used only once are better stored inline if (cachedString->usageCount < 2) break; cachedString->index = i; _WriteString(cachedString->string); stringsWritten++; } // write a terminating 0 byte _Write<uint8>(0); return stringsWritten; }