jsoncons 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. checksums.yaml +7 -0
  2. data/ext/jsoncons/extconf.rb +43 -0
  3. data/ext/jsoncons/jsoncons.cpp +161 -0
  4. data/ext/jsoncons/jsoncons.h +10 -0
  5. data/jsoncons.gemspec +44 -0
  6. data/lib/jsoncons/jsoncons/examples/input/address-book.json +13 -0
  7. data/lib/jsoncons/jsoncons/examples/input/books.json +28 -0
  8. data/lib/jsoncons/jsoncons/examples/input/countries.json +7 -0
  9. data/lib/jsoncons/jsoncons/examples/input/employees.json +30 -0
  10. data/lib/jsoncons/jsoncons/examples/input/jsonschema/name.json +15 -0
  11. data/lib/jsoncons/jsoncons/examples/input/multiple-json-objects.json +3 -0
  12. data/lib/jsoncons/jsoncons/examples/input/sales.csv +6 -0
  13. data/lib/jsoncons/jsoncons/examples/input/store.json +28 -0
  14. data/lib/jsoncons/jsoncons/examples/input/tasks.csv +6 -0
  15. data/lib/jsoncons/jsoncons/include/jsoncons/allocator_holder.hpp +38 -0
  16. data/lib/jsoncons/jsoncons/include/jsoncons/basic_json.hpp +5905 -0
  17. data/lib/jsoncons/jsoncons/include/jsoncons/bigint.hpp +1611 -0
  18. data/lib/jsoncons/jsoncons/include/jsoncons/byte_string.hpp +820 -0
  19. data/lib/jsoncons/jsoncons/include/jsoncons/config/binary_config.hpp +226 -0
  20. data/lib/jsoncons/jsoncons/include/jsoncons/config/compiler_support.hpp +375 -0
  21. data/lib/jsoncons/jsoncons/include/jsoncons/config/jsoncons_config.hpp +309 -0
  22. data/lib/jsoncons/jsoncons/include/jsoncons/config/version.hpp +40 -0
  23. data/lib/jsoncons/jsoncons/include/jsoncons/conv_error.hpp +218 -0
  24. data/lib/jsoncons/jsoncons/include/jsoncons/decode_json.hpp +209 -0
  25. data/lib/jsoncons/jsoncons/include/jsoncons/decode_traits.hpp +651 -0
  26. data/lib/jsoncons/jsoncons/include/jsoncons/detail/endian.hpp +44 -0
  27. data/lib/jsoncons/jsoncons/include/jsoncons/detail/grisu3.hpp +312 -0
  28. data/lib/jsoncons/jsoncons/include/jsoncons/detail/optional.hpp +483 -0
  29. data/lib/jsoncons/jsoncons/include/jsoncons/detail/parse_number.hpp +1133 -0
  30. data/lib/jsoncons/jsoncons/include/jsoncons/detail/span.hpp +188 -0
  31. data/lib/jsoncons/jsoncons/include/jsoncons/detail/string_view.hpp +537 -0
  32. data/lib/jsoncons/jsoncons/include/jsoncons/detail/string_wrapper.hpp +370 -0
  33. data/lib/jsoncons/jsoncons/include/jsoncons/detail/write_number.hpp +567 -0
  34. data/lib/jsoncons/jsoncons/include/jsoncons/encode_json.hpp +315 -0
  35. data/lib/jsoncons/jsoncons/include/jsoncons/encode_traits.hpp +378 -0
  36. data/lib/jsoncons/jsoncons/include/jsoncons/json.hpp +18 -0
  37. data/lib/jsoncons/jsoncons/include/jsoncons/json_array.hpp +324 -0
  38. data/lib/jsoncons/jsoncons/include/jsoncons/json_content_handler.hpp +12 -0
  39. data/lib/jsoncons/jsoncons/include/jsoncons/json_cursor.hpp +448 -0
  40. data/lib/jsoncons/jsoncons/include/jsoncons/json_decoder.hpp +420 -0
  41. data/lib/jsoncons/jsoncons/include/jsoncons/json_encoder.hpp +1587 -0
  42. data/lib/jsoncons/jsoncons/include/jsoncons/json_error.hpp +156 -0
  43. data/lib/jsoncons/jsoncons/include/jsoncons/json_exception.hpp +241 -0
  44. data/lib/jsoncons/jsoncons/include/jsoncons/json_filter.hpp +653 -0
  45. data/lib/jsoncons/jsoncons/include/jsoncons/json_fwd.hpp +23 -0
  46. data/lib/jsoncons/jsoncons/include/jsoncons/json_object.hpp +1772 -0
  47. data/lib/jsoncons/jsoncons/include/jsoncons/json_options.hpp +862 -0
  48. data/lib/jsoncons/jsoncons/include/jsoncons/json_parser.hpp +2900 -0
  49. data/lib/jsoncons/jsoncons/include/jsoncons/json_reader.hpp +731 -0
  50. data/lib/jsoncons/jsoncons/include/jsoncons/json_traits_macros.hpp +1072 -0
  51. data/lib/jsoncons/jsoncons/include/jsoncons/json_traits_macros_deprecated.hpp +144 -0
  52. data/lib/jsoncons/jsoncons/include/jsoncons/json_type.hpp +206 -0
  53. data/lib/jsoncons/jsoncons/include/jsoncons/json_type_traits.hpp +1830 -0
  54. data/lib/jsoncons/jsoncons/include/jsoncons/json_visitor.hpp +1560 -0
  55. data/lib/jsoncons/jsoncons/include/jsoncons/json_visitor2.hpp +2079 -0
  56. data/lib/jsoncons/jsoncons/include/jsoncons/pretty_print.hpp +89 -0
  57. data/lib/jsoncons/jsoncons/include/jsoncons/ser_context.hpp +62 -0
  58. data/lib/jsoncons/jsoncons/include/jsoncons/sink.hpp +289 -0
  59. data/lib/jsoncons/jsoncons/include/jsoncons/source.hpp +777 -0
  60. data/lib/jsoncons/jsoncons/include/jsoncons/source_adaptor.hpp +148 -0
  61. data/lib/jsoncons/jsoncons/include/jsoncons/staj2_cursor.hpp +1189 -0
  62. data/lib/jsoncons/jsoncons/include/jsoncons/staj_cursor.hpp +1254 -0
  63. data/lib/jsoncons/jsoncons/include/jsoncons/staj_iterator.hpp +449 -0
  64. data/lib/jsoncons/jsoncons/include/jsoncons/tag_type.hpp +245 -0
  65. data/lib/jsoncons/jsoncons/include/jsoncons/text_source_adaptor.hpp +144 -0
  66. data/lib/jsoncons/jsoncons/include/jsoncons/traits_extension.hpp +884 -0
  67. data/lib/jsoncons/jsoncons/include/jsoncons/typed_array_view.hpp +250 -0
  68. data/lib/jsoncons/jsoncons/include/jsoncons/unicode_traits.hpp +1330 -0
  69. data/lib/jsoncons/jsoncons/include/jsoncons/uri.hpp +635 -0
  70. data/lib/jsoncons/jsoncons/include/jsoncons/value_converter.hpp +340 -0
  71. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson.hpp +23 -0
  72. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_cursor.hpp +320 -0
  73. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_decimal128.hpp +865 -0
  74. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_encoder.hpp +585 -0
  75. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_error.hpp +103 -0
  76. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_oid.hpp +245 -0
  77. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_options.hpp +75 -0
  78. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_parser.hpp +645 -0
  79. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_reader.hpp +92 -0
  80. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_type.hpp +44 -0
  81. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/decode_bson.hpp +201 -0
  82. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/encode_bson.hpp +144 -0
  83. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor.hpp +26 -0
  84. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_cursor.hpp +351 -0
  85. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_cursor2.hpp +265 -0
  86. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_detail.hpp +93 -0
  87. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_encoder.hpp +1766 -0
  88. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_error.hpp +105 -0
  89. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_options.hpp +113 -0
  90. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_parser.hpp +1942 -0
  91. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_reader.hpp +116 -0
  92. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/decode_cbor.hpp +203 -0
  93. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/encode_cbor.hpp +151 -0
  94. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv.hpp +17 -0
  95. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_cursor.hpp +358 -0
  96. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_encoder.hpp +954 -0
  97. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_error.hpp +85 -0
  98. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_options.hpp +973 -0
  99. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_parser.hpp +2099 -0
  100. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_reader.hpp +348 -0
  101. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_serializer.hpp +12 -0
  102. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/decode_csv.hpp +208 -0
  103. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/encode_csv.hpp +122 -0
  104. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jmespath/jmespath.hpp +5215 -0
  105. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jmespath/jmespath_error.hpp +215 -0
  106. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpatch/jsonpatch.hpp +579 -0
  107. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpatch/jsonpatch_error.hpp +121 -0
  108. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/expression.hpp +3329 -0
  109. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/flatten.hpp +432 -0
  110. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/json_location.hpp +445 -0
  111. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/json_query.hpp +115 -0
  112. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath.hpp +13 -0
  113. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_error.hpp +240 -0
  114. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_expression.hpp +2612 -0
  115. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_selector.hpp +1322 -0
  116. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpointer/jsonpointer.hpp +1577 -0
  117. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpointer/jsonpointer_error.hpp +119 -0
  118. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/format_validator.hpp +968 -0
  119. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/json_validator.hpp +120 -0
  120. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema.hpp +13 -0
  121. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema_error.hpp +105 -0
  122. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema_version.hpp +18 -0
  123. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/keyword_validator.hpp +1745 -0
  124. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/keyword_validator_factory.hpp +556 -0
  125. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_draft7.hpp +198 -0
  126. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_location.hpp +200 -0
  127. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_version.hpp +35 -0
  128. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/subschema.hpp +144 -0
  129. data/lib/jsoncons/jsoncons/include/jsoncons_ext/mergepatch/mergepatch.hpp +103 -0
  130. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/decode_msgpack.hpp +202 -0
  131. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/encode_msgpack.hpp +142 -0
  132. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack.hpp +24 -0
  133. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_cursor.hpp +343 -0
  134. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_cursor2.hpp +259 -0
  135. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_encoder.hpp +753 -0
  136. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_error.hpp +94 -0
  137. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_options.hpp +74 -0
  138. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_parser.hpp +748 -0
  139. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_reader.hpp +116 -0
  140. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_type.hpp +63 -0
  141. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/decode_ubjson.hpp +201 -0
  142. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/encode_ubjson.hpp +142 -0
  143. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson.hpp +23 -0
  144. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_cursor.hpp +307 -0
  145. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_encoder.hpp +502 -0
  146. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_error.hpp +100 -0
  147. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_options.hpp +87 -0
  148. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_parser.hpp +880 -0
  149. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_reader.hpp +92 -0
  150. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_type.hpp +43 -0
  151. data/lib/jsoncons/version.rb +5 -0
  152. data/lib/jsoncons.rb +33 -0
  153. data/test/jsoncons_test.rb +108 -0
  154. data/test/test_helper.rb +7 -0
  155. metadata +268 -0
