16 #ifndef INCLUDE_NN_NLIB_STRINGVIEW_H_ 17 #define INCLUDE_NN_NLIB_STRINGVIEW_H_ 28 #if __has_include(<string_view>) && (!defined(_MSVC_LANG) || _MSVC_LANG > 201402L) \ 29 && (defined(_MSC_VER) || __cplusplus > 201402L) 30 #include <string_view> 33 typedef std::string_view StringView;
36 #elif __has_include(<experimental/string_view>) 37 #include <experimental/string_view> 40 typedef std::experimental::string_view StringView;
67 NLIB_ASSERT(this->IsValid_());
70 NLIB_ASSERT(this->IsValid_());
75 NLIB_ASSERT(this->IsValid_());
89 NLIB_ASSERT(this->IsValid_());
93 NLIB_ASSERT(this->IsValid_());
101 NLIB_ASSERT(this->IsValid_());
105 NLIB_ASSERT(this->IsValid_());
109 const charT&
back()
const {
return (*
this)[this->length() - 1]; }
136 NLIB_ASSERT(this->IsValid_());
137 if (pos >= len_)
return StringView(base_ + len_, 0);
138 const charT* new_base = base_ + pos;
147 return it == end() ? npos : it - begin();
149 size_type find(charT c)
const {
return find(StringView(&c, 1)); }
150 size_type find(
const charT* s)
const {
return find(StringView(s,
nlib_strlen(s))); }
151 size_type rfind(
const StringView& s)
const {
152 StringView::iterator it = std::find_end(begin(), end(), s.begin(), s.end());
153 return it == end() ? npos : it - begin();
155 size_type rfind(charT c)
const {
return rfind(StringView(&c, 1)); }
156 size_type rfind(
const charT* s)
const {
return rfind(StringView(s,
nlib_strlen(s))); }
157 size_type find_first_of(
const StringView& s)
const {
158 StringView::iterator it = std::find_first_of(begin(), end(), s.begin(), s.end());
159 return it == end() ? npos : it - begin();
161 size_type find_first_of(charT c)
const {
return find_first_of(StringView(&c, 1)); }
162 size_type find_first_of(
const charT* s)
const {
163 return find_first_of(StringView(s,
nlib_strlen(s)));
165 size_type find_last_of(
const StringView& s)
const {
166 StringView::reverse_iterator it = std::find_first_of(rbegin(), rend(), s.begin(), s.end());
167 return it == rend() ? std::string::npos : it.base() - 1 - begin();
169 size_type find_last_of(charT c)
const {
return find_last_of(StringView(&c, 1)); }
170 size_type find_last_of(
const charT* s)
const {
171 return find_last_of(StringView(s,
nlib_strlen(s)));
184 if (!base_)
return false;
193 return lhs.compare(rhs) == 0;
195 NLIB_EQUAL_OPERATOR(StringView)
197 return lhs.compare(rhs) < 0;
199 NLIB_COMPARE_OPERATOR(StringView)
208 if (prefix.length() > str.length())
return false;
209 return nlib_memcmp(prefix.data(), str.data(), prefix.length()) == 0;
212 return str.front() == c;
218 if (suffix.length() > str.length())
return false;
219 return nlib_memcmp(suffix.data(), &*str.end() - suffix.length(), suffix.length()) == 0;
222 return str.back() == c;
228 if (!buf || buf_size == 0)
return false;
229 size_t len = str.length();
230 errno_t e = nlib_memcpy(buf, buf_size - 1, str.data(), len);
242 #ifdef __cpp_rvalue_references 244 size_t buf_size = str.length() + 1;
245 char* p =
new (std::nothrow)
char[buf_size];
246 if (!p)
return nullptr;
251 inline std::pair<errno_t, size_t>
255 return std::make_pair(e, eptr - str.data());
257 inline std::pair<errno_t, size_t>
261 return std::make_pair(e, eptr - str.data());
263 inline std::pair<errno_t, size_t>
267 return std::make_pair(e, eptr - str.data());
269 inline std::pair<errno_t, size_t>
273 return std::make_pair(e, eptr - str.data());
275 inline std::pair<errno_t, size_t>
279 return std::make_pair(e, eptr - str.data());
281 inline std::pair<errno_t, size_t>
285 return std::make_pair(e, eptr - str.data());
287 inline std::pair<errno_t, size_t>
291 return std::make_pair(e, eptr - str.data());
293 inline std::pair<errno_t, size_t>
297 return std::make_pair(e, eptr - str.data());
302 return std::make_pair(e, eptr - str.data());
307 return std::make_pair(e, eptr - str.data());
316 for (; it != itend; ++it) {
319 ptrdiff_t cnt = std::distance(str.begin(), it);
320 if (cnt == 0)
return false;
321 str.remove_prefix(cnt);
327 for (; it != itend; ++it) {
330 ptrdiff_t cnt = std::distance(str.rbegin(), it);
331 if (cnt == 0)
return false;
332 str.remove_suffix(cnt);
340 const char* beg = str.data();
341 const char* p =
static_cast<const char*
>(
nlib_memchr(beg,
'\n', str.length()));
344 str.remove_prefix(str.length());
347 size_t width = p - beg;
348 if (width > 0 && *(p - 1) ==
'\r') --width;
350 str.remove_prefix(p - beg + 1);
355 str.remove_prefix(prefix.length());
363 str.remove_prefix(1);
371 while (++it != it_end) {
375 ptrdiff_t len = std::distance(str.begin(), it);
383 #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進数として文字列を数値に変換します。
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
空文字列であればtrue、そうでなければfalseを返します。
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()を呼び出して、文字列を数値に変換します。戻り値はエラー値と読み込んだ文字...
const_reverse_iterator crbegin() const noexcept
末尾要素を指す読み取り専用逆反復子を取得します。
size_type length() const noexcept
文字列長を返します。
C++11環境(エイリアステンプレートが可能な環境)においてはstd::unique_ptrにエイリアステンプレートされま...
bool operator==(const HeapHash &rhs, const HeapHash &lhs)
2つのサマリを比較して等価ならば、trueを返します。
std::unique_ptrに相当するクラスが定義されています。
char charT
現在はchar型専用のクラスです。
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を返します。
const charT & back() const
最後の要素への参照を取得します。
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...
std::pair< errno_t, size_t > ToDouble(double *v, const StringView &str) noexcept
内部でnlib_double_from_chars()を呼び出して、文字列を数値に変換します。戻り値はエラー値と読み込んだ文...
void Trim(StringView &str) noexcept
文字列の先頭と末尾の空白を切り詰めます。
void remove_suffix(size_type n) noexcept
最後のn 文字を取り除きます。
const charT * const_pointer
要素への読み取り専用ポインタです。
const charT & const_reference
要素への読み取り専用参照です。
strlen, strcpy等を安全に使えるようにラップしています。
const_reverse_iterator rbegin() 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
先頭の前を指す読み取り専用逆反復子を取得します。
const charT & reference
const_referenceと同一です。
StringView GetLine(StringView &str) noexcept
先頭から行末までの文字列を取得します。自身のオブジェクト(str)は次の行の行頭に移動します。 ...