UdonLibrary 1.0.0
機械システム研究部 C++ ライブラリ
読み取り中…
検索中…
一致する文字列を見つけられません
StringView.hpp
[詳解]
1//
2// 文字列参照クラス (std::string_view代替)
3//
4// Copyright (c) 2022-2024 udonrobo
5//
6
7#pragma once
8
10#include <string>
11#include <vector>
12#include <algorithm>
13#include <iterator>
16
17#if UDON_PLATFORM_OUTPUT_STREAM == UDON_PLATFORM_OUTPUT_CONSOLE
18# include <iostream>
19#endif
20
21namespace Udon
22{
23
28 template <typename CharType, typename Traits = std::char_traits<CharType>>
30 {
31 static_assert(not std::is_array<CharType>::value, "CharType cannot be an array.");
32
33 static_assert(std::is_trivial<CharType>::value, "CharType must be a trivial type.");
34
35 static_assert(std::is_standard_layout<CharType>::value, "CharType must be a standard layout type.");
36
37 public:
38 using size_type = size_t;
39 using traits_type = Traits;
40 using char_type = typename traits_type::char_type;
41 using int_type = typename traits_type::int_type;
42 using off_type = typename traits_type::off_type;
43 using pos_type = typename traits_type::pos_type;
44 using state_type = typename traits_type::state_type;
45 using const_reference = const char_type&;
46 using const_pointer = const char_type*;
47 using const_iterator = const char_type*;
48 using const_receive_iterator = std::reverse_iterator<const_iterator>;
49
50 static constexpr size_type npos = static_cast<size_type>(-1);
51
52 private:
53 const_pointer m_data; // ビューの先頭を指すポインタ
54 size_type m_size; // ビューの要素数
55
56 public:
58 constexpr BasicStringView()
59 : m_data()
60 , m_size()
61 {
62 }
63
68 : m_data(string)
69 , m_size(strlen(string))
70 {
71 }
72
76 constexpr BasicStringView(const_pointer string, const size_type length)
77 : m_data(string)
78 , m_size(length)
79 {
80 }
81
86 template <typename InputIterator, typename = typename std::enable_if<std::is_convertible<typename std::iterator_traits<InputIterator>::iterator_category, std::input_iterator_tag>::value>::type>
87 constexpr BasicStringView(InputIterator begin, InputIterator end)
88 : m_data(begin)
89 , m_size(std::distance(begin, end))
90 {
91 }
92
96 BasicStringView(const std::basic_string<CharType>& string)
97 : m_data(string.data())
98 , m_size(string.size())
99 {
100 }
101
102
103#ifdef ARDUINO
104
108 template <typename T = CharType, typename = typename std::enable_if<std::is_same<T, char>::value>::type>
109 BasicStringView(const String& str)
110 : m_data(str.c_str())
111 , m_size(str.length())
112 {
113 }
114#endif
115
118
121
123 constexpr explicit operator bool() const noexcept
124 {
125 return m_size;
126 }
127
130 constexpr const_pointer data() const noexcept
131 {
132 return m_data;
133 }
134
137 constexpr size_type size() const noexcept
138 {
139 return m_size;
140 }
141
143 // const_pointer c_str() const noexcept = delete;
144
147 constexpr bool empty() const noexcept
148 {
149 return m_size == 0;
150 }
151
155 constexpr const_reference operator[](const size_type index) const noexcept
156 {
157 return m_data[index];
158 }
159
161 const_reference at(const size_type index) const noexcept
162 {
163 if (index >= m_size)
164 {
165 // throw std::out_of_range
166 return back();
167 }
168 return m_data[index];
169 }
170
173 constexpr const_reference front() const noexcept
174 {
175 return m_data[0];
176 }
177
180 constexpr const_reference back() const noexcept
181 {
182 return m_data[m_size - 1];
183 }
184
189 BasicStringView substr(const size_type pos, const size_type n = npos) const
190 {
191 if (pos >= m_size)
192 {
193 return {};
194 }
195 if (n == npos)
196 {
197 // 終端まで取得
198 return {
199 std::next(cbegin(), pos),
200 m_size - pos
201 };
202 }
203 return {
204 std::next(cbegin(), pos),
205 std::min(n, m_size - pos)
206 };
207 }
208
213 BasicStringView substrUntil(const char_type terminate) const
214 {
215 return {
216 cbegin(),
217 std::find(cbegin(), cend(), terminate)
218 };
219 }
220
225 {
226 if (n >= m_size)
227 {
228 return {};
229 }
230 return {
231 std::next(cbegin(), n),
232 m_size - n
233 };
234 }
235
240 {
241 if (n >= m_size)
242 {
243 return {};
244 }
245 return {
246 cbegin(),
247 m_size - n
248 };
249 }
250
254 bool startsWith(const BasicStringView& string) const noexcept
255 {
256 return m_size >= string.m_size and traits_type::compare(m_data, string.m_data, string.m_size) == 0;
257 }
258
262 bool endsWith(const BasicStringView& string) const noexcept
263 {
264 return m_size >= string.m_size and traits_type::compare(m_data + m_size - string.m_size, string.m_data, string.m_size) == 0;
265 }
266
270 std::vector<BasicStringView> split(const char_type delimiter) const
271 {
272 std::vector<BasicStringView> tokens;
273
275 for (auto it = cbegin(); it != cend(); ++it)
276 {
277 const auto next = std::next(it);
278 if (*it == delimiter) // 区切り文字検索
279 {
280 tokens.emplace_back(begin, it);
281 begin = next; // it は 区切り文字を指しているので飛ばす
282 }
283 else if (next == cend()) // 最後は普通に追加
284 {
285 tokens.emplace_back(begin, cend());
286 }
287 }
288 return tokens;
289 }
290
295 template <typename T = int>
296 Udon::Optional<T> toNumber(const int radix = 10) const
297 {
298 static_assert(std::is_arithmetic<T>::value, "T must be arithmetic type.");
299
300 return StringToNumberParser::Parse<T>(cbegin(), cend(), radix);
301 }
302
306 std::basic_string<char_type> toString() const
307 {
308 return { cbegin(), cend() };
309 }
310
313 void swap(BasicStringView& other) noexcept
314 {
315 std::swap(m_data, other.m_data);
316 std::swap(m_size, other.m_size);
317 }
318
323 friend bool operator==(const BasicStringView& lhs, const BasicStringView& rhs) noexcept
324 {
325 return lhs.m_size == rhs.m_size and traits_type::compare(lhs.m_data, rhs.m_data, lhs.m_size) == 0;
326 }
327
332 friend bool operator!=(const BasicStringView& lhs, const BasicStringView& rhs) noexcept
333 {
334 return not(lhs == rhs);
335 }
336
337#if UDON_PLATFORM_OUTPUT_STREAM == UDON_PLATFORM_OUTPUT_CONSOLE
338
340 friend std::basic_ostream<char_type>& operator<<(std::basic_ostream<char_type>& os, const BasicStringView& string)
341 {
342 return os.write(string.m_data, string.m_size);
343 }
344
345#endif
346
347#ifdef ARDUINO
348 void showRaw() const
349 {
350 Serial.print("[");
351 for (size_type i = 0; i < m_size; ++i)
352 {
353 Serial.print(m_data[i]);
354 if (i < m_size - 1)
355 {
356 Serial.print(", ");
357 }
358 }
359 Serial.print("]");
360 }
361 void show() const
362 {
363 Serial.write(m_data, m_size);
364 }
365#endif
366
367 // iterator 要件
368 const_iterator begin() const noexcept { return m_data; }
369 const_iterator end() const noexcept { return m_data + m_size; }
370
371 const_iterator cbegin() const noexcept { return m_data; }
372 const_iterator cend() const noexcept { return m_data + m_size; }
373
376
379 };
380
381} // namespace Udon
382
383namespace Udon
384{
387} // namespace Udon
388
389namespace Udon
390{
391
392 namespace Literals
393 {
394
396 constexpr StringView operator""_sv(const char* string, size_t length) noexcept
397 {
398 return { string, length };
399 }
400
402 constexpr WStringView operator""_sv(const wchar_t* string, size_t length) noexcept
403 {
404 return { string, length };
405 }
406
407 } // namespace Literals
408
409} // namespace Udon
文字列参照クラス
Definition StringView.hpp:30
constexpr const_pointer data() const noexcept
ビューへのポインタを取得する
Definition StringView.hpp:130
constexpr BasicStringView()
デフォルトコンストラクタ
Definition StringView.hpp:58
Udon::Optional< T > toNumber(const int radix=10) const
ビューを数値に変換する
Definition StringView.hpp:296
constexpr const_reference operator[](const size_type index) const noexcept
指定されたインデックスの文字を取得する
Definition StringView.hpp:155
Traits traits_type
Definition StringView.hpp:39
std::reverse_iterator< const_iterator > const_receive_iterator
Definition StringView.hpp:48
constexpr size_type size() const noexcept
ビューのサイズを取得する
Definition StringView.hpp:137
const_iterator cbegin() const noexcept
Definition StringView.hpp:371
const char_type * const_pointer
Definition StringView.hpp:46
friend bool operator!=(const BasicStringView &lhs, const BasicStringView &rhs) noexcept
ビューが不一致であるか比較する
Definition StringView.hpp:332
void swap(BasicStringView &other) noexcept
ビューを入れ替える
Definition StringView.hpp:313
BasicStringView substrUntil(const char_type terminate) const
指定された終端文字までのビューを作成する
Definition StringView.hpp:213
const_receive_iterator crbegin() const noexcept
Definition StringView.hpp:377
BasicStringView substr(const size_type pos, const size_type n=npos) const
指定された範囲のビューを作成する
Definition StringView.hpp:189
constexpr BasicStringView(InputIterator begin, InputIterator end)
要素を指すイテレータをもとにビューを構築
Definition StringView.hpp:87
const_receive_iterator rend() const noexcept
Definition StringView.hpp:375
typename traits_type::char_type char_type
Definition StringView.hpp:40
typename traits_type::state_type state_type
Definition StringView.hpp:44
size_t size_type
Definition StringView.hpp:38
const char_type * const_iterator
Definition StringView.hpp:47
static constexpr size_type npos
Definition StringView.hpp:50
typename traits_type::int_type int_type
Definition StringView.hpp:41
friend bool operator==(const BasicStringView &lhs, const BasicStringView &rhs) noexcept
ビューが一致するか比較する
Definition StringView.hpp:323
const_receive_iterator crend() const noexcept
Definition StringView.hpp:378
typename traits_type::off_type off_type
Definition StringView.hpp:42
BasicStringView removeSuffix(const size_type n) const
末尾のN文字を削除したビューを作成する
Definition StringView.hpp:239
BasicStringView & operator=(const BasicStringView &)=default
デフォルト代入演算子
BasicStringView(const BasicStringView &)=default
デフォルトコピーコンストラクタ
const_iterator cend() const noexcept
Definition StringView.hpp:372
std::basic_string< char_type > toString() const
STL の文字列に変換する
Definition StringView.hpp:306
BasicStringView removePrefix(const size_type n) const
先頭のN文字を削除したビューを作成する
Definition StringView.hpp:224
std::vector< BasicStringView > split(const char_type delimiter) const
指定された区切り文字で区切り、ビューのリストを作成する
Definition StringView.hpp:270
bool endsWith(const BasicStringView &string) const noexcept
ビューが指定したビューで終わっているか判定する
Definition StringView.hpp:262
bool startsWith(const BasicStringView &string) const noexcept
ビューが指定したビューから始まっているか判定する
Definition StringView.hpp:254
const_iterator end() const noexcept
Definition StringView.hpp:369
const char_type & const_reference
Definition StringView.hpp:45
constexpr const_reference back() const noexcept
ビューの終端の文字を取得する
Definition StringView.hpp:180
BasicStringView(const_pointer string)
文字列の先頭を指すポインタをもとにビューを構築
Definition StringView.hpp:67
const_receive_iterator rbegin() const noexcept
Definition StringView.hpp:374
const_reference at(const size_type index) const noexcept
指定されたインデックスの文字を取得する
Definition StringView.hpp:161
const_iterator begin() const noexcept
Definition StringView.hpp:368
BasicStringView(const std::basic_string< CharType > &string)
std::string からの変換
Definition StringView.hpp:96
friend std::basic_ostream< char_type > & operator<<(std::basic_ostream< char_type > &os, const BasicStringView &string)
std::ostream への出力
Definition StringView.hpp:340
constexpr const_reference front() const noexcept
ビューの先頭文字を取得する
Definition StringView.hpp:173
constexpr BasicStringView(const_pointer string, const size_type length)
文字列の先頭を指すポインタ、サイズをもとにビューを構築
Definition StringView.hpp:76
constexpr bool empty() const noexcept
ビュー終端にヌル終端文字を含むことは保証されないので c_str() は提供しない
Definition StringView.hpp:147
typename traits_type::pos_type pos_type
Definition StringView.hpp:43
オプショナル型
Definition Optional.hpp:62
Udon::Optional< T > Parse(const char *const begin, const char *const end, const int radix)
文字列を数値に変換する
Definition StringToNumberParser.hpp:28
Definition Bit.hpp:12
Definition Typedef.hpp:94