16 #ifndef INCLUDE_NN_NLIB_STRINGVIEW_H_ 17 #define INCLUDE_NN_NLIB_STRINGVIEW_H_ 44 static const size_type npos = size_type(-1);
50 NLIB_ASSERT(this->IsValid_());
53 NLIB_ASSERT(this->IsValid_());
58 NLIB_ASSERT(this->IsValid_());
66 const_reverse_iterator
rend() const
NLIB_NOEXCEPT {
return const_reverse_iterator(begin()); }
72 NLIB_ASSERT(this->IsValid_());
76 NLIB_ASSERT(this->IsValid_());
84 NLIB_ASSERT(this->IsValid_());
87 const charT&
at(size_type pos)
const {
88 NLIB_ASSERT(this->IsValid_());
91 const charT&
front()
const {
return (*
this)[0]; }
92 const charT&
back()
const {
return (*
this)[this->length() - 1]; }
119 NLIB_ASSERT(this->IsValid_());
120 if (pos >= len_)
return StringView(base_ + len_, 0);
121 const charT* new_base = base_ + pos;
122 size_type r =
static_cast<size_type
>(len_ - pos);
123 size_type new_len = r > n ? n : r;
129 NLIB_ASSERT(this->IsValid_());
130 if (s.
length() > this->length())
return false;
133 bool starts_with(charT c)
const NLIB_NOEXCEPT {
return front() == c; }
138 NLIB_ASSERT(this->IsValid_());
139 if (s.
length() > len_)
return false;
148 template <
size_type N>
152 #ifdef NLIB_CXX11_DEFAULT_TEMPLATE_ARGUMENT_FOR_FUNCTION_TEMPLATES 153 template<
class DUMMY =
void>
157 NLIB_ASSERT(this->IsValid_());
158 str.reset(
new (std::nothrow) charT[len_ + 1]);
159 if (!str)
return false;
162 #ifdef __cpp_rvalue_references 164 NLIB_ASSERT(this->IsValid_());
165 charT* p =
new (std::nothrow) charT[len_ + 1];
166 if (!p)
return nullptr;
191 if (!this->starts_with(kwd))
return false;
192 base_ += kwd.length();
193 len_ -= kwd.length();
237 bool IsValid_()
const NLIB_NOEXCEPT {
238 if (!base_)
return false;
249 if (e != 0)
return e;
250 if (tmp > 127 || tmp < -128)
return ERANGE;
251 *v =
static_cast<int8_t
>(tmp);
259 if (e != 0)
return e;
260 if (tmp > 32767 || tmp < -32768)
return ERANGE;
261 *v =
static_cast<int16_t
>(tmp);
269 if (e != 0)
return e;
270 if (tmp > 255)
return ERANGE;
271 *v =
static_cast<uint8_t
>(tmp);
279 if (e != 0)
return e;
280 if (tmp > 65535)
return ERANGE;
281 *v =
static_cast<uint16_t
>(tmp);
286 if (this->starts_with(ch)) {
297 NLIB_ASSERT(this->IsValid_());
298 const charT* s = base_;
299 const charT* s_end = base_ + len_;
300 charT c = (s != s_end) ? *s :
'\0';
304 c = (s != s_end) ? *s :
'\0';
307 size_type len = s - base_;
316 return lhs.compare(rhs) == 0;
320 return lhs.compare(rhs) < 0;
326 if (prefix.length() > str.length())
return false;
327 return nlib_memcmp(prefix.data(), str.data(), prefix.length()) == 0;
334 if (suffix.length() > str.length())
return false;
335 return nlib_memcmp(suffix.data(), str.end() - suffix.length(), suffix.length()) == 0;
342 if (!buf || buf_size == 0)
return false;
343 size_t len = str.length();
356 #ifdef __cpp_rvalue_references 358 size_t buf_size = str.length() + 1;
359 char* p =
new (std::nothrow)
char[buf_size];
360 if (!p)
return nullptr;
365 inline std::pair<errno_t, size_t>
369 return std::make_pair(e, eptr - str.begin());
371 inline std::pair<errno_t, size_t>
375 return std::make_pair(e, eptr - str.begin());
377 inline std::pair<errno_t, size_t>
381 return std::make_pair(e, eptr - str.begin());
383 inline std::pair<errno_t, size_t>
387 return std::make_pair(e, eptr - str.begin());
389 inline std::pair<errno_t, size_t>
393 return std::make_pair(e, eptr - str.begin());
395 inline std::pair<errno_t, size_t>
399 return std::make_pair(e, eptr - str.begin());
401 inline std::pair<errno_t, size_t>
405 return std::make_pair(e, eptr - str.begin());
407 inline std::pair<errno_t, size_t>
411 return std::make_pair(e, eptr - str.begin());
413 inline std::pair<errno_t, size_t>
417 return std::make_pair(e, eptr - str.begin());
419 inline std::pair<errno_t, size_t>
423 return std::make_pair(e, eptr - str.begin());
426 inline std::pair<errno_t, size_t>
433 for (; it != itend; ++it) {
436 ptrdiff_t cnt = std::distance(str.begin(), it);
437 if (cnt == 0)
return false;
438 str.remove_prefix(cnt);
444 for (; it != itend; ++it) {
447 ptrdiff_t cnt = std::distance(str.rbegin(), it);
448 if (cnt == 0)
return false;
449 str.remove_suffix(cnt);
457 const char* beg = str.begin();
458 const char* p =
static_cast<const char*
>(
nlib_memchr(beg,
'\n', str.length()));
461 str.remove_prefix(str.length());
464 size_t width = p - beg;
465 if (width > 0 && *(p - 1) ==
'\r') --width;
467 str.remove_prefix(p - beg + 1);
471 if (!str.starts_with(prefix))
return false;
472 str.remove_prefix(prefix.length());
479 if (!str.starts_with(c))
return false;
480 str.remove_prefix(1);
488 while (++it != it_end) {
492 ptrdiff_t len = std::distance(str.begin(), it);
500 #endif // INCLUDE_NN_NLIB_STRINGVIEW_H_ void remove_prefix(size_type n) noexcept
最初のn 文字を取り除きます。
std::pair< errno_t, size_t > ToInteger(T *v, const StringView &str) noexcept
ToInteger(v, str, 10)を返します。つまり10進数として文字列を数値に変換します。
bool ends_with(const StringView &s) const noexcept
文字列がs をサフィックスとして持つかをチェックします。
std::reverse_iterator< const_iterator > const_reverse_iterator
文字列の逆方向イテレータです
const charT * data() const noexcept
最初の文字へのポインタを返します。
size_t size_type
非負整数型で、現在はsize_tにtypedefされています。
void clear() noexcept
空文字列を設定します。
ptrdiff_t difference_type
イテレータの差分をとったときに返される型です。
bool empty() const noexcept
空文字列であるかどうかをチェックします。
StringView substr(size_type pos, size_type n=npos) const noexcept
部分文字列[pos, pos + n)を返します。
std::pair< errno_t, size_t > ToFloat(float *v, const StringView &str) noexcept
内部でnlib_float_from_chars()を呼び出して、文字列を数値に変換します。戻り値はエラー値と読み込んだ文字...
bool ends_with(charT c) const noexcept
末尾が文字c であるかどうかをチェックします。
const_reverse_iterator crbegin() const noexcept
最後の文字への逆反復子を返します。
size_type length() const noexcept
文字列長を返します。
UniquePtrはポインタの所有権を保持し、UniquePtrがスコープから出るときにデストラクタでポインタをDELで指...
bool operator==(const HeapHash &rhs, const HeapHash &lhs)
2つのサマリを比較して等価ならば、trueを返します。
std::unique_ptrに相当するクラスが定義されています。
char charT
現在はchar型専用のクラスです。
bool starts_with(charT c) const noexcept
文字c で始まるかどうかをチェックします。
UniquePtr< char[]> ToCstring(const StringView &str) noexcept
メモリを割り当ててヌル終端文字列として文字列をコピーします。コピーできた場合はtrueを返します。 ...
const charT & operator[](size_type pos) const
pos 番目の文字を取得します。
bool EndsWith(const StringView &str, const char *suffix) noexcept
suffixがstrのサフィックスである場合trueを返します。
bool starts_with(const StringView &s) const noexcept
文字列がs をプレフィックスとして持つかをチェックします。
const charT & back() const
最後の文字を取得します。
bool ends_with(const charT *s) const noexcept
文字列がs をサフィックスとして持つかをチェックします。
constexpr StringView() noexcept
デフォルトコンストラクタです。空文字列で初期化されます。
bool TrimRight(StringView &str) noexcept
文字列の末尾の空白を切り詰めます。
const_iterator end() const noexcept
最後の文字に続く文字への反復子を返します。
const charT * pointer
文字へのポインタ型ですが、const_pointerと同一です。
size_type max_size() const noexcept
文字列長の最大値を返します。
const_iterator cend() const noexcept
最後の文字に続く文字への反復子を返します。
const_iterator iterator
文字列のイテレータですが、const_iteratorと同一です。
int compare(const charT *s) const noexcept
文字列を比較します。
const charT & at(size_type pos) const
pos 番目の文字を取得します。
const_reverse_iterator reverse_iterator
文字列の逆方向イテレータですが、const_reverse_iteratorと同一です。
const_iterator begin() const noexcept
最初のキャラクタへの反復子を返します。
bool Proceed(StringView &str, char c) noexcept
strがcで始まっていればその文字列長だけ進めます。
bool StartsWith(const StringView &str, const char *prefix) noexcept
prefixがstrのプレフィックスである場合trueを返します。
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
const_iterator cbegin() const noexcept
最初のキャラクタへの反復子を返します。
StringView(const charT *str, size_type len) noexcept
(計算済みの)文字列長を与えて初期化します。
#define NLIB_CEXPR
利用可能であればconstexprが定義されます。そうでない場合は空文字列です。
const_reverse_iterator crend() const noexcept
最初の文字の前の文字への逆反復子を返します。
const_pointer const_iterator
文字列のイテレータです。
StringView GetName(StringView &str) noexcept
一般に変数名とされるような文字列を取得します。自身のオブジェクト(str)は取得した文字列の次に移動します...
std::stringが持つメソッドをstd::stringを構築せずに利用するためのクラスです。 C++17のstring_viewにtype...
bool starts_with(const charT *s) const noexcept
文字列がs をプレフィックスとして持つかをチェックします。
std::pair< errno_t, size_t > ToDouble(double *v, const StringView &str) noexcept
内部でnlib_double_from_chars()を呼び出して、文字列を数値に変換します。戻り値はエラー値と読み込んだ文...
void Trim(StringView &str) noexcept
文字列の先頭と末尾の空白を切り詰めます。
bool Proceed(const StringView &kwd) noexcept
プレフィックスがkwd と一致していればkwd の文字列長だけ前に進みます。
void remove_suffix(size_type n) noexcept
最後のn 文字を取り除きます。
const charT * const_pointer
文字へのポインタ型です。
const charT & const_reference
文字への参照です。
strlen, strcpy等を安全に使えるようにラップしています。
const_reverse_iterator rbegin() const noexcept
最後の文字への逆反復子を返します。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
bool ToCstring(charT(&str)[N]) const noexcept
StringView(const charT *str) noexcept
str を参照するように初期化されます。内部で文字列長が計算されます。
bool TrimLeft(StringView &str) noexcept
文字列の先頭の空白を切り詰めます。
const charT & front() const
最初の文字を取得します。
size_type size() const noexcept
文字列長を返します。
const_reverse_iterator rend() const noexcept
最初の文字の前の文字への逆反復子を返します。
bool ToCstring(UniquePtr< charT[]> &str) const noexcept
bool Proceed(const charT *kwd) noexcept
プレフィックスがkwd と一致していればkwd の文字列長だけ前に進みます。
void Trim() noexcept
文字列の先頭と末尾の空白を切り詰めます。
const charT & reference
文字への参照ですが、const_referenceと同一です。
StringView GetLine(StringView &str) noexcept
先頭から行末までの文字列を取得します。自身のオブジェクト(str)は次の行の行頭に移動します。 ...