6 #ifndef TURI_GL_STRING_H_ 7 #define TURI_GL_STRING_H_ 9 #include <core/generics/vector_internals.hpp> 10 #include <core/generics/string_internals.hpp> 11 #include <core/util/cityhash_tc.hpp> 12 #include <core/generics/is_memmovable.hpp> 19 typedef char value_type;
21 typedef value_type& reference;
22 typedef const value_type& const_reference;
24 typedef value_type* pointer;
25 typedef const value_type* const_pointer;
27 typedef value_type* iterator;
28 typedef const value_type* const_iterator;
30 typedef std::reverse_iterator<value_type*> reverse_iterator;
31 typedef std::reverse_iterator<const value_type*> const_reverse_iterator;
33 typedef ptrdiff_t difference_type;
34 typedef size_t size_type;
36 static constexpr
size_t npos = gl_string_internal::npos;
41 gl_vector_internal::_vstruct<value_type> *info;
45 template <
class InputIterator>
46 gl_string (InputIterator first, InputIterator last, _VEC_ENABLE_IF_ITERATOR(InputIterator, value_type))
47 : info(gl_vector_internal::construct<value_type, InputIterator>(first, last) )
54 explicit gl_string (
size_t n)
55 : info(gl_vector_internal::construct<value_type>(n))
58 gl_string (
size_t n,
const value_type& val)
59 : info(gl_vector_internal::construct<value_type>(n, val))
62 gl_string(
const gl_string& v)
63 : info(gl_vector_internal::construct<value_type>(v.begin(), v.end()))
66 gl_string (gl_string&& x) noexcept {
73 explicit gl_string (
const std::string& v)
74 : info(gl_vector_internal::construct<value_type>(v.begin(), v.end()))
77 gl_string (
const char* d)
78 : info(gl_vector_internal::construct<value_type>(d, d + strlen(d)))
81 gl_string (
const char* d,
size_t n)
82 : info(gl_vector_internal::construct<value_type>(d, d + n))
85 gl_string (std::initializer_list<value_type> il)
86 : info(gl_vector_internal::construct<value_type>(il.begin(), il.end()) )
89 template <
typename T1>
90 gl_string (std::initializer_list<T1> il, _VEC_ENABLE_IF_CONVERTABLE(T1, value_type))
91 : info(gl_vector_internal::construct<value_type>(il.begin(), il.end()) )
94 gl_string(
const gl_string& str,
size_t pos,
size_t n = npos) {
95 info = gl_vector_internal::construct<value_type>(str._iter_at(pos), str._iter_at(pos, n));
100 gl_vector_internal::destroy(info);
108 size_type size() const noexcept {
return gl_vector_internal::size(info); }
109 size_type length() const noexcept {
return size(); }
111 size_type max_size() const noexcept {
return std::numeric_limits<size_t>::max() /
sizeof(value_type); }
113 inline void resize (size_type n) {
114 if(gl_vector_internal::size(info) != n)
115 gl_vector_internal::resize(info, n);
116 DASSERT_EQ(gl_vector_internal::size(info), n);
119 void resize (size_type n,
const value_type& val) {
120 gl_vector_internal::resize(info, n, val);
123 size_type capacity() const noexcept {
return gl_vector_internal::capacity(info); }
125 bool empty() const noexcept {
129 void reserve (size_type n) {
130 gl_vector_internal::reserve(info, n);
133 void shrink_to_fit() {
134 if(gl_vector_internal::has_excess_storage(info)) {
135 this->swap(gl_string(this->begin(), this->end()));
142 reference operator[] (size_type idx) _VEC_NDEBUG_NOEXCEPT {
143 return gl_vector_internal::get_element(info, idx);
146 const_reference operator[] (size_type idx)
const _VEC_NDEBUG_NOEXCEPT {
147 return gl_vector_internal::get_element(info, idx);
150 reference at (size_type idx) _VEC_NDEBUG_NOEXCEPT {
151 return gl_vector_internal::get_element(info, idx);
154 const_reference at (size_type idx)
const _VEC_NDEBUG_NOEXCEPT {
155 return gl_vector_internal::get_element(info, idx);
158 reference front() _VEC_NDEBUG_NOEXCEPT {
159 DASSERT_NE(gl_vector_internal::size(info), 0);
160 return gl_vector_internal::get_element(info, 0);
163 const_reference front() const _VEC_NDEBUG_NOEXCEPT {
164 DASSERT_NE(gl_vector_internal::size(info), 0);
165 return gl_vector_internal::get_element(info, 0);
168 reference back() _VEC_NDEBUG_NOEXCEPT {
169 DASSERT_NE(gl_vector_internal::size(info), 0);
170 return gl_vector_internal::get_element(info, info->size - 1);
173 const_reference back() const _VEC_NDEBUG_NOEXCEPT {
174 DASSERT_NE(gl_vector_internal::size(info), 0);
175 return gl_vector_internal::get_element(info, info->size - 1);
181 const gl_string& operator=(
const gl_string& v) {
183 gl_vector_internal::assign(info, v.begin(), v.end());
187 const gl_string& operator=(gl_string&& v) {
188 assign(std::move(v));
192 const gl_string& operator=(std::initializer_list<value_type> il) {
193 gl_vector_internal::assign(info, il.begin(), il.end());
197 const gl_string& operator=(
const std::string& v) {
198 gl_vector_internal::assign(info, v.begin(), v.end());
202 const gl_string& operator=(
const char* v) {
203 gl_vector_internal::assign(info, v, v + std::strlen(v));
207 const gl_string& operator=(value_type c) {
208 gl_vector_internal::assign(info, 1, c);
212 template <
class InputIterator>
213 void assign (
const InputIterator& first,
const InputIterator& last,
214 _VEC_ENABLE_IF_ITERATOR(InputIterator, value_type)) {
215 gl_vector_internal::assign(info, first, last);
218 void assign(
size_t n,
const value_type& val) {
219 gl_vector_internal::assign(info, n, val);
222 void assign(std::initializer_list<value_type> il) {
223 gl_vector_internal::assign(info, il);
226 gl_string& assign(
const gl_string& str) {
227 gl_vector_internal::assign(info, str.begin(), str.end());
231 gl_string& assign(gl_string&& str) {
232 gl_vector_internal::assign_move(info, str.info);
236 gl_string& assign(
const gl_string& str,
size_t pos,
size_t n = npos) {
237 gl_vector_internal::assign<value_type>(info, str._iter_at(pos), str._iter_at(pos, n));
241 gl_string& assign(
const value_type* s) {
242 gl_vector_internal::assign<value_type>(info, s, s + std::strlen(s));
246 gl_string& assign(
const value_type* s,
size_t n) {
247 gl_vector_internal::assign<value_type>(info, s, s + n);
254 void push_back (
const value_type& val) {
255 gl_vector_internal::push_back(info, val);
258 void push_back (value_type&& val) {
259 gl_vector_internal::push_back(info, std::forward<value_type>(val));
263 template <
class... Args>
264 iterator emplace (const_iterator position, Args&&... args) {
265 return gl_vector_internal::emplace(info, position, args...);
268 template <
class... Args>
269 void emplace_back (Args&&... args) {
270 gl_vector_internal::emplace_back(info, args...);
273 iterator insert (const_iterator position,
size_t n,
const value_type& val) {
274 return gl_vector_internal::insert(info, position, n, val);
277 template <
typename U>
278 iterator insert (const_iterator position, U&& val) {
279 return gl_vector_internal::insert(info, position, std::forward<U>(val));
282 template <
class InputIterator>
283 iterator insert (const_iterator position, InputIterator first, InputIterator last,
284 _VEC_ENABLE_IF_ITERATOR(InputIterator, value_type) ) {
285 DASSERT_GE(std::distance(first, last), 0);
286 return gl_vector_internal::insert(info, position, first, last);
289 iterator insert (const_iterator position, std::initializer_list<value_type> il) {
290 return gl_vector_internal::insert(info, position, il.begin(), il.end());
293 gl_string& insert(
size_t pos1,
const gl_string& str) {
294 gl_vector_internal::insert(info, _iter_at(pos1), str.begin(), str.end());
298 gl_string& insert(
size_t pos1,
const gl_string& str,
299 size_t pos2,
size_t n=npos) {
300 gl_vector_internal::insert(info, _iter_at(pos1), str._iter_at(pos2), str._iter_at(pos2, n));
304 gl_string& insert(
size_t pos,
const value_type* s,
size_t n=npos) {
305 gl_vector_internal::insert(info, _iter_at(pos), s, s + ((n == npos) ? strlen(s) : n));
309 gl_string& insert(
size_t pos,
size_t n, value_type c) {
310 gl_vector_internal::insert(info, _iter_at(pos), n, c);
317 void clear() _VEC_NDEBUG_NOEXCEPT {
318 gl_vector_internal::clear(info);
322 gl_vector_internal::pop_back(info);
325 iterator erase (const_iterator position) {
326 return gl_vector_internal::erase(info, position);
329 iterator erase (const_iterator first, const_iterator last) {
330 return gl_vector_internal::erase(info, first, last);
333 gl_string& erase(
size_t pos = 0,
size_t n = npos) {
334 gl_vector_internal::erase(info, _iter_at(pos), _iter_at(pos, n));
341 operator std::string()
const {
342 return std::string(cbegin(), cend());
348 const_iterator begin() const noexcept {
return info ==
nullptr ? nullptr : info->data; }
349 iterator begin() noexcept {
return info ==
nullptr ? nullptr : info->data; }
351 const_reverse_iterator rbegin() const noexcept {
352 return std::reverse_iterator<const_iterator>(end());
355 reverse_iterator rbegin() noexcept {
356 return std::reverse_iterator<iterator>(end());
359 const_iterator end() const noexcept {
return (info ==
nullptr) ? nullptr : (info->data + info->size); }
360 iterator end() noexcept {
return (info ==
nullptr) ? nullptr : info->data + info->size; }
362 reverse_iterator rend() noexcept {
return std::reverse_iterator<iterator>(begin()); }
363 const_reverse_iterator rend() const noexcept {
return std::reverse_iterator<const_iterator>(begin()); }
365 const_iterator cbegin() const noexcept {
return begin(); }
367 const_reverse_iterator crbegin() const noexcept {
return rbegin(); }
369 const_iterator cend() const noexcept {
return end(); }
371 const_reverse_iterator crend() const noexcept {
return rend(); }
373 value_type* data() noexcept {
return info ==
nullptr ? nullptr : info->data; }
375 const value_type* data() const noexcept {
return info ==
nullptr ? nullptr : info->data; }
381 void swap (gl_string& x) _VEC_NDEBUG_NOEXCEPT {
382 std::swap(info, x.info);
385 void swap (gl_string&& x) _VEC_NDEBUG_NOEXCEPT {
386 std::swap(info, x.info);
393 gl_string& append(
const gl_string& str) {
394 gl_vector_internal::insert(info, end(), str.begin(), str.end());
398 gl_string& append(
const gl_string& str,
size_t pos,
size_t n = npos) {
399 DASSERT_LE(pos, str.size());
400 gl_vector_internal::insert(info, end(), str._iter_at(pos), str._iter_at(pos, n));
404 gl_string& append(
const char* s,
size_t n) {
405 gl_vector_internal::insert(info, end(), s, s + n);
409 gl_string& append(
const char* s) {
410 gl_vector_internal::insert(info, end(), s, s + std::strlen(s));
414 gl_string& append(
size_t n, value_type c) {
415 gl_vector_internal::insert(info, end(), n, c);
419 template<
class InputIterator>
420 gl_string& append(InputIterator first, InputIterator last,
421 _VEC_ENABLE_IF_ITERATOR(InputIterator, value_type)) {
422 gl_vector_internal::insert(info, end(), first, last);
426 gl_string& append(std::initializer_list<value_type> il) {
427 gl_vector_internal::insert(info, end(), il.begin(), il.end());
431 gl_string& operator+=(
const gl_string& str) {
436 gl_string& operator+=(
const value_type* s) {
441 gl_string& operator+=(value_type c) {
446 gl_string& operator+=(std::initializer_list<value_type> il) {
451 gl_string& replace(
size_t pos1,
size_t n1,
const gl_string& str) {
452 gl_vector_internal::replace(info, _iter_at(pos1), _iter_at(pos1, n1), str.begin(), str.end());
456 gl_string& replace(
size_t pos1,
size_t n1,
const gl_string& str,
457 size_t pos2,
size_t n2=npos) {
458 gl_vector_internal::replace(info,
459 _iter_at(pos1), _iter_at(pos1, n1),
460 str._iter_at(pos2), str._iter_at(pos2, n2));
464 gl_string& replace(
size_t pos,
size_t n1,
const value_type* s,
size_t n2) {
465 gl_vector_internal::replace(info, _iter_at(pos), _iter_at(pos, n1), s, s + n2);
469 gl_string& replace(
size_t pos,
size_t n1,
const value_type* s) {
470 gl_vector_internal::replace(info, _iter_at(pos), _iter_at(pos, n1), s, s + std::strlen(s));
474 gl_string& replace(
size_t pos,
size_t n1,
size_t n2, value_type c) {
475 gl_vector_internal::replace(info, _iter_at(pos), _iter_at(pos, n1), n2, c);
479 gl_string& replace(const_iterator i1, const_iterator i2,
const gl_string& str) {
480 gl_vector_internal::replace(info, i1, i2, str.begin(), str.end());
484 gl_string& replace(const_iterator i1, const_iterator i2,
const value_type* s,
size_t n) {
485 gl_vector_internal::replace(info, i1, i2, s, s + n);
489 gl_string& replace(const_iterator i1, const_iterator i2,
const value_type* s) {
490 gl_vector_internal::replace(info, i1, i2, s, s + strlen(s));
494 gl_string& replace(const_iterator i1, const_iterator i2,
size_t n, value_type c) {
495 gl_vector_internal::replace(info, i1, i2, n, c);
499 template<
class InputIterator>
500 gl_string& replace(const_iterator i1, const_iterator i2, InputIterator j1, InputIterator j2) {
501 gl_vector_internal::replace(info, i1, i2, j1, j2);
505 gl_string& replace(const_iterator i1, const_iterator i2, std::initializer_list<value_type> il) {
506 gl_vector_internal::replace(info, i1, i2, il.begin(), il.end());
510 size_t copy(value_type* s,
size_t n,
size_t pos = 0) const _VEC_NDEBUG_NOEXCEPT {
511 DASSERT_LE(pos, size());
513 size_t _end = std::min(sz, n + pos);
514 std::copy(cbegin() + pos, cbegin() + _end, s);
518 gl_string substr(
size_t pos = 0,
size_t n = npos)
const {
519 return gl_string(_iter_at(pos), _iter_at(pos, n));
522 size_t find(
const gl_string& str,
size_t pos = 0) const _VEC_NDEBUG_NOEXCEPT {
523 return gl_string_internal::str_find(cbegin(), size(), str.cbegin(), pos, str.size());
526 size_t find(
const value_type* s,
size_t pos,
size_t n)
const _VEC_NDEBUG_NOEXCEPT {
528 return gl_string_internal::str_find(cbegin(), size(), s, pos, n);
531 size_t find(
const value_type* s,
size_t pos = 0) const _VEC_NDEBUG_NOEXCEPT {
533 return gl_string_internal::str_find(cbegin(), size(), s, pos, std::strlen(s));
536 size_t find(value_type c,
size_t pos = 0) const _VEC_NDEBUG_NOEXCEPT {
537 return gl_string_internal::str_find(cbegin(), size(), c, pos);
540 size_t rfind(
const gl_string& str,
size_t pos = npos)
const _VEC_NDEBUG_NOEXCEPT {
541 return gl_string_internal::str_rfind(cbegin(), size(), str.cbegin(), pos, str.size());
544 size_t rfind(
const value_type* s,
size_t pos,
size_t n)
const _VEC_NDEBUG_NOEXCEPT {
546 return gl_string_internal::str_rfind(cbegin(), size(), s, pos, n);
549 size_t rfind(
const value_type* s,
size_t pos = npos)
const _VEC_NDEBUG_NOEXCEPT {
551 return gl_string_internal::str_rfind(cbegin(), size(), s, pos, std::strlen(s));
554 size_t rfind(value_type c,
size_t pos = npos)
const _VEC_NDEBUG_NOEXCEPT {
555 return gl_string_internal::str_rfind(cbegin(), size(), c, pos);
558 size_t find_first_of(
const gl_string& str,
size_t pos = 0) const _VEC_NDEBUG_NOEXCEPT {
559 return gl_string_internal::str_find_first_of(cbegin(), size(), str.cbegin(), pos, str.size());
562 size_t find_first_of(
const value_type* s,
size_t pos,
size_t n)
const _VEC_NDEBUG_NOEXCEPT {
564 return gl_string_internal::str_find_first_of(cbegin(), size(), s, pos, n);
567 size_t find_first_of(
const value_type* s,
size_t pos = 0) const _VEC_NDEBUG_NOEXCEPT {
569 return gl_string_internal::str_find_first_of(cbegin(), size(), s, pos, std::strlen(s));
572 size_t find_first_of(value_type c,
size_t pos = 0) const _VEC_NDEBUG_NOEXCEPT {
576 size_t find_last_of(
const gl_string& str,
size_t pos = npos)
const _VEC_NDEBUG_NOEXCEPT {
577 return gl_string_internal::str_find_last_of(cbegin(), size(), str.cbegin(), pos, str.size());
580 size_t find_last_of(
const value_type* s,
size_t pos,
size_t n)
const _VEC_NDEBUG_NOEXCEPT {
582 return gl_string_internal::str_find_last_of(cbegin(), size(), s, pos, n);
585 size_t find_last_of(
const value_type* s,
size_t pos = npos)
const _VEC_NDEBUG_NOEXCEPT {
587 return gl_string_internal::str_find_last_of(cbegin(), size(), s, pos, std::strlen(s));
590 size_t find_last_of(value_type c,
size_t pos = npos)
const _VEC_NDEBUG_NOEXCEPT {
591 return rfind(c, pos);
594 size_t find_first_not_of(
const gl_string& str,
size_t pos = 0) const _VEC_NDEBUG_NOEXCEPT {
595 return gl_string_internal::str_find_first_not_of(cbegin(), size(), str.cbegin(), pos, str.size());
598 size_t find_first_not_of(
const value_type* s,
size_t pos,
size_t n)
const _VEC_NDEBUG_NOEXCEPT {
600 return gl_string_internal::str_find_first_not_of(cbegin(), size(), s, pos, n);
603 size_t find_first_not_of(
const value_type* s,
size_t pos = 0) const _VEC_NDEBUG_NOEXCEPT {
605 return gl_string_internal::str_find_first_not_of(cbegin(), size(), s, pos, std::strlen(s));
608 size_t find_first_not_of(value_type c,
size_t pos = 0) const _VEC_NDEBUG_NOEXCEPT {
609 return gl_string_internal::str_find_first_not_of(cbegin(), size(), c, pos);
612 size_t find_last_not_of(
const gl_string& str,
size_t pos = npos)
const _VEC_NDEBUG_NOEXCEPT {
613 return gl_string_internal::str_find_last_not_of(cbegin(), size(), str.cbegin(), pos, str.size());
616 size_t find_last_not_of(
const value_type* s,
size_t pos,
size_t n)
const _VEC_NDEBUG_NOEXCEPT {
618 return gl_string_internal::str_find_last_not_of(cbegin(), size(), s, pos, n);
621 size_t find_last_not_of(
const value_type* s,
size_t pos = npos)
const _VEC_NDEBUG_NOEXCEPT {
623 return gl_string_internal::str_find_last_not_of(cbegin(), size(), s, pos, std::strlen(s));
626 size_t find_last_not_of(value_type c,
size_t pos = npos)
const _VEC_NDEBUG_NOEXCEPT {
627 return gl_string_internal::str_find_last_not_of(cbegin(), size(), c, pos);
630 int compare(
const gl_string& str)
const _VEC_NDEBUG_NOEXCEPT {
631 size_t lhs_sz = size();
632 size_t rhs_sz = str.size();
633 int result = gl_string_internal::compare(data(), str.data(), std::min(lhs_sz, rhs_sz));
634 if (result != 0)
return result;
635 if (lhs_sz < rhs_sz)
return -1;
636 if (lhs_sz > rhs_sz)
return 1;
640 int compare(
const std::string& str)
const _VEC_NDEBUG_NOEXCEPT {
641 size_t lhs_sz = size();
642 size_t rhs_sz = str.size();
643 int result = gl_string_internal::compare(data(), str.data(), std::min(lhs_sz, rhs_sz));
644 if (result != 0)
return result;
645 if (lhs_sz < rhs_sz)
return -1;
646 if (lhs_sz > rhs_sz)
return 1;
650 int compare(
size_t pos1,
size_t n1,
const gl_string& str)
const _VEC_NDEBUG_NOEXCEPT {
651 return compare(pos1, n1, str.cbegin(), str.size());
654 int compare(
size_t pos1,
size_t n1,
const gl_string& str,
655 size_t pos2,
size_t n2=npos)
const _VEC_NDEBUG_NOEXCEPT {
657 size_type sz = str.size();
658 DASSERT_LE(pos2, sz);
659 return compare(pos1, n1, str.data() + pos2, std::min(n2, sz - pos2));
662 int compare(
const value_type* s)
const _VEC_NDEBUG_NOEXCEPT {
664 return compare(0, npos, s, std::strlen(s));
667 int compare(
size_t pos1,
size_t n1,
const value_type* s)
const _VEC_NDEBUG_NOEXCEPT {
669 return compare(pos1, n1, s, std::strlen(s));
672 int compare(
size_t pos1,
size_t n1,
const value_type* s,
size_t n2)
const _VEC_NDEBUG_NOEXCEPT {
674 size_type sz = size();
675 DASSERT_LE(pos1, sz);
677 size_type rlen = std::min(n1, sz - pos1);
678 int r = gl_string_internal::compare(data() + pos1, s, std::min(rlen, n2));
680 if (rlen < n2) r = -1;
681 else if (rlen > n2) r = 1;
690 const_iterator _iter_at(
size_t pos)
const _VEC_NDEBUG_NOEXCEPT {
691 DASSERT_LE(pos, size());
692 return cbegin() + pos;
695 const_iterator _iter_at(
size_t pos,
size_t n)
const _VEC_NDEBUG_NOEXCEPT {
696 DASSERT_LE(pos, size());
697 return n == npos ? cend() : cbegin() +
std::min(size(), pos + n);
700 iterator _iter_at(
size_t pos) _VEC_NDEBUG_NOEXCEPT {
701 DASSERT_LE(pos, size());
702 return begin() + pos;
705 iterator _iter_at(
size_t pos,
size_t n) _VEC_NDEBUG_NOEXCEPT {
706 DASSERT_LE(pos, size());
707 return n == npos ? end() : begin() +
std::min(size(), pos + n);
716 bool operator==(
const gl_string& lhs,
const gl_string& rhs) noexcept {
717 return (lhs.size() == rhs.size()
718 && std::equal(lhs.cbegin(), lhs.cend(), rhs.cbegin()));
723 bool operator==(
const char* lhs,
const gl_string& rhs) noexcept {
724 return (std::strlen(lhs) == rhs.size()
725 && std::equal(rhs.cbegin(), rhs.cend(), lhs));
729 bool operator==(
const gl_string& lhs,
const char* rhs) noexcept {
730 return (std::strlen(rhs) == lhs.size()
731 && std::equal(lhs.cbegin(), lhs.cend(), rhs));
735 bool operator==(
const gl_string& lhs,
const std::string& rhs) noexcept {
736 return (lhs.size() == rhs.size()
737 && std::equal(lhs.cbegin(), lhs.cend(), rhs.cbegin()));
741 bool operator==(
const std::string& lhs,
const gl_string& rhs) noexcept {
742 return (lhs.size() == rhs.size()
743 && std::equal(lhs.cbegin(), lhs.cend(), rhs.cbegin()));
749 bool operator!=(
const gl_string& lhs,
const gl_string& rhs) noexcept {
750 return !(lhs == rhs);
755 bool operator!=(
const char* lhs,
const gl_string& rhs) noexcept {
756 return !(lhs == rhs);
761 operator!=(
const gl_string& lhs,
const char* rhs) noexcept {
762 return !(lhs == rhs);
767 bool operator!=(
const std::string& lhs,
const gl_string& rhs) noexcept {
768 return !(lhs == rhs);
773 bool operator!=(
const gl_string& lhs,
const std::string& rhs) noexcept {
774 return !(lhs == rhs);
780 bool operator< (
const gl_string& lhs,
const gl_string& rhs) noexcept {
781 return lhs.compare(rhs) < 0;
786 bool operator< (
const gl_string& lhs,
const std::string& rhs) noexcept {
787 return lhs.compare(rhs) < 0;
792 bool operator< (
const std::string& lhs,
const gl_string& rhs) noexcept {
793 return rhs.compare(lhs) > 0;
797 bool operator< (
const gl_string& lhs,
const char* rhs) noexcept {
798 return lhs.compare(rhs) < 0;
803 bool operator< (
const char* lhs,
const gl_string& rhs) noexcept {
804 return rhs.compare(lhs) > 0;
811 bool operator> (
const gl_string& lhs,
const gl_string& rhs) noexcept {
817 bool operator> (
const gl_string& lhs,
const std::string& rhs) noexcept {
823 bool operator> (
const std::string& lhs,
const gl_string& rhs) noexcept {
828 bool operator> (
const gl_string& lhs,
const char* rhs) noexcept {
834 bool operator> (
const char* lhs,
const gl_string& rhs) noexcept {
842 bool operator<=(
const gl_string& lhs,
const gl_string& rhs) noexcept {
847 bool operator<=(
const gl_string& lhs,
const std::string& rhs) noexcept {
852 bool operator<=(
const std::string& lhs,
const gl_string& rhs) noexcept {
858 bool operator<=(
const gl_string& lhs,
const char* rhs) noexcept {
864 bool operator<=(
const char* lhs,
const gl_string& rhs) noexcept {
870 bool operator>=(
const gl_string& lhs,
const gl_string& rhs) noexcept {
876 bool operator>=(
const gl_string& lhs,
const std::string& rhs) noexcept {
882 bool operator>=(
const std::string& lhs,
const gl_string& rhs) noexcept {
887 bool operator>=(
const gl_string& lhs,
const char* rhs) noexcept {
893 bool operator>=(
const char* lhs,
const gl_string& rhs) noexcept {
899 gl_string operator+(
const gl_string& lhs,
const gl_string& rhs) {
900 size_t lhs_sz = lhs.size();
901 size_t rhs_sz = rhs.size();
903 r.reserve(lhs_sz + rhs_sz);
904 r.assign(lhs.data(), lhs_sz);
905 r.append(rhs.data(), rhs_sz);
911 gl_string operator+(
const gl_string& lhs,
const std::string& rhs) {
912 size_t lhs_sz = lhs.size();
913 size_t rhs_sz = rhs.size();
915 r.reserve(lhs_sz + rhs_sz);
916 r.assign(lhs.data(), lhs_sz);
917 r.append(rhs.data(), rhs_sz);
923 gl_string operator+(
const std::string& lhs,
const gl_string& rhs) {
924 size_t lhs_sz = lhs.
size();
925 size_t rhs_sz = rhs.size();
927 r.reserve(lhs_sz + rhs_sz);
928 r.assign(lhs.data(), lhs_sz);
929 r.append(rhs.data(), rhs_sz);
935 gl_string operator+(
const char* lhs ,
const gl_string& rhs) {
936 size_t lhs_sz = std::strlen(lhs);
937 size_t rhs_sz = rhs.size();
939 r.reserve(lhs_sz + rhs_sz);
940 r.assign(lhs, lhs + lhs_sz);
941 r.append(rhs.data(), rhs_sz);
947 gl_string operator+(
char lhs,
const gl_string& rhs) {
948 size_t rhs_sz = rhs.size();
950 r.reserve(1 + rhs_sz);
952 r.append(rhs.data(), rhs_sz);
958 gl_string operator+(
const gl_string& lhs,
const char* rhs) {
959 size_t lhs_sz = lhs.size();
960 size_t rhs_sz = std::strlen(rhs);
962 r.reserve(lhs_sz + rhs_sz);
963 r.assign(lhs.data(), lhs_sz);
964 r.append(rhs, rhs_sz);
969 gl_string operator+(
const gl_string& lhs,
char rhs) {
970 size_t lhs_sz = lhs.size();
972 r.reserve(lhs_sz + 1);
973 r.assign(lhs.data(), lhs_sz);
979 gl_string operator+(gl_string&& lhs,
const gl_string& rhs) {
980 return std::move(lhs.append(rhs));
985 gl_string operator+(
const gl_string& lhs, gl_string&& rhs) {
986 return std::move(rhs.insert(0, lhs));
991 gl_string operator+(gl_string&& lhs, gl_string&& rhs) {
992 return std::move(lhs.append(rhs));
997 gl_string operator+(
const char* lhs , gl_string&& rhs) {
998 return std::move(rhs.insert(0, lhs));
1003 gl_string operator+(
char lhs, gl_string&& rhs) {
1004 rhs.insert(rhs.begin(), lhs);
1005 return std::move(rhs);
1009 gl_string operator+(gl_string&& lhs,
const char* rhs) {
1010 return std::move(lhs.append(rhs));
1014 gl_string operator+(gl_string&& lhs,
char rhs) {
1016 return std::move(lhs);
1023 #include <core/generics/string_conversion_internals.hpp> 1027 static inline gl_string to_gl_string(
int val) {
1028 return gl_string_internal::as_string(
"%d", val);
1031 static inline gl_string to_gl_string(
unsigned val) {
1032 return gl_string_internal::as_string(
"%u", val);
1035 static inline gl_string to_gl_string(
long val) {
1036 return gl_string_internal::as_string(
"%ld", val);
1039 static inline gl_string to_gl_string(
unsigned long val) {
1040 return gl_string_internal::as_string(
"%lu", val);
1043 static inline gl_string to_gl_string(
long long val) {
1044 return gl_string_internal::as_string(
"%lld", val);
1047 static inline gl_string to_gl_string(
unsigned long long val) {
1048 return gl_string_internal::as_string(
"%llu", val);
1051 static inline gl_string to_gl_string(
float val) {
1052 return gl_string_internal::as_string(
"%f", val);
1055 static inline gl_string to_gl_string(
double val) {
1056 return gl_string_internal::as_string(
"%f", val);
1059 static inline gl_string to_gl_string(
long double val) {
1060 return gl_string_internal::as_string(
"%Lf", val);
1066 #include <core/generics/string_stream_internals.hpp> 1070 template<
class _Traits>
1072 std::basic_ostream<char, _Traits>& operator<<(std::basic_ostream<char, _Traits>& os,
const gl_string& s) {
1073 for(
auto it = s.begin(); it != s.end(); ++it) {
1079 template<
class _Traits>
1080 std::basic_istream<char, _Traits>&
1081 operator>>(std::basic_istream<char, _Traits>& is, gl_string& str) {
1082 return gl_string_internals::stream_in(is, str);
1093 std::istream& getline(std::istream& is, turi::gl_string& str,
char dlm=
'\n') {
1094 return turi::gl_string_internals::getline(is, str, dlm);
1098 std::istream& getline(std::istream&& is, turi::gl_string& str,
char dlm=
'\n') {
1099 return turi::gl_string_internals::getline(is, str, dlm);
1102 static inline int stoi(
const turi::gl_string& str,
size_t* idx = 0,
int base = 10) {
1103 return std::stoi(std::string(str.begin(), str.end()), idx, base);
1106 static inline long stol(
const turi::gl_string& str,
size_t* idx = 0,
int base = 10) {
1107 return std::stol(std::string(str.begin(), str.end()), idx, base);
1110 static inline unsigned long stoul (
const turi::gl_string& str,
size_t* idx = 0,
int base = 10) {
1111 return std::stoul(std::string(str.begin(), str.end()), idx, base);
1114 static inline unsigned long long stoull(
const turi::gl_string& str,
size_t* idx = 0,
int base = 10) {
1115 return std::stoull(std::string(str.begin(), str.end()), idx, base);
1118 static inline float stof (
const turi::gl_string& str,
size_t* idx = 0) {
1119 return std::stoll(std::string(str.begin(), str.end()), idx);
1122 static inline double stod (
const turi::gl_string& str,
size_t* idx = 0) {
1123 return std::stod(std::string(str.begin(), str.end()), idx);
1126 static inline long double stold(
const turi::gl_string& str,
size_t* idx = 0) {
1127 return std::stold(std::string(str.begin(), str.end()), idx);
1130 static inline void swap (turi::gl_string& a, turi::gl_string& b) noexcept {
1134 template <>
struct hash<
turi::gl_string>
1135 :
public unary_function<turi::gl_string, size_t> {
1137 size_t operator()(
const turi::gl_string& s)
const {
1148 struct is_memmovable<gl_string> {
1149 static constexpr
bool value =
true;
1154 #include <core/generics/string_serialization.hpp>
static uint64_t hash64(const char *s, size_t len)
void copy(const std::string src, const std::string dest)
#define DASSERT_FALSE(cond)
#define GL_HOT_INLINE_FLATTEN
void copy(Iterator begin, Iterator end, SWriter &&writer)
#define DASSERT_TRUE(cond)