xgboost
string_view.h
Go to the documentation of this file.
1 
4 #ifndef XGBOOST_STRING_VIEW_H_
5 #define XGBOOST_STRING_VIEW_H_
6 #include <xgboost/logging.h> // CHECK_LT
7 #include <xgboost/span.h> // Span
8 
9 #include <algorithm> // std::equal,std::min
10 #include <iterator> // std::reverse_iterator
11 #include <ostream> // std::ostream
12 #include <string> // std::char_traits,std::string
13 
14 namespace xgboost {
15 struct StringView {
16  private:
17  using CharT = char; // unsigned char
18  using Traits = std::char_traits<CharT>;
19  CharT const* str_{nullptr};
20  size_t size_{0};
21 
22  public:
23  using value_type = CharT; // NOLINT
24  using iterator = const CharT*; // NOLINT
25  using const_iterator = iterator; // NOLINT
26  using reverse_iterator = std::reverse_iterator<const_iterator>; // NOLINT
28 
29  public:
30  constexpr StringView() = default;
31  constexpr StringView(CharT const* str, std::size_t size) : str_{str}, size_{size} {}
32  explicit StringView(std::string const& str) : str_{str.c_str()}, size_{str.size()} {}
33  constexpr StringView(CharT const* str) // NOLINT
34  : str_{str}, size_{str == nullptr ? 0ul : Traits::length(str)} {}
35 
36  CharT const& operator[](size_t p) const { return str_[p]; }
37  CharT const& at(size_t p) const { // NOLINT
38  CHECK_LT(p, size_);
39  return str_[p];
40  }
41  constexpr std::size_t size() const { return size_; } // NOLINT
42  constexpr bool empty() const { return size() == 0; } // NOLINT
43  StringView substr(size_t beg, size_t n) const { // NOLINT
44  CHECK_LE(beg, size_);
45  size_t len = std::min(n, size_ - beg);
46  return {str_ + beg, len};
47  }
48  CharT const* c_str() const { return str_; } // NOLINT
49 
50  constexpr CharT const* cbegin() const { return str_; } // NOLINT
51  constexpr CharT const* cend() const { return str_ + size(); } // NOLINT
52  constexpr CharT const* begin() const { return str_; } // NOLINT
53  constexpr CharT const* end() const { return str_ + size(); } // NOLINT
54 
55  const_reverse_iterator rbegin() const noexcept { // NOLINT
56  return const_reverse_iterator(this->end());
57  }
58  const_reverse_iterator crbegin() const noexcept { // NOLINT
59  return const_reverse_iterator(this->end());
60  }
61  const_reverse_iterator rend() const noexcept { // NOLINT
62  return const_reverse_iterator(this->begin());
63  }
64  const_reverse_iterator crend() const noexcept { // NOLINT
65  return const_reverse_iterator(this->begin());
66  }
67 };
68 
69 inline std::ostream& operator<<(std::ostream& os, StringView const v) {
70  for (auto c : v) {
71  os.put(c);
72  }
73  return os;
74 }
75 
76 inline bool operator==(StringView l, StringView r) {
77  if (l.size() != r.size()) {
78  return false;
79  }
80  return std::equal(l.cbegin(), l.cend(), r.cbegin());
81 }
82 
83 inline bool operator!=(StringView l, StringView r) { return !(l == r); }
84 
85 inline bool operator<(StringView l, StringView r) {
88 }
89 
90 inline bool operator<(std::string const& l, StringView r) { return StringView{l} < r; }
91 
92 inline bool operator<(StringView l, std::string const& r) { return l < StringView{r}; }
93 } // namespace xgboost
94 #endif // XGBOOST_STRING_VIEW_H_
span class implementation, based on ISO++20 span<T>. The interface should be the same.
Definition: span.h:424
namespace of xgboost
Definition: base.h:90
bool operator!=(IntrusivePtr< T > const &x, IntrusivePtr< U > const &y) noexcept
Definition: intrusive_ptr.h:155
bool operator==(IntrusivePtr< T > const &x, IntrusivePtr< U > const &y) noexcept
Definition: intrusive_ptr.h:150
bool operator<(IntrusivePtr< T > const &x, IntrusivePtr< T > const &y) noexcept
Definition: intrusive_ptr.h:180
std::basic_ostream< E, T > & operator<<(std::basic_ostream< E, T > &os, IntrusivePtr< Y > const &p)
Definition: intrusive_ptr.h:200
Definition: string_view.h:15
const_reverse_iterator rbegin() const noexcept
Definition: string_view.h:55
StringView(std::string const &str)
Definition: string_view.h:32
const CharT * iterator
Definition: string_view.h:24
constexpr bool empty() const
Definition: string_view.h:42
CharT value_type
Definition: string_view.h:23
constexpr CharT const * end() const
Definition: string_view.h:53
CharT const * c_str() const
Definition: string_view.h:48
constexpr StringView()=default
reverse_iterator const_reverse_iterator
Definition: string_view.h:27
const_reverse_iterator rend() const noexcept
Definition: string_view.h:61
StringView substr(size_t beg, size_t n) const
Definition: string_view.h:43
std::reverse_iterator< const_iterator > reverse_iterator
Definition: string_view.h:26
constexpr CharT const * cbegin() const
Definition: string_view.h:50
constexpr StringView(CharT const *str)
Definition: string_view.h:33
constexpr CharT const * begin() const
Definition: string_view.h:52
CharT const & operator[](size_t p) const
Definition: string_view.h:36
constexpr StringView(CharT const *str, std::size_t size)
Definition: string_view.h:31
const_reverse_iterator crbegin() const noexcept
Definition: string_view.h:58
CharT const & at(size_t p) const
Definition: string_view.h:37
constexpr CharT const * cend() const
Definition: string_view.h:51
iterator const_iterator
Definition: string_view.h:25
const_reverse_iterator crend() const noexcept
Definition: string_view.h:64
constexpr std::size_t size() const
Definition: string_view.h:41