cprover
dstring.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Container for C-Strings
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
11 
12 #ifndef CPROVER_UTIL_DSTRING_H
13 #define CPROVER_UTIL_DSTRING_H
14 
15 #include <iosfwd>
16 #include <string>
17 
18 #include "invariant.h"
19 #include "string_container.h"
20 
35 class dstringt final
36 {
37 public:
38  // this is safe for static objects
39  #ifdef __GNUC__
40  constexpr
41  #endif
42  dstringt():no(0)
43  {
44  }
45 
46  // this is safe for static objects
47  #ifdef __GNUC__
48  constexpr
49  #endif
51  {
52  return dstringt(no);
53  }
54 
55  #if 0
56  // This conversion allows the use of dstrings
57  // in switch ... case statements.
58  constexpr operator int() const { return no; }
59  #endif
60 
61  // this one is not safe for static objects
62  // NOLINTNEXTLINE(runtime/explicit)
63  dstringt(const char *s):no(get_string_container()[s])
64  {
65  }
66 
67  // this one is not safe for static objects
68  // NOLINTNEXTLINE(runtime/explicit)
69  dstringt(const std::string &s):no(get_string_container()[s])
70  {
71  }
72 
73  // access
74 
75  bool empty() const
76  {
77  return no==0; // string 0 is exactly the empty string
78  }
79 
80  char operator[](size_t i) const
81  {
82  return as_string()[i];
83  }
84 
85  // the pointer is guaranteed to be stable
86  const char *c_str() const
87  {
88  return as_string().c_str();
89  }
90 
91  size_t size() const
92  {
93  return as_string().size();
94  }
95 
96  // ordering -- not the same as lexicographical ordering
97 
98  bool operator< (const dstringt &b) const { return no<b.no; }
99 
100  // comparison with same type
101 
102  bool operator==(const dstringt &b) const
103  { return no==b.no; } // really fast equality testing
104 
105  bool operator!=(const dstringt &b) const
106  { return no!=b.no; } // really fast equality testing
107 
108  // comparison with other types
109 
110  bool operator==(const char *b) const { return as_string()==b; }
111  bool operator!=(const char *b) const { return as_string()!=b; }
112 
113  bool operator==(const std::string &b) const { return as_string()==b; }
114  bool operator!=(const std::string &b) const { return as_string()!=b; }
115  bool operator<(const std::string &b) const { return as_string()<b; }
116  bool operator>(const std::string &b) const { return as_string()>b; }
117  bool operator<=(const std::string &b) const { return as_string()<=b; }
118  bool operator>=(const std::string &b) const { return as_string()>=b; }
119 
120  int compare(const dstringt &b) const
121  {
122  if(no==b.no)
123  return 0; // equal
124  return as_string().compare(b.as_string());
125  }
126 
127  // modifying
128 
129  void clear()
130  { no=0; }
131 
132  void swap(dstringt &b)
133  { unsigned t=no; no=b.no; b.no=t; }
134 
136  { no=b.no; return *this; }
137 
138  // output
139 
140  std::ostream &operator<<(std::ostream &out) const;
141 
142  // non-standard
143 
144  unsigned get_no() const
145  {
146  return no;
147  }
148 
149  size_t hash() const
150  {
151  return no;
152  }
153 
154  // iterators for the underlying string
155  std::string::const_iterator begin() const
156  {
157  return as_string().begin();
158  }
159 
160  std::string::const_iterator end() const
161  {
162  return as_string().end();
163  }
164 
165 private:
166  #ifdef __GNUC__
167  constexpr
168  #endif
169  explicit dstringt(unsigned _no):no(_no)
170  {
171  }
172 
173  unsigned no;
174 
175  // the reference returned is guaranteed to be stable
176  const std::string &as_string() const
177  { return get_string_container().get_string(no); }
178 };
179 
180 // the reference returned is guaranteed to be stable
181 inline const std::string &as_string(const dstringt &s)
182 { return get_string_container().get_string(s.get_no()); }
183 
184 // NOLINTNEXTLINE(readability/identifiers)
186 {
187  size_t operator()(const dstringt &s) const { return s.hash(); }
188 };
189 
190 inline size_t hash_string(const dstringt &s)
191 {
192  return s.hash();
193 }
194 
195 inline std::ostream &operator<<(std::ostream &out, const dstringt &a)
196 {
197  return a.operator<<(out);
198 }
199 
200 // NOLINTNEXTLINE [allow specialisation within 'std']
201 namespace std
202 {
204 template <>
205 struct hash<dstringt> // NOLINT(readability/identifiers)
206 {
207  size_t operator()(const dstringt &dstring) const
208  {
209  return dstring.hash();
210  }
211 };
212 }
213 
214 template <>
216 {
217  static std::string diagnostics_as_string(const dstringt &dstring)
218  {
219  return as_string(dstring);
220  }
221 };
222 
223 #endif // CPROVER_UTIL_DSTRING_H
dstringt
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:35
dstringt::dstringt
dstringt(unsigned _no)
Definition: dstring.h:169
dstringt::c_str
const char * c_str() const
Definition: dstring.h:86
dstring_hash::operator()
size_t operator()(const dstringt &s) const
Definition: dstring.h:187
dstringt::operator>=
bool operator>=(const std::string &b) const
Definition: dstring.h:118
dstringt::operator!=
bool operator!=(const char *b) const
Definition: dstring.h:111
operator<<
std::ostream & operator<<(std::ostream &out, const dstringt &a)
Definition: dstring.h:195
string_containert::get_string
const std::string & get_string(size_t no) const
Definition: string_container.h:71
dstringt::operator==
bool operator==(const dstringt &b) const
Definition: dstring.h:102
dstringt::operator<<
std::ostream & operator<<(std::ostream &out) const
Definition: dstring.cpp:16
std::hash< dstringt >::operator()
size_t operator()(const dstringt &dstring) const
Definition: dstring.h:207
string_container.h
dstringt::operator<
bool operator<(const dstringt &b) const
Definition: dstring.h:98
invariant.h
as_string
const std::string & as_string(const dstringt &s)
Definition: dstring.h:181
dstringt::operator==
bool operator==(const char *b) const
Definition: dstring.h:110
dstringt::swap
void swap(dstringt &b)
Definition: dstring.h:132
dstringt::no
unsigned no
Definition: dstring.h:173
dstring_hash
Definition: dstring.h:185
dstringt::dstringt
dstringt(const char *s)
Definition: dstring.h:63
dstringt::empty
bool empty() const
Definition: dstring.h:75
dstringt::compare
int compare(const dstringt &b) const
Definition: dstring.h:120
dstringt::operator!=
bool operator!=(const dstringt &b) const
Definition: dstring.h:105
diagnostics_helpert
Helper to give us some diagnostic in a usable form on assertion failure.
Definition: invariant.h:273
hash_string
size_t hash_string(const dstringt &s)
Definition: dstring.h:190
dstringt::clear
void clear()
Definition: dstring.h:129
dstringt::as_string
const std::string & as_string() const
Definition: dstring.h:176
dstringt::make_from_table_index
static dstringt make_from_table_index(unsigned no)
Definition: dstring.h:50
diagnostics_helpert< dstringt >::diagnostics_as_string
static std::string diagnostics_as_string(const dstringt &dstring)
Definition: dstring.h:217
dstringt::get_no
unsigned get_no() const
Definition: dstring.h:144
dstringt::end
std::string::const_iterator end() const
Definition: dstring.h:160
dstringt::operator!=
bool operator!=(const std::string &b) const
Definition: dstring.h:114
dstringt::operator<
bool operator<(const std::string &b) const
Definition: dstring.h:115
dstringt::operator==
bool operator==(const std::string &b) const
Definition: dstring.h:113
dstringt::dstringt
dstringt(const std::string &s)
Definition: dstring.h:69
dstringt::operator=
dstringt & operator=(const dstringt &b)
Definition: dstring.h:135
dstringt::begin
std::string::const_iterator begin() const
Definition: dstring.h:155
dstringt::hash
size_t hash() const
Definition: dstring.h:149
dstringt::operator>
bool operator>(const std::string &b) const
Definition: dstring.h:116
dstringt::dstringt
dstringt()
Definition: dstring.h:42
dstringt::size
size_t size() const
Definition: dstring.h:91
get_string_container
string_containert & get_string_container()
Get a reference to the global string container.
Definition: string_container.h:93
dstringt::operator[]
char operator[](size_t i) const
Definition: dstring.h:80
dstringt::operator<=
bool operator<=(const std::string &b) const
Definition: dstring.h:117