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
17namespace llvm {
18
19/// \brief Utility for building string tables with deduplicated suffixes.
20class StringTableBuilder {
21  SmallString<256> StringTable;
22  StringMap<size_t> StringIndexMap;
23
24public:
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
51private:
52  bool isFinalized() {
53    return !StringTable.empty();
54  }
55};
56
57} // end llvm namespace
58
59#endif
60