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>
7 #include <xgboost/span.h>
8 
9 #include <algorithm>
10 #include <iterator>
11 #include <ostream>
12 #include <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, size_t size) : str_{str}, size_{size} {}
32  explicit StringView(std::string const& str) : str_{str.c_str()}, size_{str.size()} {}
33  StringView(CharT const* str) : str_{str}, size_{Traits::length(str)} {} // NOLINT
34 
35  CharT const& operator[](size_t p) const { return str_[p]; }
36  CharT const& at(size_t p) const { // NOLINT
37  CHECK_LT(p, size_);
38  return str_[p];
39  }
40  constexpr size_t size() const { return size_; } // NOLINT
41  StringView substr(size_t beg, size_t n) const { // NOLINT
42  CHECK_LE(beg, size_);
43  size_t len = std::min(n, size_ - beg);
44  return {str_ + beg, len};
45  }
46  CharT const* c_str() const { return str_; } // NOLINT
47 
48  constexpr CharT const* cbegin() const { return str_; } // NOLINT
49  constexpr CharT const* cend() const { return str_ + size(); } // NOLINT
50  constexpr CharT const* begin() const { return str_; } // NOLINT
51  constexpr CharT const* end() const { return str_ + size(); } // NOLINT
52 
53  const_reverse_iterator rbegin() const noexcept { // NOLINT
54  return const_reverse_iterator(this->end());
55  }
56  const_reverse_iterator crbegin() const noexcept { // NOLINT
57  return const_reverse_iterator(this->end());
58  }
59  const_reverse_iterator rend() const noexcept { // NOLINT
60  return const_reverse_iterator(this->begin());
61  }
62  const_reverse_iterator crend() const noexcept { // NOLINT
63  return const_reverse_iterator(this->begin());
64  }
65 };
66 
67 inline std::ostream& operator<<(std::ostream& os, StringView const v) {
68  for (auto c : v) {
69  os.put(c);
70  }
71  return os;
72 }
73 
74 inline bool operator==(StringView l, StringView r) {
75  if (l.size() != r.size()) {
76  return false;
77  }
78  return std::equal(l.cbegin(), l.cend(), r.cbegin());
79 }
80 
81 inline bool operator!=(StringView l, StringView r) { return !(l == r); }
82 
83 inline bool operator<(StringView l, StringView r) {
86 }
87 
88 inline bool operator<(std::string const& l, StringView r) { return StringView{l} < r; }
89 
90 inline bool operator<(StringView l, std::string const& r) { return l < StringView{r}; }
91 } // namespace xgboost
92 #endif // XGBOOST_STRING_VIEW_H_
span class implementation, based on ISO++20 span<T>. The interface should be the same.
Definition: span.h:423
namespace of xgboost
Definition: base.h:110
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:53
StringView(std::string const &str)
Definition: string_view.h:32
const CharT * iterator
Definition: string_view.h:24
StringView(CharT const *str)
Definition: string_view.h:33
CharT value_type
Definition: string_view.h:23
constexpr CharT const * end() const
Definition: string_view.h:51
CharT const * c_str() const
Definition: string_view.h:46
constexpr StringView()=default
reverse_iterator const_reverse_iterator
Definition: string_view.h:27
const_reverse_iterator rend() const noexcept
Definition: string_view.h:59
StringView substr(size_t beg, size_t n) const
Definition: string_view.h:41
std::reverse_iterator< const_iterator > reverse_iterator
Definition: string_view.h:26
constexpr CharT const * cbegin() const
Definition: string_view.h:48
constexpr CharT const * begin() const
Definition: string_view.h:50
CharT const & operator[](size_t p) const
Definition: string_view.h:35
constexpr StringView(CharT const *str, size_t size)
Definition: string_view.h:31
const_reverse_iterator crbegin() const noexcept
Definition: string_view.h:56
CharT const & at(size_t p) const
Definition: string_view.h:36
constexpr CharT const * cend() const
Definition: string_view.h:49
iterator const_iterator
Definition: string_view.h:25
const_reverse_iterator crend() const noexcept
Definition: string_view.h:62
constexpr size_t size() const
Definition: string_view.h:40