16 #ifndef INCLUDE_NN_NLIB_STRINGVIEW_H_ 17 #define INCLUDE_NN_NLIB_STRINGVIEW_H_ 43 static const size_type npos = size_type(-1);
49 NLIB_ASSERT(this->IsValid_());
52 NLIB_ASSERT(this->IsValid_());
57 NLIB_ASSERT(this->IsValid_());
65 const_reverse_iterator
rend() const
NLIB_NOEXCEPT {
return const_reverse_iterator(begin()); }
71 NLIB_ASSERT(this->IsValid_());
75 NLIB_ASSERT(this->IsValid_());
83 NLIB_ASSERT(this->IsValid_());
86 const charT&
at(size_type pos)
const {
87 NLIB_ASSERT(this->IsValid_());
90 const charT&
front()
const {
return (*
this)[0]; }
91 const charT&
back()
const {
return (*
this)[this->length() - 1]; }
118 NLIB_ASSERT(this->IsValid_());
119 if (pos >= len_)
return StringView(base_ + len_, 0);
120 const charT* new_base = base_ + pos;
121 size_type r =
static_cast<size_type
>(len_ - pos);
122 size_type new_len = r > n ? n : r;
128 NLIB_ASSERT(this->IsValid_());
129 if (s.
length() > this->length())
return false;
132 bool starts_with(charT c)
const NLIB_NOEXCEPT {
return front() == c; }
137 NLIB_ASSERT(this->IsValid_());
138 if (s.
length() > len_)
return false;
142 bool ends_with(charT c)
const NLIB_NOEXCEPT {
return back() == c; }
144 bool ToCstring(charT* str, size_type buf_size)
const NLIB_NOEXCEPT;
145 template <
size_type N>
147 return ToCstring(str, N);
149 #ifdef NLIB_CXX11_DEFAULT_TEMPLATE_ARGUMENT_FOR_FUNCTION_TEMPLATES 150 template<
class DUMMY =
void>
154 NLIB_ASSERT(this->IsValid_());
155 str.reset(
new (std::nothrow) charT[len_ + 1]);
156 if (!str)
return false;
157 return ToCstring(str.get(), len_ + 1);
179 if (!this->starts_with(kwd))
return false;
181 len_ -= kwd.length();
225 bool IsValid_()
const NLIB_NOEXCEPT {
226 if (!base_)
return false;
234 inline errno_t StringView::ToInteger(int8_t* v, size_type* idx,
int base)
const NLIB_NOEXCEPT {
236 errno_t e = ToInteger(&tmp, idx, base);
237 if (e != 0)
return e;
238 if (tmp > 127 || tmp < -128)
return ERANGE;
239 *v =
static_cast<int8_t
>(tmp);
244 inline errno_t StringView::ToInteger(int16_t* v, size_type* idx,
int base)
const NLIB_NOEXCEPT {
246 errno_t e = ToInteger(&tmp, idx, base);
247 if (e != 0)
return e;
248 if (tmp > 32767 || tmp < -32768)
return ERANGE;
249 *v =
static_cast<int16_t
>(tmp);
254 inline errno_t StringView::ToInteger(uint8_t* v, size_type* idx,
int base)
const NLIB_NOEXCEPT {
256 errno_t e = ToInteger(&tmp, idx, base);
257 if (e != 0)
return e;
258 if (tmp > 255)
return ERANGE;
259 *v =
static_cast<uint8_t
>(tmp);
264 inline errno_t StringView::ToInteger(uint16_t* v, size_type* idx,
int base)
const NLIB_NOEXCEPT {
266 errno_t e = ToInteger(&tmp, idx, base);
267 if (e != 0)
return e;
268 if (tmp > 65535)
return ERANGE;
269 *v =
static_cast<uint16_t
>(tmp);
273 inline bool StringView::Proceed(charT ch) NLIB_NOEXCEPT {
274 if (this->starts_with(ch)) {
285 NLIB_ASSERT(this->IsValid_());
286 const charT* s = base_;
287 const charT* s_end = base_ + len_;
288 charT c = (s != s_end) ? *s :
'\0';
292 c = (s != s_end) ? *s :
'\0';
295 size_type len = s - base_;
304 return lhs.compare(rhs) == 0;
307 return !(lhs == rhs);
310 return lhs.compare(rhs) < 0;
313 return lhs.compare(rhs) > 0;
316 return lhs.compare(rhs) <= 0;
319 return lhs.compare(rhs) >= 0;
324 #endif // INCLUDE_NN_NLIB_STRINGVIEW_H_ void remove_prefix(size_type n) noexcept
最初のn 文字を取り除きます。
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)を返します。
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 StringView &lhs, const StringView &rhs) noexcept
文字列を辞書順で比較します。
bool operator==(const HeapHash &rhs, const HeapHash &lhs)
2つのサマリを比較して等価ならば、trueを返します。
std::unique_ptrに相当するクラスが定義されています。
bool operator!=(const HeapHash &rhs, const HeapHash &lhs)
2つのサマリを比較して等価でなければ、trueを返します。
char charT
現在はchar型専用のクラスです。
bool starts_with(charT c) const noexcept
文字c で始まるかどうかをチェックします。
const charT & operator[](size_type pos) const
pos 番目の文字を取得します。
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
デフォルトコンストラクタです。空文字列で初期化されます。
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 番目の文字を取得します。
bool operator<(const StringView &lhs, const StringView &rhs) noexcept
文字列を辞書順で比較します。
const_reverse_iterator reverse_iterator
文字列の逆方向イテレータですが、const_reverse_iteratorと同一です。
bool operator>=(const StringView &lhs, const StringView &rhs) noexcept
文字列を辞書順で比較します。
const_iterator begin() const noexcept
最初のキャラクタへの反復子を返します。
#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
文字列のイテレータです。
std::stringが持つメソッドをstd::stringを構築せずに利用するためのクラスです。
bool starts_with(const charT *s) const noexcept
文字列がs をプレフィックスとして持つかをチェックします。
bool operator>(const StringView &lhs, const StringView &rhs) 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
最後の文字への逆反復子を返します。
bool ToCstring(charT(&str)[N]) const noexcept
StringView(const charT *str) noexcept
str を参照するように初期化されます。内部で文字列長が計算されます。
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と同一です。