aboutsummaryrefslogtreecommitdiff
path: root/gdbsupport/gdb_string_view.h
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@polymtl.ca>2023-02-08 15:36:23 -0500
committerSimon Marchi <simon.marchi@polymtl.ca>2023-02-08 15:46:02 -0500
commitc583a2520616c2736cffc389c89a48b159366e6c (patch)
treeb4925f26506fcee96c16119431c01760f05db95d /gdbsupport/gdb_string_view.h
parentca7f92c2f15b86b09c4a8ad14806bef666308d31 (diff)
downloadgdb-users/simark/clang-format.zip
gdb-users/simark/clang-format.tar.gz
gdb-users/simark/clang-format.tar.bz2
Run clang-format.shusers/simark/clang-format
Change-Id: Ia948cc26d534b0dd02702244d52434b1a2093968
Diffstat (limited to 'gdbsupport/gdb_string_view.h')
-rw-r--r--gdbsupport/gdb_string_view.h1014
1 files changed, 527 insertions, 487 deletions
diff --git a/gdbsupport/gdb_string_view.h b/gdbsupport/gdb_string_view.h
index 26a3a9f..968ef11 100644
--- a/gdbsupport/gdb_string_view.h
+++ b/gdbsupport/gdb_string_view.h
@@ -1,6 +1,5 @@
// Components for manipulating non-owning sequences of characters -*- C++ -*-
-
#ifndef COMMON_GDB_STRING_VIEW_H
#define COMMON_GDB_STRING_VIEW_H
@@ -33,13 +32,13 @@
// N3762 basic_string_view library
//
-
#if __cplusplus >= 201703L
#include <string_view>
-namespace gdb {
- using string_view = std::string_view;
+namespace gdb
+{
+using string_view = std::string_view;
} /* namespace gdb */
#else /* __cplusplus < 201703L */
@@ -48,9 +47,10 @@ namespace gdb {
#include <limits>
#include "gdb_assert.h"
-namespace gdb {
+namespace gdb
+{
- /**
+/**
* @class basic_string_view <experimental/string_view>
* @brief A non-owning reference to a string.
*
@@ -69,498 +69,538 @@ namespace gdb {
* size_t _M_len
* @endcode
*/
- template<typename _CharT, typename _Traits = std::char_traits<_CharT>>
- class basic_string_view
- {
- public:
-
- // types
- using traits_type = _Traits;
- using value_type = _CharT;
- using pointer = const _CharT*;
- using const_pointer = const _CharT*;
- using reference = const _CharT&;
- using const_reference = const _CharT&;
- using const_iterator = const _CharT*;
- using iterator = const_iterator;
- using const_reverse_iterator = std::reverse_iterator<const_iterator>;
- using reverse_iterator = const_reverse_iterator;
- using size_type = size_t;
- using difference_type = ptrdiff_t;
- static constexpr size_type npos = size_type(-1);
-
- // [string.view.cons], construct/copy
-
- constexpr
- basic_string_view() noexcept
- : _M_len{0}, _M_str{nullptr}
- { }
-
- constexpr basic_string_view(const basic_string_view&) noexcept = default;
-
- template<typename _Allocator>
- basic_string_view(const std::basic_string<_CharT, _Traits,
- _Allocator>& __str) noexcept
- : _M_len{__str.length()}, _M_str{__str.data()}
- { }
-
- /*constexpr*/ basic_string_view(const _CharT* __str)
- : _M_len{__str == nullptr ? 0 : traits_type::length(__str)},
- _M_str{__str}
- { }
-
- constexpr basic_string_view(const _CharT* __str, size_type __len)
- : _M_len{__len},
- _M_str{__str}
- { }
-
- basic_string_view&
- operator=(const basic_string_view&) noexcept = default;
-
- // [string.view.iterators], iterators
-
- constexpr const_iterator
- begin() const noexcept
- { return this->_M_str; }
-
- constexpr const_iterator
- end() const noexcept
- { return this->_M_str + this->_M_len; }
-
- constexpr const_iterator
- cbegin() const noexcept
- { return this->_M_str; }
-
- constexpr const_iterator
- cend() const noexcept
- { return this->_M_str + this->_M_len; }
-
- const_reverse_iterator
- rbegin() const noexcept
- { return const_reverse_iterator(this->end()); }
-
- const_reverse_iterator
- rend() const noexcept
- { return const_reverse_iterator(this->begin()); }
-
- const_reverse_iterator
- crbegin() const noexcept
- { return const_reverse_iterator(this->end()); }
-
- const_reverse_iterator
- crend() const noexcept
- { return const_reverse_iterator(this->begin()); }
-
- // [string.view.capacity], capacity
-
- constexpr size_type
- size() const noexcept
- { return this->_M_len; }
-
- constexpr size_type
- length() const noexcept
- { return _M_len; }
-
- constexpr size_type
- max_size() const noexcept
- {
- return (npos - sizeof(size_type) - sizeof(void*))
- / sizeof(value_type) / 4;
- }
-
- constexpr bool
- empty() const noexcept
- { return this->_M_len == 0; }
-
- // [string.view.access], element access
-
- constexpr const _CharT&
- operator[](size_type __pos) const
- {
- // TODO: Assert to restore in a way compatible with the constexpr.
- // __glibcxx_assert(__pos < this->_M_len);
- return *(this->_M_str + __pos);
- }
-
- constexpr const _CharT&
- at(size_type __pos) const
- {
- return __pos < this->_M_len
- ? *(this->_M_str + __pos)
- : (error (_("basic_string_view::at: __pos "
- "(which is %zu) >= this->size() "
- "(which is %zu)"),
- __pos, this->size()),
- *this->_M_str);
- }
-
- constexpr const _CharT&
- front() const
- {
- // TODO: Assert to restore in a way compatible with the constexpr.
- // __glibcxx_assert(this->_M_len > 0);
- return *this->_M_str;
- }
-
- constexpr const _CharT&
- back() const
- {
- // TODO: Assert to restore in a way compatible with the constexpr.
- // __glibcxx_assert(this->_M_len > 0);
- return *(this->_M_str + this->_M_len - 1);
- }
-
- constexpr const _CharT*
- data() const noexcept
- { return this->_M_str; }
-
- // [string.view.modifiers], modifiers:
-
- /*constexpr*/ void
- remove_prefix(size_type __n)
- {
- gdb_assert (this->_M_len >= __n);
- this->_M_str += __n;
- this->_M_len -= __n;
- }
-
- /*constexpr*/ void
- remove_suffix(size_type __n)
- { this->_M_len -= __n; }
-
- /*constexpr*/ void
- swap(basic_string_view& __sv) noexcept
- {
- auto __tmp = *this;
- *this = __sv;
- __sv = __tmp;
- }
-
-
- // [string.view.ops], string operations:
-
- template<typename _Allocator>
- explicit operator std::basic_string<_CharT, _Traits, _Allocator>() const
- {
- return { this->_M_str, this->_M_len };
- }
-
- size_type
- copy(_CharT* __str, size_type __n, size_type __pos = 0) const
- {
- gdb_assert (__str != nullptr || __n == 0);
- if (__pos > this->_M_len)
- error (_("basic_string_view::copy: __pos "
- "(which is %zu) > this->size() "
- "(which is %zu)"),
- __pos, this->size());
- size_type __rlen{std::min(__n, size_type{this->_M_len - __pos})};
- for (auto __begin = this->_M_str + __pos,
- __end = __begin + __rlen; __begin != __end;)
- *__str++ = *__begin++;
- return __rlen;
- }
-
-
- // [string.view.ops], string operations:
-
- /*constexpr*/ basic_string_view
- substr(size_type __pos, size_type __n=npos) const
- {
- return __pos <= this->_M_len
- ? basic_string_view{this->_M_str + __pos,
- std::min(__n, size_type{this->_M_len - __pos})}
- : (error (_("basic_string_view::substr: __pos "
- "(which is %zu) > this->size() "
- "(which is %zu)"),
- __pos, this->size()), basic_string_view{});
- }
-
- /*constexpr*/ int
- compare(basic_string_view __str) const noexcept
- {
- int __ret = traits_type::compare(this->_M_str, __str._M_str,
- std::min(this->_M_len, __str._M_len));
- if (__ret == 0)
- __ret = _S_compare(this->_M_len, __str._M_len);
- return __ret;
- }
-
- /*constexpr*/ int
- compare(size_type __pos1, size_type __n1, basic_string_view __str) const
- { return this->substr(__pos1, __n1).compare(__str); }
-
- /*constexpr*/ int
- compare(size_type __pos1, size_type __n1,
- basic_string_view __str, size_type __pos2, size_type __n2) const
- { return this->substr(__pos1, __n1).compare(__str.substr(__pos2, __n2)); }
-
- /*constexpr*/ int
- compare(const _CharT* __str) const noexcept
- { return this->compare(basic_string_view{__str}); }
-
- /*constexpr*/ int
- compare(size_type __pos1, size_type __n1, const _CharT* __str) const
- { return this->substr(__pos1, __n1).compare(basic_string_view{__str}); }
-
- /*constexpr*/ int
- compare(size_type __pos1, size_type __n1,
- const _CharT* __str, size_type __n2) const
- {
- return this->substr(__pos1, __n1)
- .compare(basic_string_view(__str, __n2));
- }
-
- /*constexpr*/ size_type
- find(basic_string_view __str, size_type __pos = 0) const noexcept
- { return this->find(__str._M_str, __pos, __str._M_len); }
-
- /*constexpr*/ size_type
- find(_CharT __c, size_type __pos=0) const noexcept;
-
- /*constexpr*/ size_type
- find(const _CharT* __str, size_type __pos, size_type __n) const noexcept;
-
- /*constexpr*/ size_type
- find(const _CharT* __str, size_type __pos=0) const noexcept
- { return this->find(__str, __pos, traits_type::length(__str)); }
-
- /*constexpr*/ size_type
- rfind(basic_string_view __str, size_type __pos = npos) const noexcept
- { return this->rfind(__str._M_str, __pos, __str._M_len); }
-
- /*constexpr*/ size_type
- rfind(_CharT __c, size_type __pos = npos) const noexcept;
-
- /*constexpr*/ size_type
- rfind(const _CharT* __str, size_type __pos, size_type __n) const noexcept;
-
- /*constexpr*/ size_type
- rfind(const _CharT* __str, size_type __pos = npos) const noexcept
- { return this->rfind(__str, __pos, traits_type::length(__str)); }
-
- /*constexpr*/ size_type
- find_first_of(basic_string_view __str, size_type __pos = 0) const noexcept
- { return this->find_first_of(__str._M_str, __pos, __str._M_len); }
-
- /*constexpr*/ size_type
- find_first_of(_CharT __c, size_type __pos = 0) const noexcept
- { return this->find(__c, __pos); }
-
- /*constexpr*/ size_type
- find_first_of(const _CharT* __str, size_type __pos, size_type __n) const;
-
- /*constexpr*/ size_type
- find_first_of(const _CharT* __str, size_type __pos = 0) const noexcept
- { return this->find_first_of(__str, __pos, traits_type::length(__str)); }
-
- /*constexpr*/ size_type
- find_last_of(basic_string_view __str,
- size_type __pos = npos) const noexcept
- { return this->find_last_of(__str._M_str, __pos, __str._M_len); }
-
- size_type
- find_last_of(_CharT __c, size_type __pos=npos) const noexcept
- { return this->rfind(__c, __pos); }
-
- /*constexpr*/ size_type
- find_last_of(const _CharT* __str, size_type __pos, size_type __n) const;
-
- /*constexpr*/ size_type
- find_last_of(const _CharT* __str, size_type __pos = npos) const noexcept
- { return this->find_last_of(__str, __pos, traits_type::length(__str)); }
-
- /*constexpr*/ size_type
- find_first_not_of(basic_string_view __str,
- size_type __pos = 0) const noexcept
- { return this->find_first_not_of(__str._M_str, __pos, __str._M_len); }
-
- /*constexpr*/ size_type
- find_first_not_of(_CharT __c, size_type __pos = 0) const noexcept;
-
- /*constexpr*/ size_type
- find_first_not_of(const _CharT* __str,
- size_type __pos, size_type __n) const;
-
- /*constexpr*/ size_type
- find_first_not_of(const _CharT* __str, size_type __pos = 0) const noexcept
- {
- return this->find_first_not_of(__str, __pos,
- traits_type::length(__str));
- }
-
- /*constexpr*/ size_type
- find_last_not_of(basic_string_view __str,
- size_type __pos = npos) const noexcept
- { return this->find_last_not_of(__str._M_str, __pos, __str._M_len); }
-
- /*constexpr*/ size_type
- find_last_not_of(_CharT __c, size_type __pos = npos) const noexcept;
-
- /*constexpr*/ size_type
- find_last_not_of(const _CharT* __str,
- size_type __pos, size_type __n) const;
-
- /*constexpr*/ size_type
- find_last_not_of(const _CharT* __str,
- size_type __pos = npos) const noexcept
- {
- return this->find_last_not_of(__str, __pos,
- traits_type::length(__str));
- }
-
- private:
-
- static constexpr int
- _S_compare(size_type __n1, size_type __n2) noexcept
- {
- return difference_type(__n1 - __n2) > std::numeric_limits<int>::max()
- ? std::numeric_limits<int>::max()
- : difference_type(__n1 - __n2) < std::numeric_limits<int>::min()
- ? std::numeric_limits<int>::min()
- : static_cast<int>(difference_type(__n1 - __n2));
- }
-
- size_t _M_len;
- const _CharT* _M_str;
- };
-
- // [string.view.comparison], non-member basic_string_view comparison functions
-
- namespace __detail
- {
- // Identity transform to create a non-deduced context, so that only one
- // argument participates in template argument deduction and the other
- // argument gets implicitly converted to the deduced type. See n3766.html.
- template<typename _Tp>
- using __idt = typename std::common_type<_Tp>::type;
- }
-
- template<typename _CharT, typename _Traits>
- /*constexpr*/ bool
- operator==(basic_string_view<_CharT, _Traits> __x,
- basic_string_view<_CharT, _Traits> __y) noexcept
- { return __x.size() == __y.size() && __x.compare(__y) == 0; }
-
- template<typename _CharT, typename _Traits>
- /*constexpr*/ bool
- operator==(basic_string_view<_CharT, _Traits> __x,
- __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept
- { return __x.size() == __y.size() && __x.compare(__y) == 0; }
-
- template<typename _CharT, typename _Traits>
- /*constexpr*/ bool
- operator==(__detail::__idt<basic_string_view<_CharT, _Traits>> __x,
- basic_string_view<_CharT, _Traits> __y) noexcept
- { return __x.size() == __y.size() && __x.compare(__y) == 0; }
-
- template<typename _CharT, typename _Traits>
- /*constexpr*/ bool
- operator!=(basic_string_view<_CharT, _Traits> __x,
- basic_string_view<_CharT, _Traits> __y) noexcept
- { return !(__x == __y); }
-
- template<typename _CharT, typename _Traits>
- /*constexpr*/ bool
- operator!=(basic_string_view<_CharT, _Traits> __x,
- __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept
- { return !(__x == __y); }
-
- template<typename _CharT, typename _Traits>
- /*constexpr*/ bool
- operator!=(__detail::__idt<basic_string_view<_CharT, _Traits>> __x,
- basic_string_view<_CharT, _Traits> __y) noexcept
- { return !(__x == __y); }
-
- template<typename _CharT, typename _Traits>
- /*constexpr*/ bool
- operator< (basic_string_view<_CharT, _Traits> __x,
- basic_string_view<_CharT, _Traits> __y) noexcept
- { return __x.compare(__y) < 0; }
-
- template<typename _CharT, typename _Traits>
- /*constexpr*/ bool
- operator< (basic_string_view<_CharT, _Traits> __x,
- __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept
- { return __x.compare(__y) < 0; }
-
- template<typename _CharT, typename _Traits>
- /*constexpr*/ bool
- operator< (__detail::__idt<basic_string_view<_CharT, _Traits>> __x,
- basic_string_view<_CharT, _Traits> __y) noexcept
- { return __x.compare(__y) < 0; }
-
- template<typename _CharT, typename _Traits>
- /*constexpr*/ bool
- operator> (basic_string_view<_CharT, _Traits> __x,
- basic_string_view<_CharT, _Traits> __y) noexcept
- { return __x.compare(__y) > 0; }
-
- template<typename _CharT, typename _Traits>
- /*constexpr*/ bool
- operator> (basic_string_view<_CharT, _Traits> __x,
- __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept
- { return __x.compare(__y) > 0; }
-
- template<typename _CharT, typename _Traits>
- /*constexpr*/ bool
- operator> (__detail::__idt<basic_string_view<_CharT, _Traits>> __x,
- basic_string_view<_CharT, _Traits> __y) noexcept
- { return __x.compare(__y) > 0; }
-
- template<typename _CharT, typename _Traits>
- /*constexpr*/ bool
- operator<=(basic_string_view<_CharT, _Traits> __x,
- basic_string_view<_CharT, _Traits> __y) noexcept
- { return __x.compare(__y) <= 0; }
-
- template<typename _CharT, typename _Traits>
- /*constexpr*/ bool
- operator<=(basic_string_view<_CharT, _Traits> __x,
- __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept
- { return __x.compare(__y) <= 0; }
-
- template<typename _CharT, typename _Traits>
- /*constexpr*/ bool
- operator<=(__detail::__idt<basic_string_view<_CharT, _Traits>> __x,
- basic_string_view<_CharT, _Traits> __y) noexcept
- { return __x.compare(__y) <= 0; }
-
- template<typename _CharT, typename _Traits>
- /*constexpr*/ bool
- operator>=(basic_string_view<_CharT, _Traits> __x,
- basic_string_view<_CharT, _Traits> __y) noexcept
- { return __x.compare(__y) >= 0; }
-
- template<typename _CharT, typename _Traits>
- /*constexpr*/ bool
- operator>=(basic_string_view<_CharT, _Traits> __x,
- __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept
- { return __x.compare(__y) >= 0; }
-
- template<typename _CharT, typename _Traits>
- /*constexpr*/ bool
- operator>=(__detail::__idt<basic_string_view<_CharT, _Traits>> __x,
- basic_string_view<_CharT, _Traits> __y) noexcept
- { return __x.compare(__y) >= 0; }
-
- // basic_string_view typedef names
-
- using string_view = basic_string_view<char>;
+template<typename _CharT, typename _Traits = std::char_traits<_CharT>>
+class basic_string_view
+{
+public:
+ // types
+ using traits_type = _Traits;
+ using value_type = _CharT;
+ using pointer = const _CharT *;
+ using const_pointer = const _CharT *;
+ using reference = const _CharT &;
+ using const_reference = const _CharT &;
+ using const_iterator = const _CharT *;
+ using iterator = const_iterator;
+ using const_reverse_iterator = std::reverse_iterator<const_iterator>;
+ using reverse_iterator = const_reverse_iterator;
+ using size_type = size_t;
+ using difference_type = ptrdiff_t;
+ static constexpr size_type npos = size_type (-1);
+
+ // [string.view.cons], construct/copy
+
+ constexpr basic_string_view () noexcept : _M_len { 0 }, _M_str { nullptr } {}
+
+ constexpr basic_string_view (const basic_string_view &) noexcept = default;
+
+ template<typename _Allocator>
+ basic_string_view (
+ const std::basic_string<_CharT, _Traits, _Allocator> &__str) noexcept
+ : _M_len { __str.length () },
+ _M_str { __str.data () }
+ {
+ }
+
+ /*constexpr*/ basic_string_view (const _CharT *__str)
+ : _M_len { __str == nullptr ? 0 : traits_type::length (__str) },
+ _M_str { __str }
+ {
+ }
+
+ constexpr basic_string_view (const _CharT *__str, size_type __len)
+ : _M_len { __len },
+ _M_str { __str }
+ {
+ }
+
+ basic_string_view &operator= (const basic_string_view &) noexcept = default;
+
+ // [string.view.iterators], iterators
+
+ constexpr const_iterator begin () const noexcept { return this->_M_str; }
+
+ constexpr const_iterator end () const noexcept
+ {
+ return this->_M_str + this->_M_len;
+ }
+
+ constexpr const_iterator cbegin () const noexcept { return this->_M_str; }
+
+ constexpr const_iterator cend () const noexcept
+ {
+ return this->_M_str + this->_M_len;
+ }
+
+ const_reverse_iterator rbegin () const noexcept
+ {
+ return const_reverse_iterator (this->end ());
+ }
+
+ const_reverse_iterator rend () const noexcept
+ {
+ return const_reverse_iterator (this->begin ());
+ }
+
+ const_reverse_iterator crbegin () const noexcept
+ {
+ return const_reverse_iterator (this->end ());
+ }
+
+ const_reverse_iterator crend () const noexcept
+ {
+ return const_reverse_iterator (this->begin ());
+ }
+
+ // [string.view.capacity], capacity
+
+ constexpr size_type size () const noexcept { return this->_M_len; }
+
+ constexpr size_type length () const noexcept { return _M_len; }
+
+ constexpr size_type max_size () const noexcept
+ {
+ return (npos - sizeof (size_type) - sizeof (void *)) / sizeof (value_type)
+ / 4;
+ }
+
+ constexpr bool empty () const noexcept { return this->_M_len == 0; }
+
+ // [string.view.access], element access
+
+ constexpr const _CharT &operator[] (size_type __pos) const
+ {
+ // TODO: Assert to restore in a way compatible with the constexpr.
+ // __glibcxx_assert(__pos < this->_M_len);
+ return *(this->_M_str + __pos);
+ }
+
+ constexpr const _CharT &at (size_type __pos) const
+ {
+ return __pos < this->_M_len ? *(this->_M_str + __pos)
+ : (error (_ ("basic_string_view::at: __pos "
+ "(which is %zu) >= this->size() "
+ "(which is %zu)"),
+ __pos, this->size ()),
+ *this->_M_str);
+ }
+
+ constexpr const _CharT &front () const
+ {
+ // TODO: Assert to restore in a way compatible with the constexpr.
+ // __glibcxx_assert(this->_M_len > 0);
+ return *this->_M_str;
+ }
+
+ constexpr const _CharT &back () const
+ {
+ // TODO: Assert to restore in a way compatible with the constexpr.
+ // __glibcxx_assert(this->_M_len > 0);
+ return *(this->_M_str + this->_M_len - 1);
+ }
+
+ constexpr const _CharT *data () const noexcept { return this->_M_str; }
+
+ // [string.view.modifiers], modifiers:
+
+ /*constexpr*/ void remove_prefix (size_type __n)
+ {
+ gdb_assert (this->_M_len >= __n);
+ this->_M_str += __n;
+ this->_M_len -= __n;
+ }
+
+ /*constexpr*/ void remove_suffix (size_type __n) { this->_M_len -= __n; }
+
+ /*constexpr*/ void swap (basic_string_view &__sv) noexcept
+ {
+ auto __tmp = *this;
+ *this = __sv;
+ __sv = __tmp;
+ }
+
+ // [string.view.ops], string operations:
+
+ template<typename _Allocator>
+ explicit operator std::basic_string<_CharT, _Traits, _Allocator> () const
+ {
+ return { this->_M_str, this->_M_len };
+ }
+
+ size_type copy (_CharT *__str, size_type __n, size_type __pos = 0) const
+ {
+ gdb_assert (__str != nullptr || __n == 0);
+ if (__pos > this->_M_len)
+ error (_ ("basic_string_view::copy: __pos "
+ "(which is %zu) > this->size() "
+ "(which is %zu)"),
+ __pos, this->size ());
+ size_type __rlen { std::min (__n, size_type { this->_M_len - __pos }) };
+ for (auto __begin = this->_M_str + __pos, __end = __begin + __rlen;
+ __begin != __end;)
+ *__str++ = *__begin++;
+ return __rlen;
+ }
+
+ // [string.view.ops], string operations:
+
+ /*constexpr*/ basic_string_view substr (size_type __pos,
+ size_type __n = npos) const
+ {
+ return __pos <= this->_M_len
+ ? basic_string_view { this->_M_str + __pos,
+ std::min (__n, size_type { this->_M_len
+ - __pos }) }
+ : (error (_ ("basic_string_view::substr: __pos "
+ "(which is %zu) > this->size() "
+ "(which is %zu)"),
+ __pos, this->size ()),
+ basic_string_view {});
+ }
+
+ /*constexpr*/ int compare (basic_string_view __str) const noexcept
+ {
+ int __ret = traits_type::compare (this->_M_str, __str._M_str,
+ std::min (this->_M_len, __str._M_len));
+ if (__ret == 0)
+ __ret = _S_compare (this->_M_len, __str._M_len);
+ return __ret;
+ }
+
+ /*constexpr*/ int compare (size_type __pos1, size_type __n1,
+ basic_string_view __str) const
+ {
+ return this->substr (__pos1, __n1).compare (__str);
+ }
+
+ /*constexpr*/ int compare (size_type __pos1, size_type __n1,
+ basic_string_view __str, size_type __pos2,
+ size_type __n2) const
+ {
+ return this->substr (__pos1, __n1).compare (__str.substr (__pos2, __n2));
+ }
+
+ /*constexpr*/ int compare (const _CharT *__str) const noexcept
+ {
+ return this->compare (basic_string_view { __str });
+ }
+
+ /*constexpr*/ int compare (size_type __pos1, size_type __n1,
+ const _CharT *__str) const
+ {
+ return this->substr (__pos1, __n1).compare (basic_string_view { __str });
+ }
+
+ /*constexpr*/ int compare (size_type __pos1, size_type __n1,
+ const _CharT *__str, size_type __n2) const
+ {
+ return this->substr (__pos1, __n1)
+ .compare (basic_string_view (__str, __n2));
+ }
+
+ /*constexpr*/ size_type find (basic_string_view __str,
+ size_type __pos = 0) const noexcept
+ {
+ return this->find (__str._M_str, __pos, __str._M_len);
+ }
+
+ /*constexpr*/ size_type find (_CharT __c,
+ size_type __pos = 0) const noexcept;
+
+ /*constexpr*/ size_type find (const _CharT *__str, size_type __pos,
+ size_type __n) const noexcept;
+
+ /*constexpr*/ size_type find (const _CharT *__str,
+ size_type __pos = 0) const noexcept
+ {
+ return this->find (__str, __pos, traits_type::length (__str));
+ }
+
+ /*constexpr*/ size_type rfind (basic_string_view __str,
+ size_type __pos = npos) const noexcept
+ {
+ return this->rfind (__str._M_str, __pos, __str._M_len);
+ }
+
+ /*constexpr*/ size_type rfind (_CharT __c,
+ size_type __pos = npos) const noexcept;
+
+ /*constexpr*/ size_type rfind (const _CharT *__str, size_type __pos,
+ size_type __n) const noexcept;
+
+ /*constexpr*/ size_type rfind (const _CharT *__str,
+ size_type __pos = npos) const noexcept
+ {
+ return this->rfind (__str, __pos, traits_type::length (__str));
+ }
+
+ /*constexpr*/ size_type find_first_of (basic_string_view __str,
+ size_type __pos = 0) const noexcept
+ {
+ return this->find_first_of (__str._M_str, __pos, __str._M_len);
+ }
+
+ /*constexpr*/ size_type find_first_of (_CharT __c,
+ size_type __pos = 0) const noexcept
+ {
+ return this->find (__c, __pos);
+ }
+
+ /*constexpr*/ size_type find_first_of (const _CharT *__str, size_type __pos,
+ size_type __n) const;
+
+ /*constexpr*/ size_type find_first_of (const _CharT *__str,
+ size_type __pos = 0) const noexcept
+ {
+ return this->find_first_of (__str, __pos, traits_type::length (__str));
+ }
+
+ /*constexpr*/ size_type find_last_of (basic_string_view __str,
+ size_type __pos = npos) const noexcept
+ {
+ return this->find_last_of (__str._M_str, __pos, __str._M_len);
+ }
+
+ size_type find_last_of (_CharT __c, size_type __pos = npos) const noexcept
+ {
+ return this->rfind (__c, __pos);
+ }
+
+ /*constexpr*/ size_type find_last_of (const _CharT *__str, size_type __pos,
+ size_type __n) const;
+
+ /*constexpr*/ size_type find_last_of (const _CharT *__str,
+ size_type __pos = npos) const noexcept
+ {
+ return this->find_last_of (__str, __pos, traits_type::length (__str));
+ }
+
+ /*constexpr*/ size_type find_first_not_of (basic_string_view __str,
+ size_type __pos
+ = 0) const noexcept
+ {
+ return this->find_first_not_of (__str._M_str, __pos, __str._M_len);
+ }
+
+ /*constexpr*/ size_type find_first_not_of (_CharT __c, size_type __pos
+ = 0) const noexcept;
+
+ /*constexpr*/ size_type find_first_not_of (const _CharT *__str,
+ size_type __pos,
+ size_type __n) const;
+
+ /*constexpr*/ size_type
+ find_first_not_of (const _CharT *__str, size_type __pos = 0) const noexcept
+ {
+ return this->find_first_not_of (__str, __pos, traits_type::length (__str));
+ }
+
+ /*constexpr*/ size_type find_last_not_of (basic_string_view __str,
+ size_type __pos
+ = npos) const noexcept
+ {
+ return this->find_last_not_of (__str._M_str, __pos, __str._M_len);
+ }
+
+ /*constexpr*/ size_type find_last_not_of (_CharT __c, size_type __pos
+ = npos) const noexcept;
+
+ /*constexpr*/ size_type
+ find_last_not_of (const _CharT *__str, size_type __pos, size_type __n) const;
+
+ /*constexpr*/ size_type
+ find_last_not_of (const _CharT *__str, size_type __pos = npos) const noexcept
+ {
+ return this->find_last_not_of (__str, __pos, traits_type::length (__str));
+ }
+
+private:
+ static constexpr int _S_compare (size_type __n1, size_type __n2) noexcept
+ {
+ return difference_type (__n1 - __n2) > std::numeric_limits<int>::max ()
+ ? std::numeric_limits<int>::max ()
+ : difference_type (__n1 - __n2) < std::numeric_limits<int>::min ()
+ ? std::numeric_limits<int>::min ()
+ : static_cast<int> (difference_type (__n1 - __n2));
+ }
+
+ size_t _M_len;
+ const _CharT *_M_str;
+};
+
+// [string.view.comparison], non-member basic_string_view comparison functions
+
+namespace __detail
+{
+// Identity transform to create a non-deduced context, so that only one
+// argument participates in template argument deduction and the other
+// argument gets implicitly converted to the deduced type. See n3766.html.
+template<typename _Tp>
+using __idt = typename std::common_type<_Tp>::type;
+} // namespace __detail
+
+template<typename _CharT, typename _Traits>
+/*constexpr*/ bool
+operator== (basic_string_view<_CharT, _Traits> __x,
+ basic_string_view<_CharT, _Traits> __y) noexcept
+{
+ return __x.size () == __y.size () && __x.compare (__y) == 0;
+}
+
+template<typename _CharT, typename _Traits>
+/*constexpr*/ bool
+operator== (basic_string_view<_CharT, _Traits> __x,
+ __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept
+{
+ return __x.size () == __y.size () && __x.compare (__y) == 0;
+}
+
+template<typename _CharT, typename _Traits>
+/*constexpr*/ bool
+operator== (__detail::__idt<basic_string_view<_CharT, _Traits>> __x,
+ basic_string_view<_CharT, _Traits> __y) noexcept
+{
+ return __x.size () == __y.size () && __x.compare (__y) == 0;
+}
+
+template<typename _CharT, typename _Traits>
+/*constexpr*/ bool
+operator!= (basic_string_view<_CharT, _Traits> __x,
+ basic_string_view<_CharT, _Traits> __y) noexcept
+{
+ return !(__x == __y);
+}
+
+template<typename _CharT, typename _Traits>
+/*constexpr*/ bool
+operator!= (basic_string_view<_CharT, _Traits> __x,
+ __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept
+{
+ return !(__x == __y);
+}
+
+template<typename _CharT, typename _Traits>
+/*constexpr*/ bool
+operator!= (__detail::__idt<basic_string_view<_CharT, _Traits>> __x,
+ basic_string_view<_CharT, _Traits> __y) noexcept
+{
+ return !(__x == __y);
+}
+
+template<typename _CharT, typename _Traits>
+/*constexpr*/ bool
+operator<(basic_string_view<_CharT, _Traits> __x,
+ basic_string_view<_CharT, _Traits> __y) noexcept
+{
+ return __x.compare (__y) < 0;
+}
+
+template<typename _CharT, typename _Traits>
+/*constexpr*/ bool
+operator<(basic_string_view<_CharT, _Traits> __x,
+ __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept
+{
+ return __x.compare (__y) < 0;
+}
+
+template<typename _CharT, typename _Traits>
+/*constexpr*/ bool
+operator<(__detail::__idt<basic_string_view<_CharT, _Traits>> __x,
+ basic_string_view<_CharT, _Traits> __y) noexcept
+{
+ return __x.compare (__y) < 0;
+}
+
+template<typename _CharT, typename _Traits>
+/*constexpr*/ bool
+operator> (basic_string_view<_CharT, _Traits> __x,
+ basic_string_view<_CharT, _Traits> __y) noexcept
+{
+ return __x.compare (__y) > 0;
+}
+
+template<typename _CharT, typename _Traits>
+/*constexpr*/ bool
+operator> (basic_string_view<_CharT, _Traits> __x,
+ __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept
+{
+ return __x.compare (__y) > 0;
+}
+
+template<typename _CharT, typename _Traits>
+/*constexpr*/ bool
+operator> (__detail::__idt<basic_string_view<_CharT, _Traits>> __x,
+ basic_string_view<_CharT, _Traits> __y) noexcept
+{
+ return __x.compare (__y) > 0;
+}
+
+template<typename _CharT, typename _Traits>
+/*constexpr*/ bool
+operator<= (basic_string_view<_CharT, _Traits> __x,
+ basic_string_view<_CharT, _Traits> __y) noexcept
+{
+ return __x.compare (__y) <= 0;
+}
+
+template<typename _CharT, typename _Traits>
+/*constexpr*/ bool
+operator<= (basic_string_view<_CharT, _Traits> __x,
+ __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept
+{
+ return __x.compare (__y) <= 0;
+}
+
+template<typename _CharT, typename _Traits>
+/*constexpr*/ bool
+operator<= (__detail::__idt<basic_string_view<_CharT, _Traits>> __x,
+ basic_string_view<_CharT, _Traits> __y) noexcept
+{
+ return __x.compare (__y) <= 0;
+}
+
+template<typename _CharT, typename _Traits>
+/*constexpr*/ bool
+operator>= (basic_string_view<_CharT, _Traits> __x,
+ basic_string_view<_CharT, _Traits> __y) noexcept
+{
+ return __x.compare (__y) >= 0;
+}
+
+template<typename _CharT, typename _Traits>
+/*constexpr*/ bool
+operator>= (basic_string_view<_CharT, _Traits> __x,
+ __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept
+{
+ return __x.compare (__y) >= 0;
+}
+
+template<typename _CharT, typename _Traits>
+/*constexpr*/ bool
+operator>= (__detail::__idt<basic_string_view<_CharT, _Traits>> __x,
+ basic_string_view<_CharT, _Traits> __y) noexcept
+{
+ return __x.compare (__y) >= 0;
+}
+
+// basic_string_view typedef names
+
+using string_view = basic_string_view<char>;
} /* namespace gdb */
#include "gdb_string_view.tcc"
#endif // __cplusplus < 201703L
-namespace gdb {
+namespace gdb
+{
static inline std::string
-to_string(const gdb::string_view &view)
+to_string (const gdb::string_view &view)
{
return { view.data (), view.size () };
}
-}
+} // namespace gdb
#endif /* COMMON_GDB_STRING_VIEW_H */