JASL  [1.2.0]-2018-09-11
All Classes Files Typedefs Macros Pages
jasl_string_view_bridge.hpp
1 // JASL: For more information see https://github.com/matepek/jasl
2 //
3 // Copyright (c) 2018 Mate Pek
4 //
5 // This code is licensed under the MIT License (MIT).
6 
7 // from https://github.com/llvm-mirror/libcxx/blob/master/include/string_view
8 
9 #pragma once
10 
11 #include <iterator>
12 
13 namespace jasl {
14 namespace inner {
15 
16 template <typename string_viewT>
18  public:
19  typedef string_viewT bridge_to_type;
20  typedef typename string_viewT::traits_type traits_type;
21  typedef typename string_viewT::value_type value_type;
22  typedef typename string_viewT::pointer pointer;
23  typedef typename string_viewT::const_pointer const_pointer;
24  typedef typename string_viewT::reference reference;
25  typedef typename string_viewT::const_reference const_reference;
26  typedef typename string_viewT::const_iterator const_iterator;
27  typedef typename string_viewT::iterator iterator;
28  typedef typename string_viewT::const_reverse_iterator const_reverse_iterator;
29  typedef typename string_viewT::reverse_iterator reverse_iterator;
30  typedef typename string_viewT::size_type size_type;
31  typedef typename string_viewT::difference_type difference_type;
32  static constexpr size_type npos = string_viewT::npos;
33 
34  protected:
35  constexpr string_view_bridge() noexcept(
36  std::is_nothrow_constructible<string_viewT>::value) {}
37  constexpr explicit string_view_bridge(string_viewT s) noexcept(
38  std::is_nothrow_constructible<string_viewT, string_viewT>::value)
39  : _sv(s) {}
40  constexpr string_view_bridge(const string_view_bridge& s) noexcept(
41  std::is_nothrow_copy_constructible<string_viewT>::value) = default;
42  constexpr explicit string_view_bridge(const value_type* str) noexcept(
43  std::is_nothrow_constructible<string_viewT, const value_type*>::value)
44  : _sv(str) {}
45  constexpr string_view_bridge(const value_type* str, size_type len) noexcept(
46  std::is_nothrow_constructible<string_viewT,
47  const value_type*,
48  size_type>::value)
49  : _sv(str, len) {}
50 
51  string_view_bridge& operator=(const string_view_bridge&) noexcept(
52  std::is_nothrow_copy_assignable<string_viewT>::value) = default;
53 
54  JASL_CONSTEXPR_CXX14 void swap(string_view_bridge& s) noexcept(
55  noexcept(std::declval<string_viewT>().swap(s._sv))) {
56  _sv.swap(s._sv);
57  }
58 
59  constexpr static bool is_nothrow_settable =
60  std::is_nothrow_assignable<string_viewT, string_viewT>::value &&
61  std::is_nothrow_constructible<string_viewT,
62  const value_type*,
63  size_type>::value;
64 
65  JASL_CONSTEXPR_CXX14 void set(const value_type* str,
66  size_type len) noexcept(is_nothrow_settable) {
67  _sv = string_viewT(str, len);
68  }
69 
70  public:
71  operator string_viewT() const noexcept { return _sv; }
72 
73  public:
74  constexpr const_iterator begin() const
75  noexcept(noexcept(std::declval<string_viewT>().begin())) {
76  return _sv.begin();
77  }
78  constexpr const_iterator end() const
79  noexcept(noexcept(std::declval<string_viewT>().end())) {
80  return _sv.end();
81  }
82  constexpr const_iterator cbegin() const
83  noexcept(noexcept(std::declval<string_viewT>().cbegin())) {
84  return _sv.cbegin();
85  }
86  constexpr const_iterator cend() const
87  noexcept(noexcept(std::declval<string_viewT>().cend())) {
88  return _sv.cend();
89  }
90  const_reverse_iterator rbegin() const
91  noexcept(noexcept(std::declval<string_viewT>().rbegin())) {
92  return _sv.rbegin();
93  }
94  const_reverse_iterator rend() const
95  noexcept(noexcept(std::declval<string_viewT>().rend())) {
96  return _sv.rend();
97  }
98  const_reverse_iterator crbegin() const
99  noexcept(noexcept(std::declval<string_viewT>().crbegin())) {
100  return _sv.crbegin();
101  }
102  const_reverse_iterator crend() const
103  noexcept(noexcept(std::declval<string_viewT>().crend())) {
104  return _sv.crend();
105  }
106 
107  constexpr size_type size() const
108  noexcept(noexcept(std::declval<string_viewT>().size())) {
109  return _sv.size();
110  }
111  constexpr size_type length() const
112  noexcept(noexcept(std::declval<string_viewT>().length())) {
113  return _sv.length();
114  }
115  constexpr size_type max_size() const
116  noexcept(noexcept(std::declval<string_viewT>().max_size())) {
117  return _sv.max_size();
118  }
119  constexpr bool empty() const
120  noexcept(noexcept(std::declval<string_viewT>().empty())) {
121  return _sv.empty();
122  }
123 
124  constexpr const_reference operator[](size_type pos) const
125  noexcept(noexcept(std::declval<string_viewT>()[pos])) {
126  return _sv[pos];
127  }
128  constexpr const_reference at(size_type pos) const
129  noexcept(noexcept(std::declval<string_viewT>().at(pos))) {
130  return _sv.at(pos);
131  }
132  constexpr const_reference front() const
133  noexcept(noexcept(std::declval<string_viewT>().front())) {
134  return _sv.front();
135  }
136  constexpr const_reference back() const
137  noexcept(noexcept(std::declval<string_viewT>().back())) {
138  return _sv.back();
139  }
140  constexpr const_pointer data() const
141  noexcept(noexcept(std::declval<string_viewT>().data())) {
142  return _sv.data();
143  }
144 
145  JASL_CONSTEXPR_CXX14 void remove_prefix(size_type n) noexcept(
146  noexcept(std::declval<string_viewT>().remove_prefix(n))) {
147  _sv.remove_prefix(n);
148  }
149  JASL_CONSTEXPR_CXX14 void remove_suffix(size_type n) noexcept(
150  noexcept(std::declval<string_viewT>().remove_suffix(n))) {
151  _sv.remove_suffix(n);
152  }
153 
154  size_type copy(value_type* s, size_type n) const
155  noexcept(noexcept(std::declval<string_viewT>().copy(s, n))) {
156  return _sv.copy(s, n);
157  }
158  size_type copy(value_type* s, size_type n, size_type pos) const
159  noexcept(noexcept(std::declval<string_viewT>().copy(s, n, pos))) {
160  return _sv.copy(s, n, pos);
161  }
162 
163  constexpr string_view_bridge substr(size_type pos) const
164  noexcept(noexcept(std::declval<string_viewT>().substr(pos)) &&
165  std::is_nothrow_copy_constructible<string_viewT>::value &&
166  std::is_nothrow_copy_constructible<string_view_bridge>::value) {
167  return string_view_bridge(string_viewT(_sv.substr(pos)));
168  }
169  constexpr string_view_bridge substr(size_type pos, size_type n) const
170  noexcept(noexcept(std::declval<string_viewT>().substr(pos, n)) &&
171  std::is_nothrow_copy_constructible<string_viewT>::value &&
172  std::is_nothrow_copy_constructible<string_view_bridge>::value) {
173  return string_view_bridge(string_viewT(_sv.substr(pos, n)));
174  }
175  constexpr int compare(string_view_bridge s) const
176  noexcept(noexcept(std::declval<string_viewT>().compare(s._sv))) {
177  return _sv.compare(s._sv);
178  }
179  constexpr int compare(size_type pos1,
180  size_type n1,
181  string_view_bridge s) const
182  noexcept(
183  noexcept(std::declval<string_viewT>().compare(pos1, n1, s._sv))) {
184  return _sv.compare(pos1, n1, s._sv);
185  }
186  constexpr int compare(size_type pos1,
187  size_type n1,
189  size_type pos2,
190  size_type n2) const
191  noexcept(noexcept(
192  std::declval<string_viewT>().compare(pos1, n1, s._sv, pos2, n2))) {
193  return _sv.compare(pos1, n1, s._sv, pos2, n2);
194  }
195  constexpr int compare(const value_type* s) const
196  noexcept(noexcept(std::declval<string_viewT>().compare(s))) {
197  return _sv.compare(s);
198  }
199  constexpr int compare(size_type pos1, size_type n1, const value_type* s) const
200  noexcept(noexcept(std::declval<string_viewT>().compare(pos1, n1, s))) {
201  return _sv.compare(pos1, n1, s);
202  }
203  constexpr int compare(size_type pos1,
204  size_type n1,
205  const value_type* s,
206  size_type n2) const
207  noexcept(
208  noexcept(std::declval<string_viewT>().compare(pos1, n1, s, n2))) {
209  return _sv.compare(pos1, n1, s, n2);
210  }
211  constexpr size_type find(string_view_bridge s) const
212  noexcept(noexcept(std::declval<string_viewT>().find(s._sv))) {
213  return _sv.find(s._sv);
214  }
215  constexpr size_type find(string_view_bridge s, size_type pos) const
216  noexcept(noexcept(std::declval<string_viewT>().find(s._sv, pos))) {
217  return _sv.find(s._sv, pos);
218  }
219  constexpr size_type find(value_type c) const
220  noexcept(noexcept(std::declval<string_viewT>().find(c))) {
221  return _sv.find(c);
222  }
223  constexpr size_type find(value_type c, size_type pos) const
224  noexcept(noexcept(std::declval<string_viewT>().find(c, pos))) {
225  return _sv.find(c, pos);
226  }
227  constexpr size_type find(const value_type* s,
228  size_type pos,
229  size_type n) const
230  noexcept(noexcept(std::declval<string_viewT>().find(s, pos, n))) {
231  return _sv.find(s, pos, n);
232  }
233  constexpr size_type find(const value_type* s) const
234  noexcept(noexcept(std::declval<string_viewT>().find(s))) {
235  return _sv.find(s);
236  }
237  constexpr size_type find(const value_type* s, size_type pos) const
238  noexcept(noexcept(std::declval<string_viewT>().find(s, pos))) {
239  return _sv.find(s, pos);
240  }
241  constexpr size_type rfind(string_view_bridge s) const
242  noexcept(noexcept(std::declval<string_viewT>().rfind(s._sv))) {
243  return _sv.rfind(s._sv);
244  }
245  constexpr size_type rfind(string_view_bridge s, size_type pos) const
246  noexcept(noexcept(std::declval<string_viewT>().rfind(s._sv, pos))) {
247  return _sv.rfind(s._sv, pos);
248  }
249  constexpr size_type rfind(value_type c) const
250  noexcept(noexcept(std::declval<string_viewT>().rfind(c))) {
251  return _sv.rfind(c);
252  }
253  constexpr size_type rfind(value_type c, size_type pos) const
254  noexcept(noexcept(std::declval<string_viewT>().rfind(c, pos))) {
255  return _sv.rfind(c, pos);
256  }
257  constexpr size_type rfind(const value_type* s,
258  size_type pos,
259  size_type n) const
260  noexcept(noexcept(std::declval<string_viewT>().rfind(s, pos, n))) {
261  return _sv.rfind(s, pos, n);
262  }
263  constexpr size_type rfind(const value_type* s) const
264  noexcept(noexcept(std::declval<string_viewT>().rfind(s))) {
265  return _sv.rfind(s);
266  }
267  constexpr size_type rfind(const value_type* s, size_type pos) const
268  noexcept(noexcept(std::declval<string_viewT>().rfind(s, pos))) {
269  return _sv.rfind(s, pos);
270  }
271  constexpr size_type find_first_of(string_view_bridge s) const
272  noexcept(noexcept(std::declval<string_viewT>().find_first_of(s._sv))) {
273  return _sv.find_first_of(s._sv);
274  }
275  constexpr size_type find_first_of(string_view_bridge s, size_type pos) const
276  noexcept(noexcept(std::declval<string_viewT>().find_first_of(s._sv,
277  pos))) {
278  return _sv.find_first_of(s._sv, pos);
279  }
280  constexpr size_type find_first_of(value_type c) const
281  noexcept(noexcept(std::declval<string_viewT>().find_first_of(c))) {
282  return _sv.find_first_of(c);
283  }
284  constexpr size_type find_first_of(value_type c, size_type pos) const
285  noexcept(noexcept(std::declval<string_viewT>().find_first_of(c, pos))) {
286  return _sv.find_first_of(c, pos);
287  }
288  constexpr size_type find_first_of(const value_type* s,
289  size_type pos,
290  size_type n) const
291  noexcept(
292  noexcept(std::declval<string_viewT>().find_first_of(s, pos, n))) {
293  return _sv.find_first_of(s, pos, n);
294  }
295  constexpr size_type find_first_of(const value_type* s) const
296  noexcept(noexcept(std::declval<string_viewT>().find_first_of(s))) {
297  return _sv.find_first_of(s);
298  }
299  constexpr size_type find_first_of(const value_type* s, size_type pos) const
300  noexcept(noexcept(std::declval<string_viewT>().find_first_of(s, pos))) {
301  return _sv.find_first_of(s, pos);
302  }
303  constexpr size_type find_last_of(string_view_bridge s) const
304  noexcept(noexcept(std::declval<string_viewT>().find_last_of(s._sv))) {
305  return _sv.find_last_of(s._sv);
306  }
307  constexpr size_type find_last_of(string_view_bridge s, size_type pos) const
308  noexcept(noexcept(std::declval<string_viewT>().find_last_of(s._sv,
309  pos))) {
310  return _sv.find_last_of(s._sv, pos);
311  }
312  constexpr size_type find_last_of(value_type c) const
313  noexcept(noexcept(std::declval<string_viewT>().find_last_of(c))) {
314  return _sv.find_last_of(c);
315  }
316  constexpr size_type find_last_of(value_type c, size_type pos) const
317  noexcept(noexcept(std::declval<string_viewT>().find_last_of(c, pos))) {
318  return _sv.find_last_of(c, pos);
319  }
320  constexpr size_type find_last_of(const value_type* s,
321  size_type pos,
322  size_type n) const
323  noexcept(noexcept(std::declval<string_viewT>().find_last_of(s, pos, n))) {
324  return _sv.find_last_of(s, pos, n);
325  }
326  constexpr size_type find_last_of(const value_type* s) const
327  noexcept(noexcept(std::declval<string_viewT>().find_last_of(s))) {
328  return _sv.find_last_of(s);
329  }
330  constexpr size_type find_last_of(const value_type* s, size_type pos) const
331  noexcept(noexcept(std::declval<string_viewT>().find_last_of(s, pos))) {
332  return _sv.find_last_of(s, pos);
333  }
334  constexpr size_type find_first_not_of(string_view_bridge s) const noexcept(
335  noexcept(std::declval<string_viewT>().find_first_not_of(s._sv))) {
336  return _sv.find_first_not_of(s._sv);
337  }
338  constexpr size_type find_first_not_of(string_view_bridge s,
339  size_type pos) const
340  noexcept(noexcept(std::declval<string_viewT>().find_first_not_of(s._sv,
341  pos))) {
342  return _sv.find_first_not_of(s._sv, pos);
343  }
344  constexpr size_type find_first_not_of(value_type c) const
345  noexcept(noexcept(std::declval<string_viewT>().find_first_not_of(c))) {
346  return _sv.find_first_not_of(c);
347  }
348  constexpr size_type find_first_not_of(value_type c, size_type pos) const
349  noexcept(noexcept(std::declval<string_viewT>().find_first_not_of(c,
350  pos))) {
351  return _sv.find_first_not_of(c, pos);
352  }
353  constexpr size_type find_first_not_of(const value_type* s,
354  size_type pos,
355  size_type n) const
356  noexcept(
357  noexcept(std::declval<string_viewT>().find_first_not_of(s, pos, n))) {
358  return _sv.find_first_not_of(s, pos, n);
359  }
360  constexpr size_type find_first_not_of(const value_type* s) const
361  noexcept(noexcept(std::declval<string_viewT>().find_first_not_of(s))) {
362  return _sv.find_first_not_of(s);
363  }
364  constexpr size_type find_first_not_of(const value_type* s,
365  size_type pos) const
366  noexcept(noexcept(std::declval<string_viewT>().find_first_not_of(s,
367  pos))) {
368  return _sv.find_first_not_of(s, pos);
369  }
370  constexpr size_type find_last_not_of(string_view_bridge s) const
371  noexcept(noexcept(std::declval<string_viewT>().find_last_not_of(s._sv))) {
372  return _sv.find_last_not_of(s._sv);
373  }
374  constexpr size_type find_last_not_of(string_view_bridge s,
375  size_type pos) const
376  noexcept(noexcept(std::declval<string_viewT>().find_last_not_of(s._sv,
377  pos))) {
378  return _sv.find_last_not_of(s._sv, pos);
379  }
380  constexpr size_type find_last_not_of(value_type c) const
381  noexcept(noexcept(std::declval<string_viewT>().find_last_not_of(c))) {
382  return _sv.find_last_not_of(c);
383  }
384  constexpr size_type find_last_not_of(value_type c, size_type pos) const
385  noexcept(noexcept(std::declval<string_viewT>().find_last_not_of(c,
386  pos))) {
387  return _sv.find_last_not_of(c, pos);
388  }
389  constexpr size_type find_last_not_of(const value_type* s,
390  size_type pos,
391  size_type n) const
392  noexcept(
393  noexcept(std::declval<string_viewT>().find_last_not_of(s, pos, n))) {
394  return _sv.find_last_not_of(s, pos, n);
395  }
396  constexpr size_type find_last_not_of(const value_type* s) const
397  noexcept(noexcept(std::declval<string_viewT>().find_last_not_of(s))) {
398  return _sv.find_last_not_of(s);
399  }
400  constexpr size_type find_last_not_of(const value_type* s, size_type pos) const
401  noexcept(noexcept(std::declval<string_viewT>().find_last_not_of(s,
402  pos))) {
403  return _sv.find_last_not_of(s, pos);
404  }
405  constexpr bool starts_with(string_view_bridge s) const
406  noexcept(noexcept(std::declval<string_viewT>().starts_with(s._sv))) {
407  return _sv.starts_with(s._sv);
408  }
409  constexpr bool starts_with(value_type c) const
410  noexcept(noexcept(std::declval<string_viewT>().starts_with(c))) {
411  return _sv.starts_with(c);
412  }
413  constexpr bool starts_with(const value_type* s) const
414  noexcept(noexcept(std::declval<string_viewT>().starts_with(s))) {
415  return _sv.starts_with(s);
416  }
417  constexpr bool ends_with(string_view_bridge s) const
418  noexcept(noexcept(std::declval<string_viewT>().ends_with(s._sv))) {
419  return _sv.ends_with(s._sv);
420  }
421  constexpr bool ends_with(value_type c) const
422  noexcept(noexcept(std::declval<string_viewT>().ends_with(c))) {
423  return _sv.ends_with(c);
424  }
425  constexpr bool ends_with(const value_type* s) const
426  noexcept(noexcept(std::declval<string_viewT>().ends_with(s))) {
427  return _sv.ends_with(s);
428  }
429 
430  protected:
431  string_viewT _sv;
432 
433  public:
434  friend JASL_CONSTEXPR_CXX14 bool operator==(
436  const string_view_bridge<string_viewT>& y) noexcept(noexcept(x._sv ==
437  y._sv)) {
438  return x._sv == y._sv;
439  }
440  friend JASL_CONSTEXPR_CXX14 bool operator!=(
442  const string_view_bridge<string_viewT>& y) noexcept(noexcept(x._sv !=
443  y._sv)) {
444  return x._sv != y._sv;
445  }
446  friend JASL_CONSTEXPR_CXX14 bool operator<(
448  const string_view_bridge<string_viewT>& y) noexcept(noexcept(x._sv <
449  y._sv)) {
450  return x._sv < y._sv;
451  }
452  friend JASL_CONSTEXPR_CXX14 bool operator>(
454  const string_view_bridge<string_viewT>& y) noexcept(noexcept(x._sv >
455  y._sv)) {
456  return x._sv > y._sv;
457  }
458  friend JASL_CONSTEXPR_CXX14 bool operator<=(
460  const string_view_bridge<string_viewT>& y) noexcept(noexcept(x._sv <=
461  y._sv)) {
462  return x._sv <= y._sv;
463  }
464  friend JASL_CONSTEXPR_CXX14 bool operator>=(
466  const string_view_bridge<string_viewT>& y) noexcept(noexcept(x._sv >=
467  y._sv)) {
468  return x._sv >= y._sv;
469  }
470 
471  friend JASL_CONSTEXPR_CXX14 bool operator==(
473  const string_viewT& y) noexcept(noexcept(x._sv == y)) {
474  return x._sv == y;
475  }
476  friend JASL_CONSTEXPR_CXX14 bool operator!=(
478  const string_viewT& y) noexcept(noexcept(x._sv != y)) {
479  return x._sv != y;
480  }
481  friend JASL_CONSTEXPR_CXX14 bool operator<(
483  const string_viewT& y) noexcept(noexcept(x._sv < y)) {
484  return x._sv < y;
485  }
486  friend JASL_CONSTEXPR_CXX14 bool operator>(
488  const string_viewT& y) noexcept(noexcept(x._sv > y)) {
489  return x._sv > y;
490  }
491  friend JASL_CONSTEXPR_CXX14 bool operator<=(
493  const string_viewT& y) noexcept(noexcept(x._sv <= y)) {
494  return x._sv <= y;
495  }
496  friend JASL_CONSTEXPR_CXX14 bool operator>=(
498  const string_viewT& y) noexcept(noexcept(x._sv >= y)) {
499  return x._sv >= y;
500  }
501 
502  friend JASL_CONSTEXPR_CXX14 bool operator==(
503  const string_viewT& x,
504  const string_view_bridge<string_viewT>& y) noexcept(noexcept(x ==
505  y._sv)) {
506  return x == y._sv;
507  }
508  friend JASL_CONSTEXPR_CXX14 bool operator!=(
509  const string_viewT& x,
510  const string_view_bridge<string_viewT>& y) noexcept(noexcept(x !=
511  y._sv)) {
512  return x != y._sv;
513  }
514  friend JASL_CONSTEXPR_CXX14 bool operator<(
515  const string_viewT& x,
516  const string_view_bridge<string_viewT>& y) noexcept(noexcept(x < y._sv)) {
517  return x < y._sv;
518  }
519  friend JASL_CONSTEXPR_CXX14 bool operator>(
520  const string_viewT& x,
521  const string_view_bridge<string_viewT>& y) noexcept(noexcept(x > y._sv)) {
522  return x > y._sv;
523  }
524  friend JASL_CONSTEXPR_CXX14 bool operator<=(
525  const string_viewT& x,
526  const string_view_bridge<string_viewT>& y) noexcept(noexcept(x <=
527  y._sv)) {
528  return x <= y._sv;
529  }
530  friend JASL_CONSTEXPR_CXX14 bool operator>=(
531  const string_viewT& x,
532  const string_view_bridge<string_viewT>& y) noexcept(noexcept(x >=
533  y._sv)) {
534  return x >= y._sv;
535  }
536 
537  friend std::basic_ostream<value_type, traits_type>& operator<<(
538  std::basic_ostream<value_type, traits_type>& os,
540  return os << str._sv;
541  }
542 
543  friend struct ::std::hash<string_view_bridge>;
544 };
545 
546 } // namespace inner
547 } // namespace jasl
548 
549 namespace std {
550 template <typename string_viewT>
551 struct hash<jasl::inner::string_view_bridge<string_viewT>> {
552  size_t operator()(jasl::inner::string_view_bridge<string_viewT> x) const
553  noexcept(noexcept(std::hash<string_viewT>{}(x._sv))) {
554  return std::hash<string_viewT>{}(x._sv);
555  }
556 };
557 } // namespace std
Definition: jasl_static_string.hpp:18
Definition: jasl_string_view_bridge.hpp:17
Definition: jasl_string_view.hpp:401