@@ -0,0 +1,537 @@
1
+ // Copyright 2019 Daniel Parker
2
+ // Distributed under the Boost license, Version 1.0.
3
+ // (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
4
+
5
+ // See https://github.com/danielaparker/jsoncons for latest version
6
+
7
+ #ifndef JSONCONS_STRING_VIEW_HPP
8
+ #define JSONCONS_STRING_VIEW_HPP
9
+
10
+ #include <stdexcept>
11
+ #include <string>
12
+ #include <vector>
13
+ #include <ostream>
14
+ #include <cmath>
15
+ #include <algorithm> // std::find, std::min, std::reverse
16
+ #include <memory>
17
+ #include <iterator>
18
+ #include <exception>
19
+ #include <stdexcept>
20
+ #include <istream> // std::basic_istream
21
+ #include <jsoncons/config/compiler_support.hpp>
22
+
23
+ namespace jsoncons {
24
+ namespace detail {
25
+
26
+ template <class CharT, class Traits = std::char_traits<CharT>>
27
+ class basic_string_view
28
+ {
29
+ private:
30
+ const CharT* data_;
31
+ std::size_t length_;
32
+ public:
33
+ using value_type = CharT;
34
+ using const_reference = const CharT&;
35
+ using traits_type = Traits;
36
+ using size_type = std::size_t;
37
+ static constexpr size_type npos = size_type(-1);
38
+ using const_iterator = const CharT*;
39
+ using iterator = const CharT*;
40
+ using const_reverse_iterator = std::reverse_iterator<const_iterator>;
41
+
42
+ constexpr basic_string_view() noexcept
43
+ : data_(nullptr), length_(0)
44
+ {
45
+ }
46
+ constexpr basic_string_view(const CharT* data, std::size_t length)
47
+ : data_(data), length_(length)
48
+ {
49
+ }
50
+
51
+ basic_string_view(const CharT* data)
52
+ : data_(data), length_(Traits::length(data))
53
+ {
54
+ }
55
+ constexpr basic_string_view(const basic_string_view& other) noexcept = default;
56
+
57
+ template <class Tr, class Allocator>
58
+ JSONCONS_CPP14_CONSTEXPR basic_string_view(const std::basic_string<CharT,Tr,Allocator>& s) noexcept
59
+ : data_(s.data()), length_(s.length())
60
+ {
61
+ }
62
+
63
+ JSONCONS_CPP14_CONSTEXPR basic_string_view& operator=( const basic_string_view& view ) noexcept
64
+ {
65
+ data_ = view.data();
66
+ length_ = view.length();
67
+
68
+ return *this;
69
+ }
70
+
71
+ template <class Allocator>
72
+ explicit operator std::basic_string<CharT,Traits,Allocator>() const
73
+ {
74
+ return std::basic_string<CharT,Traits,Allocator>(data_,length_);
75
+ }
76
+
77
+ // iterator support
78
+ const_iterator begin() const noexcept
79
+ {
80
+ return data_;
81
+ }
82
+ const_iterator end() const noexcept
83
+ {
84
+ return data_ + length_;
85
+ }
86
+ const_iterator cbegin() const noexcept
87
+ {
88
+ return data_;
89
+ }
90
+ const_iterator cend() const noexcept
91
+ {
92
+ return data_ + length_;
93
+ }
94
+ const_reverse_iterator rbegin() const noexcept
95
+ {
96
+ return const_reverse_iterator(end());
97
+ }
98
+ const_reverse_iterator rend() const noexcept
99
+ {
100
+ return const_reverse_iterator(begin());
101
+ }
102
+ const_reverse_iterator crbegin() const noexcept
103
+ {
104
+ return const_reverse_iterator(end());
105
+ }
106
+ const_reverse_iterator crend() const noexcept
107
+ {
108
+ return const_reverse_iterator(begin());
109
+ }
110
+
111
+ // capacity
112
+
113
+ std::size_t size() const
114
+ {
115
+ return length_;
116
+ }
117
+
118
+ std::size_t length() const
119
+ {
120
+ return length_;
121
+ }
122
+ size_type max_size() const noexcept
123
+ {
124
+ return length_;
125
+ }
126
+ bool empty() const noexcept
127
+ {
128
+ return length_ == 0;
129
+ }
130
+
131
+ // element access
132
+
133
+ const_reference operator[](size_type pos) const
134
+ {
135
+ return data_[pos];
136
+ }
137
+
138
+ const_reference at(std::size_t pos) const
139
+ {
140
+ if (pos >= length_)
141
+ {
142
+ JSONCONS_THROW(std::out_of_range("pos exceeds length"));
143
+ }
144
+ return data_[pos];
145
+ }
146
+
147
+ const_reference front() const
148
+ {
149
+ return data_[0];
150
+ }
151
+ const_reference back() const
152
+ {
153
+ return data_[length_-1];
154
+ }
155
+
156
+ const CharT* data() const
157
+ {
158
+ return data_;
159
+ }
160
+
161
+ // string operations
162
+
163
+ basic_string_view substr(size_type pos, size_type n=npos) const
164
+ {
165
+ if (pos > length_)
166
+ {
167
+ JSONCONS_THROW(std::out_of_range("pos exceeds size"));
168
+ }
169
+ if (n == npos || pos + n > length_)
170
+ {
171
+ n = length_ - pos;
172
+ }
173
+ return basic_string_view(data_ + pos, n);
174
+ }
175
+
176
+ int compare(const basic_string_view& s) const noexcept
177
+ {
178
+ const int rc = Traits::compare(data_, s.data_, (std::min)(length_, s.length_));
179
+ return rc != 0 ? rc : (length_ == s.length_ ? 0 : length_ < s.length_ ? -1 : 1);
180
+ }
181
+
182
+ int compare(const CharT* data) const noexcept
183
+ {
184
+ const size_t length = Traits::length(data);
185
+ const int rc = Traits::compare(data_, data, (std::min)(length_, length));
186
+ return rc != 0 ? rc : (length_ == length? 0 : length_ < length? -1 : 1);
187
+ }
188
+
189
+ template <class Allocator>
190
+ int compare(const std::basic_string<CharT,Traits,Allocator>& s) const noexcept
191
+ {
192
+ const int rc = Traits::compare(data_, s.data(), (std::min)(length_, s.length()));
193
+ return rc != 0 ? rc : (length_ == s.length() ? 0 : length_ < s.length() ? -1 : 1);
194
+ }
195
+
196
+ size_type find(basic_string_view s, size_type pos = 0) const noexcept
197
+ {
198
+ if (pos > length_)
199
+ {
200
+ return npos;
201
+ }
202
+ if (s.length_ == 0)
203
+ {
204
+ return pos;
205
+ }
206
+ const_iterator it = std::search(cbegin() + pos, cend(),
207
+ s.cbegin(), s.cend(), Traits::eq);
208
+ return it == cend() ? npos : std::distance(cbegin(), it);
209
+ }
210
+ size_type find(CharT ch, size_type pos = 0) const noexcept
211
+ {
212
+ return find(basic_string_view(&ch, 1), pos);
213
+ }
214
+ size_type find(const CharT* s, size_type pos, size_type n) const noexcept
215
+ {
216
+ return find(basic_string_view(s, n), pos);
217
+ }
218
+ size_type find(const CharT* s, size_type pos = 0) const noexcept
219
+ {
220
+ return find(basic_string_view(s), pos);
221
+ }
222
+
223
+ size_type rfind(basic_string_view s, size_type pos = npos) const noexcept
224
+ {
225
+ if (length_ < s.length_)
226
+ {
227
+ return npos;
228
+ }
229
+ if (pos > length_ - s.length_)
230
+ {
231
+ pos = length_ - s.length_;
232
+ }
233
+ if (s.length_ == 0)
234
+ {
235
+ return pos;
236
+ }
237
+ for (const CharT* p = data_ + pos; true; --p)
238
+ {
239
+ if (Traits::compare(p, s.data_, s.length_) == 0)
240
+ {
241
+ return p - data_;
242
+ }
243
+ if (p == data_)
244
+ {
245
+ return npos;
246
+ }
247
+ };
248
+ }
249
+ size_type rfind(CharT ch, size_type pos = npos) const noexcept
250
+ {
251
+ return rfind(basic_string_view(&ch, 1), pos);
252
+ }
253
+ size_type rfind(const CharT* s, size_type pos, size_type n) const noexcept
254
+ {
255
+ return rfind(basic_string_view(s, n), pos);
256
+ }
257
+ size_type rfind(const CharT* s, size_type pos = npos) const noexcept
258
+ {
259
+ return rfind(basic_string_view(s), pos);
260
+ }
261
+
262
+ size_type find_first_of(basic_string_view s, size_type pos = 0) const noexcept
263
+ {
264
+ if (pos >= length_ || s.length_ == 0)
265
+ {
266
+ return npos;
267
+ }
268
+ const_iterator it = std::find_first_of
269
+ (cbegin() + pos, cend(), s.cbegin(), s.cend(), Traits::eq);
270
+ return it == cend() ? npos : std::distance (cbegin(), it);
271
+ }
272
+ size_type find_first_of(CharT ch, size_type pos = 0) const noexcept
273
+ {
274
+ return find_first_of(basic_string_view(&ch, 1), pos);
275
+ }
276
+ size_type find_first_of(const CharT* s, size_type pos, size_type n) const noexcept
277
+ {
278
+ return find_first_of(basic_string_view(s, n), pos);
279
+ }
280
+ size_type find_first_of(const CharT* s, size_type pos = 0) const noexcept
281
+ {
282
+ return find_first_of(basic_string_view(s), pos);
283
+ }
284
+
285
+ size_type find_last_of(basic_string_view s, size_type pos = npos) const noexcept
286
+ {
287
+ if (s.length_ == 0)
288
+ {
289
+ return npos;
290
+ }
291
+ if (pos >= length_)
292
+ {
293
+ pos = 0;
294
+ }
295
+ else
296
+ {
297
+ pos = length_ - (pos+1);
298
+ }
299
+ const_reverse_iterator it = std::find_first_of
300
+ (crbegin() + pos, crend(), s.cbegin(), s.cend(), Traits::eq);
301
+ return it == crend() ? npos : (length_ - 1 - std::distance(crbegin(), it));
302
+ }
303
+ size_type find_last_of(CharT ch, size_type pos = npos) const noexcept
304
+ {
305
+ return find_last_of(basic_string_view(&ch, 1), pos);
306
+ }
307
+ size_type find_last_of(const CharT* s, size_type pos, size_type n) const noexcept
308
+ {
309
+ return find_last_of(basic_string_view(s, n), pos);
310
+ }
311
+ size_type find_last_of(const CharT* s, size_type pos = npos) const noexcept
312
+ {
313
+ return find_last_of(basic_string_view(s), pos);
314
+ }
315
+
316
+ size_type find_first_not_of(basic_string_view s, size_type pos = 0) const noexcept
317
+ {
318
+ if (pos >= length_)
319
+ return npos;
320
+ if (s.length_ == 0)
321
+ return pos;
322
+
323
+ const_iterator it = cend();
324
+ for (auto p = cbegin()+pos; p != cend(); ++p)
325
+ {
326
+ if (Traits::find(s.data_, s.length_, *p) == 0)
327
+ {
328
+ it = p;
329
+ break;
330
+ }
331
+ }
332
+ return it == cend() ? npos : std::distance (cbegin(), it);
333
+ }
334
+ size_type find_first_not_of(CharT ch, size_type pos = 0) const noexcept
335
+ {
336
+ return find_first_not_of(basic_string_view(&ch, 1), pos);
337
+ }
338
+ size_type find_first_not_of(const CharT* s, size_type pos, size_type n) const noexcept
339
+ {
340
+ return find_first_not_of(basic_string_view(s, n), pos);
341
+ }
342
+ size_type find_first_not_of(const CharT* s, size_type pos = 0) const noexcept
343
+ {
344
+ return find_first_not_of(basic_string_view(s), pos);
345
+ }
346
+
347
+ size_type find_last_not_of(basic_string_view s, size_type pos = npos) const noexcept
348
+ {
349
+ if (pos >= length_)
350
+ {
351
+ pos = length_ - 1;
352
+ }
353
+ if (s.length_ == 0)
354
+ {
355
+ return pos;
356
+ }
357
+ pos = length_ - (pos+1);
358
+
359
+ const_iterator it = crend();
360
+ for (auto p = crbegin()+pos; p != crend(); ++p)
361
+ {
362
+ if (Traits::find(s.data_, s.length_, *p) == 0)
363
+ {
364
+ it = p;
365
+ break;
366
+ }
367
+ }
368
+ return it == crend() ? npos : (length_ - 1 - std::distance(crbegin(), it));
369
+ }
370
+ size_type find_last_not_of(CharT ch, size_type pos = npos) const noexcept
371
+ {
372
+ return find_last_not_of(basic_string_view(&ch, 1), pos);
373
+ }
374
+ size_type find_last_not_of(const CharT* s, size_type pos, size_type n) const noexcept
375
+ {
376
+ return find_last_not_of(basic_string_view(s, n), pos);
377
+ }
378
+ size_type find_last_not_of(const CharT* s, size_type pos = npos) const noexcept
379
+ {
380
+ return find_last_not_of(basic_string_view(s), pos);
381
+ }
382
+
383
+ friend std::basic_ostream<CharT>& operator<<(std::basic_ostream<CharT>& os, const basic_string_view& sv)
384
+ {
385
+ os.write(sv.data_,sv.length_);
386
+ return os;
387
+ }
388
+ };
389
+
390
+ // ==
391
+ template<class CharT,class Traits>
392
+ bool operator==(const basic_string_view<CharT,Traits>& lhs,
393
+ const basic_string_view<CharT,Traits>& rhs) noexcept
394
+ {
395
+ return lhs.compare(rhs) == 0;
396
+ }
397
+ template<class CharT,class Traits,class Allocator>
398
+ bool operator==(const basic_string_view<CharT,Traits>& lhs,
399
+ const std::basic_string<CharT,Traits,Allocator>& rhs) noexcept
400
+ {
401
+ return lhs.compare(rhs) == 0;
402
+ }
403
+ template<class CharT,class Traits,class Allocator>
404
+ bool operator==(const std::basic_string<CharT,Traits,Allocator>& lhs,
405
+ const basic_string_view<CharT,Traits>& rhs) noexcept
406
+ {
407
+ return rhs.compare(lhs) == 0;
408
+ }
409
+ template<class CharT,class Traits>
410
+ bool operator==(const basic_string_view<CharT,Traits>& lhs,
411
+ const CharT* rhs) noexcept
412
+ {
413
+ return lhs.compare(rhs) == 0;
414
+ }
415
+ template<class CharT,class Traits>
416
+ bool operator==(const CharT* lhs,
417
+ const basic_string_view<CharT,Traits>& rhs) noexcept
418
+ {
419
+ return rhs.compare(lhs) == 0;
420
+ }
421
+
422
+ // !=
423
+ template<class CharT,class Traits>
424
+ bool operator!=(const basic_string_view<CharT,Traits>& lhs,
425
+ const basic_string_view<CharT,Traits>& rhs) noexcept
426
+ {
427
+ return lhs.compare(rhs) != 0;
428
+ }
429
+ template<class CharT,class Traits,class Allocator>
430
+ bool operator!=(const basic_string_view<CharT,Traits>& lhs,
431
+ const std::basic_string<CharT,Traits,Allocator>& rhs) noexcept
432
+ {
433
+ return lhs.compare(rhs) != 0;
434
+ }
435
+ template<class CharT,class Traits,class Allocator>
436
+ bool operator!=(const std::basic_string<CharT,Traits,Allocator>& lhs,
437
+ const basic_string_view<CharT,Traits>& rhs) noexcept
438
+ {
439
+ return rhs.compare(lhs) != 0;
440
+ }
441
+ template<class CharT,class Traits>
442
+ bool operator!=(const basic_string_view<CharT,Traits>& lhs,
443
+ const CharT* rhs) noexcept
444
+ {
445
+ return lhs.compare(rhs) != 0;
446
+ }
447
+ template<class CharT,class Traits>
448
+ bool operator!=(const CharT* lhs,
449
+ const basic_string_view<CharT,Traits>& rhs) noexcept
450
+ {
451
+ return rhs.compare(lhs) != 0;
452
+ }
453
+
454
+ // <=
455
+ template<class CharT,class Traits>
456
+ bool operator<=(const basic_string_view<CharT,Traits>& lhs,
457
+ const basic_string_view<CharT,Traits>& rhs) noexcept
458
+ {
459
+ return lhs.compare(rhs) <= 0;
460
+ }
461
+ template<class CharT,class Traits,class Allocator>
462
+ bool operator<=(const basic_string_view<CharT,Traits>& lhs,
463
+ const std::basic_string<CharT,Traits,Allocator>& rhs) noexcept
464
+ {
465
+ return lhs.compare(rhs) <= 0;
466
+ }
467
+ template<class CharT,class Traits,class Allocator>
468
+ bool operator<=(const std::basic_string<CharT,Traits,Allocator>& lhs,
469
+ const basic_string_view<CharT,Traits>& rhs) noexcept
470
+ {
471
+ return rhs.compare(lhs) >= 0;
472
+ }
473
+
474
+ // <
475
+ template<class CharT,class Traits>
476
+ bool operator<(const basic_string_view<CharT,Traits>& lhs,
477
+ const basic_string_view<CharT,Traits>& rhs) noexcept
478
+ {
479
+ return lhs.compare(rhs) < 0;
480
+ }
481
+ template<class CharT,class Traits,class Allocator>
482
+ bool operator<(const basic_string_view<CharT,Traits>& lhs,
483
+ const std::basic_string<CharT,Traits,Allocator>& rhs) noexcept
484
+ {
485
+ return lhs.compare(rhs) < 0;
486
+ }
487
+ template<class CharT,class Traits,class Allocator>
488
+ bool operator<(const std::basic_string<CharT,Traits,Allocator>& lhs,
489
+ const basic_string_view<CharT,Traits>& rhs) noexcept
490
+ {
491
+ return rhs.compare(lhs) > 0;
492
+ }
493
+
494
+ // >=
495
+ template<class CharT,class Traits>
496
+ bool operator>=(const basic_string_view<CharT,Traits>& lhs,
497
+ const basic_string_view<CharT,Traits>& rhs) noexcept
498
+ {
499
+ return lhs.compare(rhs) >= 0;
500
+ }
501
+ template<class CharT,class Traits,class Allocator>
502
+ bool operator>=(const basic_string_view<CharT,Traits>& lhs,
503
+ const std::basic_string<CharT,Traits,Allocator>& rhs) noexcept
504
+ {
505
+ return lhs.compare(rhs) >= 0;
506
+ }
507
+ template<class CharT,class Traits,class Allocator>
508
+ bool operator>=(const std::basic_string<CharT,Traits,Allocator>& lhs,
509
+ const basic_string_view<CharT,Traits>& rhs) noexcept
510
+ {
511
+ return rhs.compare(lhs) <= 0;
512
+ }
513
+
514
+ // >
515
+ template<class CharT,class Traits>
516
+ bool operator>(const basic_string_view<CharT,Traits>& lhs,
517
+ const basic_string_view<CharT,Traits>& rhs) noexcept
518
+ {
519
+ return lhs.compare(rhs) > 0;
520
+ }
521
+ template<class CharT,class Traits,class Allocator>
522
+ bool operator>(const basic_string_view<CharT,Traits>& lhs,
523
+ const std::basic_string<CharT,Traits,Allocator>& rhs) noexcept
524
+ {
525
+ return lhs.compare(rhs) > 0;
526
+ }
527
+ template<class CharT,class Traits,class Allocator>
528
+ bool operator>(const std::basic_string<CharT,Traits,Allocator>& lhs,
529
+ const basic_string_view<CharT,Traits>& rhs) noexcept
530
+ {
531
+ return rhs.compare(lhs) < 0;
532
+ }
533
+
534
+ } // namespace detail
535
+ } // namespace jsoncons
536
+
537
+ #endif