3 #ifndef INCLUDE_NN_NLIB_STRINGVIEW_H_
4 #define INCLUDE_NN_NLIB_STRINGVIEW_H_
30 static const size_type npos = size_type(-1);
36 NLIB_ASSERT(this->IsValid_());
39 NLIB_ASSERT(this->IsValid_());
44 NLIB_ASSERT(this->IsValid_());
52 const_reverse_iterator
rend() const
NLIB_NOEXCEPT {
return const_reverse_iterator(begin()); }
58 NLIB_ASSERT(this->IsValid_());
62 NLIB_ASSERT(this->IsValid_());
70 NLIB_ASSERT(this->IsValid_());
73 const charT&
at(size_type pos)
const {
74 NLIB_ASSERT(this->IsValid_());
77 const charT&
front()
const {
return (*
this)[0]; }
78 const charT&
back()
const {
return (*
this)[this->length() - 1]; }
105 NLIB_ASSERT(this->IsValid_());
106 if (pos >= m_Len)
return StringView(m_Base + m_Len, 0);
107 const charT* newBase = m_Base + pos;
108 size_type r =
static_cast<size_type
>(m_Len - pos);
109 size_type newLen = r > n ? n : r;
115 NLIB_ASSERT(this->IsValid_());
116 if (s.length() > this->length())
return false;
117 return nlib_memcmp(s.data(), m_Base,
sizeof(*m_Base) * s.length()) == 0;
119 bool starts_with(charT c)
const NLIB_NOEXCEPT {
return front() == c; }
124 NLIB_ASSERT(this->IsValid_());
125 if (s.length() > m_Len)
return false;
126 return nlib_memcmp(s.data(), m_Base + m_Len - s.length(),
sizeof(*m_Base) * s.length()) ==
129 bool ends_with(charT c)
const NLIB_NOEXCEPT {
return back() == c; }
133 template <
size_type N>
135 return ToCstring(str, N);
140 int base = 10) const NLIB_NOEXCEPT;
142 int base = 10) const NLIB_NOEXCEPT;
144 int base = 10) const NLIB_NOEXCEPT;
146 int base = 10) const NLIB_NOEXCEPT;
147 errno_t ToInteger(int8_t* v, size_type* idx = NULL,
int base = 10) const NLIB_NOEXCEPT;
148 errno_t ToInteger(int16_t* v, size_type* idx = NULL,
int base = 10) const NLIB_NOEXCEPT;
149 errno_t ToInteger(uint8_t* v, size_type* idx = NULL,
int base = 10) const NLIB_NOEXCEPT;
150 errno_t ToInteger(uint16_t* v, size_type* idx = NULL,
int base = 10) const NLIB_NOEXCEPT;
156 void Trim() NLIB_NOEXCEPT {
162 if (!this->starts_with(kwd))
return false;
164 m_Len -= kwd.length();
208 bool IsValid_() const NLIB_NOEXCEPT {
209 if (!m_Base)
return false;
216 inline errno_t StringView::ToInteger(int8_t* v, size_type* idx,
int base)
const NLIB_NOEXCEPT {
218 errno_t e = ToInteger(&tmp, idx, base);
219 if (e != 0)
return e;
220 if (tmp > 127 || tmp < -128)
return ERANGE;
221 *v =
static_cast<int8_t
>(tmp);
225 inline errno_t StringView::ToInteger(int16_t* v, size_type* idx,
int base)
const NLIB_NOEXCEPT {
227 errno_t e = ToInteger(&tmp, idx, base);
228 if (e != 0)
return e;
229 if (tmp > 32767 || tmp < -32768)
return ERANGE;
230 *v =
static_cast<int16_t
>(tmp);
234 inline errno_t StringView::ToInteger(uint8_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 > 255)
return ERANGE;
239 *v =
static_cast<uint8_t
>(tmp);
243 inline errno_t StringView::ToInteger(uint16_t* v, size_type* idx,
int base)
const NLIB_NOEXCEPT {
245 errno_t e = ToInteger(&tmp, idx, base);
246 if (e != 0)
return e;
247 if (tmp > 65535)
return ERANGE;
248 *v =
static_cast<uint16_t
>(tmp);
252 inline bool StringView::Proceed(charT ch) NLIB_NOEXCEPT {
253 if (this->starts_with(ch)) {
264 NLIB_ASSERT(this->IsValid_());
265 const charT* s = m_Base;
266 const charT* s_end = m_Base + m_Len;
267 charT c = (s != s_end) ? *s :
'\0';
268 if (!
IsAlpha(c) && c !=
'_')
return *
this;
271 c = (s != s_end) ? *s :
'\0';
272 if (!
IsAlnum(c) && c !=
'_')
break;
274 size_type len = s - m_Base;
283 return lhs.compare(rhs) == 0;
286 return !(lhs == rhs);
289 return lhs.compare(rhs) < 0;
292 return lhs.compare(rhs) > 0;
295 return lhs.compare(rhs) <= 0;
298 return lhs.compare(rhs) >= 0;
303 #endif // INCLUDE_NN_NLIB_STRINGVIEW_H_
void remove_prefix(size_type n) noexcept
最初のn 文字を取り除きます。
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
std::reverse_iterator< const_iterator > const_reverse_iterator
文字列の逆方向イテレータです
size_type max_size() const noexcept
文字列長の最大値を返します。
size_t size_type
非負整数型で、現在はsize_tにtypedefされています。
const_iterator end() const noexcept
最後の文字に続く文字への反復子を返します。
void clear() noexcept
空文字列を設定します。
ptrdiff_t difference_type
イテレータの差分をとったときに返される型です。
const_iterator cbegin() const noexcept
最初のキャラクタへの反復子を返します。
const charT & front() const
最初の文字を取得します。
const_reverse_iterator crend() const noexcept
最初の文字の前の文字への逆反復子を返します。
bool starts_with(const StringView &s) const noexcept
文字列がs をプレフィックスとして持つかをチェックします。
size_type length() const noexcept
文字列長を返します。
int IsAlnum(int c) noexcept
std::isalnum(static_cast(c))を返します。
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型専用のクラスです。
const charT & back() const
最後の文字を取得します。
constexpr StringView() noexcept
デフォルトコンストラクタです。空文字列で初期化されます。
const charT & operator[](size_type pos) const
pos 番目の文字を取得します。
bool empty() const noexcept
空文字列であるかどうかをチェックします。
int IsAlpha(int c) noexcept
std::isalpha(static_cast(c))を返します。
const charT * pointer
文字へのポインタ型ですが、const_pointerと同一です。
const_iterator iterator
文字列のイテレータですが、const_iteratorと同一です。
#define NLIB_CEXPR
利用可能であればconstexprが定義されます。そうでない場合は空文字列です。
bool operator<(const StringView &lhs, const StringView &rhs) noexcept
文字列を辞書順で比較します。
const charT & at(size_type pos) const
pos 番目の文字を取得します。
bool ToCstring(charT(&str)[N]) const noexcept
const_reverse_iterator reverse_iterator
文字列の逆方向イテレータですが、const_reverse_iteratorと同一です。
bool operator>=(const StringView &lhs, const StringView &rhs) noexcept
文字列を辞書順で比較します。
const_reverse_iterator crbegin() const noexcept
最後の文字への逆反復子を返します。
StringView(const charT *str, size_type len) noexcept
(計算済みの)文字列長を与えて初期化します。
int compare(const charT *s) const noexcept
文字列を比較します。
StringView substr(size_type pos, size_type n=npos) const noexcept
部分文字列[pos, pos + n)を返します。
const_pointer const_iterator
文字列のイテレータです。
const charT * data() const noexcept
最初の文字へのポインタを返します。
std::stringが持つメソッドをstd::stringを構築せずに利用するためのクラスです。
size_type size() const noexcept
文字列長を返します。
bool operator>(const StringView &lhs, const StringView &rhs) noexcept
文字列を辞書順で比較します。
const_reverse_iterator rbegin() const noexcept
最後の文字への逆反復子を返します。
void remove_suffix(size_type n) noexcept
最後のn 文字を取り除きます。
const_iterator begin() const noexcept
最初のキャラクタへの反復子を返します。
const charT * const_pointer
文字へのポインタ型です。
const charT & const_reference
文字への参照です。
bool starts_with(charT c) const noexcept
文字c で始まるかどうかをチェックします。
strlen, strcpy等を安全に使えるようにラップしています。
bool ends_with(charT c) const noexcept
末尾が文字c であるかどうかをチェックします。
const_reverse_iterator rend() const noexcept
最初の文字の前の文字への逆反復子を返します。
bool ends_with(const charT *s) const noexcept
文字列がs をサフィックスとして持つかをチェックします。
StringView(const charT *str) noexcept
str を参照するように初期化されます。内部で文字列長が計算されます。
const_iterator cend() const noexcept
最後の文字に続く文字への反復子を返します。
bool starts_with(const charT *s) const noexcept
文字列がs をプレフィックスとして持つかをチェックします。
bool ends_with(const StringView &s) const noexcept
文字列がs をサフィックスとして持つかをチェックします。
bool Proceed(const charT *kwd) noexcept
プレフィックスがkwd と一致していればkwd の文字列長だけ前に進みます。
const charT & reference
文字への参照ですが、const_referenceと同一です。