1 //===-- StringTableBuilder.h - String table building utility ------*- C++ -*-=// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLVM_MC_STRINGTABLE_BUILDER_H 11 #define LLVM_MC_STRINGTABLE_BUILDER_H 12 13 #include "llvm/ADT/SmallString.h" 14 #include "llvm/ADT/StringMap.h" 15 #include <cassert> 16 17 namespace llvm { 18 19 /// \brief Utility for building string tables with deduplicated suffixes. 20 class StringTableBuilder { 21 SmallString<256> StringTable; 22 StringMap<size_t> StringIndexMap; 23 24 public: 25 /// \brief Add a string to the builder. Returns a StringRef to the internal 26 /// copy of s. Can only be used before the table is finalized. 27 StringRef add(StringRef s) { 28 assert(!isFinalized()); 29 return StringIndexMap.GetOrCreateValue(s, 0).getKey(); 30 } 31 32 /// \brief Analyze the strings and build the final table. No more strings can 33 /// be added after this point. 34 void finalize(); 35 36 /// \brief Retrieve the string table data. Can only be used after the table 37 /// is finalized. 38 StringRef data() { 39 assert(isFinalized()); 40 return StringTable; 41 } 42 43 /// \brief Get the offest of a string in the string table. Can only be used 44 /// after the table is finalized. 45 size_t getOffset(StringRef s) { 46 assert(isFinalized()); 47 assert(StringIndexMap.count(s) && "String is not in table!"); 48 return StringIndexMap[s]; 49 } 50 51 private: 52 bool isFinalized() { 53 return !StringTable.empty(); 54 } 55 }; 56 57 } // end llvm namespace 58 59 #endif 60