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 substring(const size_type beginIndex, const size_type endIndex = npos) const
190 {
191 if (beginIndex >= m_size)
192 {
193 return {};
194 }
195 if (endIndex == npos)
196 {
197 return {
198 std::next(cbegin(), beginIndex),
199 m_size - beginIndex
200 };
201 }
202 if (endIndex <= beginIndex)
203 {
204 return {};
205 }
206 return {
207 std::next(cbegin(), beginIndex),
208 std::next(cbegin(), std::min(endIndex, m_size)),
209 };
210 }
211
217 {
218 return {
219 cbegin(),
220 std::find(cbegin(), cend(), terminate)
221 };
222 }
223
228 {
229 if (n >= m_size)
230 {
231 return {};
232 }
233 return {
234 std::next(cbegin(), n),
235 m_size - n
236 };
237 }
238
243 {
244 if (n >= m_size)
245 {
246 return {};
247 }
248 return {
249 cbegin(),
250 m_size - n
251 };
252 }
253
257 bool startsWith(const BasicStringView& string) const noexcept
258 {
259 return m_size >= string.m_size and traits_type::compare(m_data, string.m_data, string.m_size) == 0;
260 }
261
265 bool endsWith(const BasicStringView& string) const noexcept
266 {
267 return m_size >= string.m_size and traits_type::compare(m_data + m_size - string.m_size, string.m_data, string.m_size) == 0;
268 }
269
273 std::vector<BasicStringView> split(const char_type delimiter) const
274 {
275 std::vector<BasicStringView> tokens;
276
278 for (auto it = cbegin(); it != cend(); ++it)
279 {
280 const auto next = std::next(it);
281 if (*it == delimiter) // 区切り文字検索
282 {
283 tokens.emplace_back(begin, it);
284 begin = next; // it は 区切り文字を指しているので飛ばす
285 }
286 else if (next == cend()) // 最後は普通に追加
287 {
288 tokens.emplace_back(begin, cend());
289 }
290 }
291 return tokens;
292 }
293
298 template <typename T = int>
299 Udon::Optional<T> toNumber(const int radix = 10) const
300 {
301 static_assert(std::is_arithmetic<T>::value, "T must be arithmetic type.");
302
303 return StringToNumberParser::Parse<T>(cbegin(), cend(), radix);
304 }
305
309 std::basic_string<char_type> toString() const
310 {
311 return { cbegin(), cend() };
312 }
313
316 void swap(BasicStringView& other) noexcept
317 {
318 std::swap(m_data, other.m_data);
319 std::swap(m_size, other.m_size);
320 }
321
326 friend bool operator==(const BasicStringView& lhs, const BasicStringView& rhs) noexcept
327 {
328 return lhs.m_size == rhs.m_size and traits_type::compare(lhs.m_data, rhs.m_data, lhs.m_size) == 0;
329 }
330
335 friend bool operator!=(const BasicStringView& lhs, const BasicStringView& rhs) noexcept
336 {
337 return not(lhs == rhs);
338 }
339
340#if UDON_PLATFORM_OUTPUT_STREAM == UDON_PLATFORM_OUTPUT_CONSOLE
341
343 friend std::basic_ostream<char_type>& operator<<(std::basic_ostream<char_type>& os, const BasicStringView& string)
344 {
345 return os.write(string.m_data, string.m_size);
346 }
347
348#endif
349
350#ifdef ARDUINO
351 void show() const
352 {
353 Serial.print("[");
354 for (size_type i = 0; i < m_size; ++i)
355 {
356 Serial.print(m_data[i]);
357 if (i < m_size - 1)
358 {
359 Serial.print(", ");
360 }
361 }
362 Serial.print("]");
363 }
364 void showString() const
365 {
366 Serial.write(m_data, m_size);
367 }
368#endif
369
370 // iterator 要件
371 const_iterator begin() const noexcept { return m_data; }
372 const_iterator end() const noexcept { return m_data + m_size; }
373
374 const_iterator cbegin() const noexcept { return m_data; }
375 const_iterator cend() const noexcept { return m_data + m_size; }
376
379
382 };
383
384} // namespace Udon
385
386namespace Udon
387{
390} // namespace Udon
391
392namespace Udon
393{
394
395 namespace Literals
396 {
397
399 constexpr StringView operator""_sv(const char* string, size_t length) noexcept
400 {
401 return { string, length };
402 }
403
405 constexpr WStringView operator""_sv(const wchar_t* string, size_t length) noexcept
406 {
407 return { string, length };
408 }
409
410 } // namespace Literals
411
412} // 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:299
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:374
const char_type * const_pointer
Definition StringView.hpp:46
friend bool operator!=(const BasicStringView &lhs, const BasicStringView &rhs) noexcept
ビューが不一致であるか比較する
Definition StringView.hpp:335
BasicStringView substring(const size_type beginIndex, const size_type endIndex=npos) const
指定された範囲のビューを作成する
Definition StringView.hpp:189
void swap(BasicStringView &other) noexcept
ビューを入れ替える
Definition StringView.hpp:316
const_receive_iterator crbegin() const noexcept
Definition StringView.hpp:380
constexpr BasicStringView(InputIterator begin, InputIterator end)
要素を指すイテレータをもとにビューを構築
Definition StringView.hpp:87
const_receive_iterator rend() const noexcept
Definition StringView.hpp:378
typename traits_type::char_type char_type
Definition StringView.hpp:40
typename traits_type::state_type state_type
Definition StringView.hpp:44
BasicStringView substringUntil(const char_type terminate) const
指定された終端文字までのビューを作成する
Definition StringView.hpp:216
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:326
const_receive_iterator crend() const noexcept
Definition StringView.hpp:381
typename traits_type::off_type off_type
Definition StringView.hpp:42
BasicStringView removeSuffix(const size_type n) const
末尾のN文字を削除したビューを作成する
Definition StringView.hpp:242
BasicStringView & operator=(const BasicStringView &)=default
デフォルト代入演算子
BasicStringView(const BasicStringView &)=default
デフォルトコピーコンストラクタ
const_iterator cend() const noexcept
Definition StringView.hpp:375
std::basic_string< char_type > toString() const
STL の文字列に変換する
Definition StringView.hpp:309
BasicStringView removePrefix(const size_type n) const
先頭のN文字を削除したビューを作成する
Definition StringView.hpp:227
std::vector< BasicStringView > split(const char_type delimiter) const
指定された区切り文字で区切り、ビューのリストを作成する
Definition StringView.hpp:273
bool endsWith(const BasicStringView &string) const noexcept
ビューが指定したビューで終わっているか判定する
Definition StringView.hpp:265
bool startsWith(const BasicStringView &string) const noexcept
ビューが指定したビューから始まっているか判定する
Definition StringView.hpp:257
const_iterator end() const noexcept
Definition StringView.hpp:372
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:377
const_reference at(const size_type index) const noexcept
指定されたインデックスの文字を取得する
Definition StringView.hpp:161
const_iterator begin() const noexcept
Definition StringView.hpp:371
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:343
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