OGLplus (0.45.0) a C++ wrapper for OpenGL

string.hpp
Go to the documentation of this file.
1 
12 #pragma once
13 #ifndef OGLPLUS_STRING_1107121519_HPP
14 #define OGLPLUS_STRING_1107121519_HPP
15 
16 #include <oglplus/config.hpp>
17 
18 #include <string>
19 #include <cassert>
20 
21 #if OGLPLUS_LAZY_STR_LIT
22 #include <cstring>
23 #endif
24 
25 namespace oglplus {
26 
33 
37 bool ValidString(const GLchar* begin, const GLchar* end);
38 
40 
43 typedef ::std::basic_string<GLchar> String;
44 
45 const String& EmptyString(void)
46 OGLPLUS_NOEXCEPT(true);
47 
48 class StrLit;
49 
50 namespace aux {
51 
52 // helper class used for implementation of concatenation
53 template <typename Left, typename Right>
54 class StrLitCat
55 {
56 private:
57  Left _left;
58  Right _right;
59 public:
60  StrLitCat(Left left, Right right)
61  : _left(left)
62  , _right(right)
63  { }
64 
65  bool empty(void) const
66  {
67  return _left.empty() && _right.empty();
68  }
69 
70  std::size_t size(void) const
71  {
72  return _left.size() + _right.size();
73  }
74 
75  void append_to(String& dest) const
76  {
77  _left.append_to(dest);
78  _right.append_to(dest);
79  }
80 
81  String str(void) const
82  {
83  String result;
84  result.reserve(this->size()+1);
85  this->append_to(result);
86  return result;
87  }
88 
89 #if !OGLPLUS_NO_EXPLICIT_CONVERSION_OPERATORS
90  inline explicit operator String(void) const
91 #else
92  inline operator String(void) const
93 #endif
94  {
95  return str();
96  }
97 };
98 
99 } // namespace aux
100 
102 
110 class StrLit
111 {
112 private:
113  const GLchar* _lit;
114 #if !OGLPLUS_LAZY_STR_LIT
115  std::size_t _size;
116 #endif
117 
118  void _check(void) const
119  {
120  assert(ValidString(begin(), end()));
121  }
122 public:
124  StrLit(void)
125  : _lit("")
127  , _size(0)
128 #endif
129  { }
130 
131 #if OGLPLUS_DOCUMENTATION_ONLY
132  StrLit(std::nullptr_t);
134 #elif !OGLPLUS_NO_NULLPTR
135  StrLit(std::nullptr_t)
136 #else
137  StrLit(int)
138 #endif
139  : _lit("")
140 #if !OGLPLUS_LAZY_STR_LIT
141  , _size(0)
142 #endif
143  { }
144 
145 #if OGLPLUS_DOCUMENTATION_ONLY
146 
152  explicit StrLit(const GLchar* literal);
153 #elif !OGLPLUS_LAZY_STR_LIT
154  template <std::size_t N>
155  explicit StrLit(const GLchar (&lit)[N])
156  : _lit(lit)
157  , _size(N-1)
158  { _check(); }
159 #else
160  explicit StrLit(const GLchar* lit)
161  : _lit(lit)
162  { _check(); }
163 #endif
164 
166 
171  explicit StrLit(const GLchar* lit, std::size_t lit_size)
172  : _lit(lit)
174  , _size(lit_size)
175 #endif
176  {
177  OGLPLUS_FAKE_USE(lit_size);
178  _check();
179  }
180 
182  String str(void) const
183  {
184 #if !OGLPLUS_LAZY_STR_LIT
185  return String(_lit, _lit+_size);
186 #else
187  return String(_lit);
188 #endif
189  }
190 
191  void append_to(String& dest) const
192  {
193 #if !OGLPLUS_LAZY_STR_LIT
194  dest.append(_lit, _lit+_size);
195 #else
196  dest.append(_lit);
197 #endif
198  }
199 
201  const GLchar* c_str(void) const
202  {
203  return _lit;
204  }
205 
207  std::size_t size(void) const
208  {
209 #if !OGLPLUS_LAZY_STR_LIT
210  return _size;
211 #else
212  return std::strlen(_lit);
213 #endif
214  }
215 
217  bool empty(void) const
218  {
219 #if !OGLPLUS_LAZY_STR_LIT
220  return _size == 0;
221 #else
222  return _lit[0] == '\0';
223 #endif
224  }
225 
227  typedef const GLchar* iterator;
228 
230  typedef const GLchar* const_iterator;
231 
233  const_iterator begin(void) const
234  {
235  return c_str();
236  }
237 
239  const_iterator end(void) const
240  {
241  return c_str()+size();
242  }
243 
245  friend const_iterator begin(const StrLit& strlit)
246  {
247  return strlit.begin();
248  }
249 
251  friend const_iterator end(const StrLit& strlit)
252  {
253  return strlit.end();
254  }
255 
257  operator bool (void) const
258  {
259  return !empty();
260  }
261 
263  bool operator ! (void) const
264  {
265  return empty();
266  }
267 
268 #if OGLPLUS_DOCUMENTATION_ONLY
269 
272  friend Unspecified operator + (StrLit a, StrLit b);
273 #endif
274 
275  friend aux::StrLitCat<StrLit, StrLit> operator + (StrLit a, StrLit b)
276  {
277  return aux::StrLitCat<StrLit, StrLit>(a, b);
278  }
279 
280  template <typename Left, typename Right>
281  friend aux::StrLitCat<aux::StrLitCat<Left, Right>, StrLit>
282  operator + (aux::StrLitCat<Left, Right> a, StrLit b)
283  {
284  return aux::StrLitCat<aux::StrLitCat<Left, Right>,StrLit>(a, b);
285  }
286 };
287 
288 } // namespace oglplus
289 
290 #if !OGLPLUS_LINK_LIBRARY || defined(OGLPLUS_IMPLEMENTING_LIBRARY)
291 #include <oglplus/string.ipp>
292 #endif
293 
294 #endif // include guard

Copyright © 2010-2014 Matúš Chochlík, University of Žilina, Žilina, Slovakia.
<matus.chochlik -at- fri.uniza.sk>
<chochlik -at -gmail.com>
Documentation generated on Wed Apr 30 2014 by Doxygen (version 1.8.4).