2008-01-02 H.J. Lu <hongjiu.lu@intel.com>
[deliverable/binutils-gdb.git] / gold / strtab.h
CommitLineData
14bfc3f5
ILT
1// strtab.h -- manage an ELF string table for gold -*- C++ -*-
2
3#ifndef GOLD_STRTAB_H
4#define GOLD_STRTAB_H
5
6#include <cstring>
7#include <string>
8
9namespace gold
10{
11
12// This class holds an ELF string table. We keep a reference count
13// for each string, which we use to determine which strings are
14// actually required at the end. When all operations are done, the
15// string table is finalized, which sets the offsets to use for each
16// string.
17
18class Strtab
19{
20 public:
21 Strtab();
22
23 ~Strtab();
24
25 Strtab_ref* add(const char*);
26
27 Strtab_ref* add(const std::string& s)
28 { return this->add(s.c_str()); }
29
30 private:
31 Strtab(const Strtab&);
32 Strtab& operator=(const Strtab&);
33
34 struct strtab_hash
35 {
36 std::size_t
37 operator()(const char*p);
38 };
39
40 struct strtab_eq
41 {
42 bool
43 operator()(const char* p1, const char* p2)
44 { return strcmp(p1, p2) == 0; }
45 };
46
47 Unordered_map<const char*, Strtab_ref*, strtab_hash, strtab_eq,
48 std::allocator<std::pair<const char* const, Strtab_ref*> >,
49 true> strings_;
50};
51
52// Users of Strtab work with pointers to Strtab_ref structures. These
53// are allocated via new and should be deleted if the string is no
54// longer needed.
55
56class Strtab_ref
57{
58 public:
59 ~Strtab_ref();
60
61 const char*
62 str() const;
63
64 private:
65 Strtab_ref(const Strtab_ref&);
66 Strtab_ref& operator=(const Strtab_ref&);
67
68 int refs_;
69};
70
71} // End namespace gold.
72
73#endif // !defined(GOLD_STRTAB_H)
This page took 0.082509 seconds and 4 git commands to generate.