Medial Code Documentation
Loading...
Searching...
No Matches
string_view.h
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
14namespace xgboost {
15struct 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
27 using const_reverse_iterator = reverse_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
69inline std::ostream& operator<<(std::ostream& os, StringView const v) {
70 for (auto c : v) {
71 os.put(c);
72 }
73 return os;
74}
75
76inline 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
83inline bool operator!=(StringView l, StringView r) { return !(l == r); }
84
85inline bool operator<(StringView l, StringView r) {
86 return common::Span<StringView::value_type const>{l.c_str(), l.size()} <
87 common::Span<StringView::value_type const>{r.c_str(), r.size()};
88}
89
90inline bool operator<(std::string const& l, StringView r) { return StringView{l} < r; }
91
92inline bool operator<(StringView l, std::string const& r) { return l < StringView{r}; }
93} // namespace xgboost
94#endif // XGBOOST_STRING_VIEW_H_
defines console logging options for xgboost. Use to enforce unified print behavior.
bool operator<(const value_t lhs, const value_t rhs) noexcept
comparison operator for JSON types
Definition json.hpp:2889
namespace of xgboost
Definition base.h:90
Definition string_view.h:15