include: co/fastring.h.
#fastring
fastring is the string type in coost. It implements most of the methods in std::string
and also provides some methods that std::string
does not support.
#constructor
1. constexpr fastring() noexcept;
2. explicit fastring(size_t cap);
3. fastring(const void* s, size_t n);
4. fastring(const char* s);
5. fastring(const std::string& s);
6. fastring(size_t n, char c);
7. fastring(char c, size_t n);
8. fastring(const fastring& s);
9. fastring(fastring&& s) noexcept;
-
1, the default constructor, which creates an empty fastring without allocating any memory.
-
2, creates an empty fastring, but uses the parameter cap to specify the initial capacity.
-
3, creates a fastring from the given byte sequence, and the parameter
n
is the sequence length. -
4, creates a fastring from a null-terminated string.
-
5, creates a fastring from
std::string
. -
6-7, initialize fastring to a string of
n
charactersc
. -
8, the copy constructor, which will copy the internal memory.
-
9, the move constructor, which does not copy the memory.
-
Example
fastring s; // empty string, no memory allocation
fastring s(32); // empty string, pre-allocated memory (capacity is 32)
fastring s("hello"); // initialize s to "hello"
fastring s("hello", 3); // initialize s to "hel"
fastring s(88,'x'); // initialize s to 88 'x'
fastring s('x', 88); // initialize s to 88 'x'
fastring t(s); // copy construction
fastring x(std::move(s)); // Move construction, s itself becomes empty
#operator=
1. fastring& operator=(const char* s);
2. fastring& operator=(const std::string& s);
3. fastring& operator=(const fastring& s);
4. fastring& operator=(fastring&& s) noexcept;
-
1, assigns a null-terminated string to fastring,
s
can be part of the fastring for assignment. -
2, assigns the value of
std::string
to fastring. -
3, the copy assignment operation.
-
4, the move assignment operation,
s
itself will become empty. -
Example
fastring s;
fastring t;
s = "hello"; // s -> "hello"
s = s; // nothing will be done
s = s.c_str() + 2; // s -> "llo"
s = std::string("x"); // s -> "x"
t = s; // t -> "x"
t = std::move(s); // t -> "x", s -> ""
#assign
1. fastring& assign(const void* s, size_t n);
2. template<typename S> fastring& assign(S&& s);
- Assign value to fastring, added in v3.0.1.
- In the first one,
n
is the length ofs
. The second is equivalent to operator=.
#βββββββββββ
#back
char& back();
const char& back() const;
- This method returns a reference to the last character in fastring.
If fastring is empty, calling this method will cause undefined behavior.
- Example
fastring s("hello");
char c = s.back(); // c ='o'
s.back() ='x'; // s -> "hellx"
#front
char& front();
const char& front() const;
- This method returns the reference of the first character in fastring.
If fastring is empty, calling this method will cause undefined behavior.
- Example
fastring s("hello");
char c = s.front(); // c ='h'
s.front() ='x'; // s -> "xello"
#operator[]
char& operator[](size_t n);
const char& operator[](size_t n) const;
- This method returns the reference of the nth character in fastring.
If `n`` is out of a reasonable range, calling this method will cause undefined behavior.
- Example
fastring s("hello");
char c = s[1]; // c ='e'
s[1] ='x'; // s -> "hxllo"
#βββββββββββ
#capacity
size_t capacity() const noexcept;
- This method returns the capacity of fastring.
#c_str
const char* c_str() const;
- This method gets the equivalent C string.
- This method adds a ‘\0’ to the end of fastring, it will not change the size and content of fastring, but it may cause internal reallocation of memory.
#data
const char* data() const noexcept;
- This method is similar to c_str(), but it does not guarantee that the string ends with ‘\0’.
#empty
bool empty() const noexcept;
- This method determines whether fastring is empty.
#size
size_t size() const noexcept;
- This method returns the length of fastring.
#βββββββββββ
#clear
1. void clear();
2. void clear(char c);
- Set the size of fastring to 0, the capacity remains unchanged.
- The second is similar to the first, except that it will fill the memory with character
c
before setting its size to 0.
The second one is added in v3.0.1, which can be used to clear sensitive information in memory.
#ensure
void ensure(size_t n);
- This method ensures that the remaining memory of fastring can hold at least
n
characters.
#reserve
void reserve(size_t n);
- This method ensures that the capacity of fastring is at least
n
. - When
n
is less than the original capacity, the capacity remains unchanged.
#reset
void reset();
- Added in v2.0.3. Clear fastring and free the memory.
#resize
void resize(size_t n);
- This method sets the size of fastring to
n
.
Whenn
is greater than the original size, it will expand size ton
, but will not fill the expanded part with zeroes.
- Example
fastring s("hello");
s.resize(3); // s -> "hel"
s.resize(6);
char c = s[5]; // c is an uncertain random value
#shrink
void shrink();
-
Release the extra memory in fastring.
-
Example
fastring s("hello");
s.reserve(32); // capacity -> 32
s.shrink(); // capacity -> 6
#swap
void swap(fastring& s) noexcept;
void swap(fastring&& s) noexcept;
-
Swap the contents of two fastrings, only the data pointer, capacity, and size are exchanged internally.
-
Example
fastring s("hello");
fastring x("world");
s.swap(x); // s -> "world", x -> "hello"
#βββββββββββ
#append
1. fastring& append(const void* s, size_t n);
2. fastring& append(const char* s);
3. fastring& append(const fastring& s);
4. fastring& append(const std::string& s);
5. fastring& append(size_t n, char c);
6. fastring& append(char c, size_t n);
7. fastring& append(char c);
-
1, appends a byte sequence of length
n
. -
2, appends a null-terminated string, and
s
can be part of fastring that performs the append operation. -
3, appends a fastring, and s can be the fastring itself that performs the append operation.
-
4, appends
std::string
. -
5-6, appends
n
charactersc
. -
7, appends a single character c.
-
Example
fastring s;
s.append('c'); // s -> "c"
s.append(2,'c'); // s -> "ccc"
s.append('c', 2); // s -> "ccccc"
s.clear();
s.append('c').append(2,'x'); // s -> "cxx"
s.append(s.c_str() + 1); // s -> "cxxxx"
s.append(s.data(), 3); // s -> "cxxxxcxx"
#append_nomchk
fastring& append_nomchk(const void* s, size_t n);
fastring& append_nomchk(const char* s)
- Similar to append(), but will not check if
s
overlaps with the internal memory.
This method cannot be used if s
may overlap with the internal memory of fastring.
#cat
template<typename X, typename ...V>
fastring& cat(X&& x, V&& ... v);
-
Added in v2.0.3. Concatenate any number of elements to fastring.
-
This method appends elements in the parameters to fastring one by one through
operator<<
. -
Example
fastring s("hello");
s.cat(' ', 23, "xx", false); // s -> "hello 23xxfalse"
#operator«
fastring& operator<<(bool v);
fastring& operator<<(char v);
fastring& operator<<(signed char v);
fastring& operator<<(unsigned char v);
fastring& operator<<(short v);
fastring& operator<<(unsigned short v);
fastring& operator<<(int v);
fastring& operator<<(unsigned int v);
fastring& operator<<(long v);
fastring& operator<<(unsigned long v);
fastring& operator<<(long long v);
fastring& operator<<(unsigned long long v);
fastring& operator<<(double v);
fastring& operator<<(float v);
fastring& operator<<(const dp::_fpt& v);
fastring& operator<<(const void* v);
fastring& operator<<(std::nullptr_t);
fastring& operator<<(const char* s);
fastring& operator<<(const signed char* s);
fastring& operator<<(const unsigned char* s);
fastring& operator<<(const fastring& s);
fastring& operator<<(const std::string& s);
-
Format value of bool, char, integer type, floating point type, pointer type or string type, and append it to fastring.
-
operator<<(const dp::_fpt& v)
is used to output formatted floating-point number, which the effective decimal places can be specified. -
Example
fastring s;
s << 'x'; // s -> "x"
s << s; // s -> "xx" (append itself)
s << false; // s -> "xxfalse"
s.clear();
s << "hello " << 23; // s -> "hello 23"
s << (s.c_str() + 6); // s -> "hello 2323" (append part of s)
s.clear();
s << 3.1415; // s -> "3.1415"
s.clear();
s << (void*)32; // s -> "0x20"
Specify the number of valid decimal places
coost providesdp::_1, dp::_2, ..., dp::_16, dp::_n
to set the number of effective decimal places of floating-point numbers.fastring s; s << dp::_2(3.1415); // "3.14 s << dp::_3(3.1415); // "3.141" s << dp::_n(3.14, 1); // "3.1", equivalent to dp::_1(3.14)
#operator+=
fastring& operator+=(const char* s);
fastring& operator+=(const fastring& s);
fastring& operator+=(const std::string& s);
fastring& operator+=(char c);
-
This method is equivalent to the append() method.
-
Example
fastring s;
s += 'c'; // s -> "c"
s += "xx"; // s -> "cxx"
#push_back
fastring& push_back(char c);
- Append single character to fastring, equivalent to append(c).
#pop_back
char pop_back();
- Pop and return the last character of fastring.
If fastring is empty, calling this method will cause undefined behavior.
#βββββββββββ
#compare
1. int compare(const char* s, size_t n) const;
2. int compare(const char* s) const;
3. int compare(const fastring& s) const noexcept;
4. int compare(const std::string& s) const noexcept;
5. int compare(size_t pos, size_t len, const char* s, size_t n) const;
6. int compare(size_t pos, size_t len, const char* s) const;
7. int compare(size_t pos, size_t len, const fastring& s) const;
8. int compare(size_t pos, size_t len, const std::string& s) const;
9. int compare(size_t pos, size_t len, const fastring& s, size_t spos, size_t n=npos) const;
10. int compare(size_t pos, size_t len, const std::string& s, size_t spos, size_t n=npos) const;
- Compare fastring with the specified string.
- 1-4, compare fastring with
s
,n
is the length ofs
. - 5-8, Compare the
[pos, pos+len)
part of fastring withs
,n
is the length ofs
. - 9-10, Compare the
[pos, pos+len)
part of fastring with the[spos, spos+n)
part ofs
.
#contains
bool contains(char c) const;
bool contains(const char* s) const;
bool contains(const fastring& s) const;
bool contains(const std::string& s) const;
- Check if the fastring contains the given character or substring.
#find
1. size_t find(char c) const;
2. size_t find(char c, size_t pos) const;
3. size_t find(char c, size_t pos, size_t len) const;
4. size_t find(const char* s) const;
5. size_t find(const char* s, size_t pos) const;
6. size_t find(const char* s, size_t pos, size_t n) const;
7. size_t find(const fastring& s, size_t pos=0) const;
8. size_t find(const std::string& s, size_t pos=0) const;
- 1, search for character c from position 0.
- 2, search for character c from position
pos
. - 3, added in v3.0, search for character c in range
[pos, pos + len)
. - 4, search substring s from position 0.
- 5, search substring s from position
pos
. - 6, search substring s from position
pos
,n
is the length of s. - 7-8, search substring s from position
pos
. - This method returns the position of the character or substring when the search succeeds, otherwise it returns
npos
.
Coost v3.0.1 adds the above 6-8, and supports the search of binary strings.
- Example
fastring s("hello");
s.find('l'); // return 2
s.find('l', 3); // return 3
s.find("ll"); // return 2
s.find("ll", 3); // return s.npos
#ifind
size_t ifind(char c, size_t pos=0) const;
size_t ifind(const char* s) const;
size_t ifind(const char* s, size_t pos) const
size_t ifind(const char* s, size_t pos, size_t n) const;
size_t ifind(const fastring& s, size_t pos=0) const;
size_t ifind(const std::string& s, size_t pos=0) const;
-
Added in v3.0.1, similar to find, but will ignore the case.
-
Example
fastring s("hello");
s.ifind('L'); // return 2
s.ifind('L', 3); // return 3
s.ifind("Ll"); // return 2
#rfind
1. size_t rfind(char c) const;
2. size_t rfind(char c, size_t pos) const;
3. size_t rfind(const char* s) const;
4. size_t rfind(const char* s, size_t pos) const;
5. size_t rfind(const char* s, size_t pos, size_t n) const;
6. size_t rfind(const fastring& s, size_t pos=npos) const;
7. size_t rfind(const std::string& s, size_t pos=npos) const;
- Similar to find, but search in reverse order.
Coost v3.0.1 adds the above 2, 4-7, and supports reverse search of binary strings.
- Example
fastring s("hello");
s.rfind('l'); // return 3
s.rfind('l', 2); // return 2
s.rfind("ll"); // return 2
s.rfind("le"); // return s.npos
#find_first_of
1. size_t find_first_of(const char* s, size_t pos=0) const;
2. size_t find_first_of(const char* s, size_t pos, size_t n) const;
3. size_t find_first_of(const fastring& s, size_t pos=0) const;
4. size_t find_first_of(const std::string& s, size_t pos=0) const;
- Find the first occurrence of a character in the specified character set
s
,n
is the length ofs
. - This method searches from position
pos
(0 by default), and when it encounters any character ins
, it returns the position of the character, otherwise it returnsnpos
.
Coost v3.0.1 adds 2-4, and supports search of binary strings.
- Example
fastring s("hello");
s.find_first_of("def"); // return 1
s.find_first_of("ol", 3); // return 3
#find_first_not_of
1. size_t find_first_not_of(char c, size_t pos=0) const;
2. size_t find_first_not_of(const char* s, size_t pos=0) const;
3. size_t find_first_not_of(const char* s, size_t pos, size_t n) const;
4. size_t find_first_not_of(const fastring& s, size_t pos=0) const;
5. size_t find_first_not_of(const std::string& s, size_t pos=0) const;
- Find the first occurrence of a character not equal to
c
or not in the specified character sets
, from positionpos
,n
is the length ofs
. - This method searches from postion
pos
(0 by default), when it encounters any character not equal toc
or not ins
, it returns the position of the character, otherwise it returnsnpos
.
Coost v3.0.1 adds 3-5, and supports search of binary strings.
- Example
fastring s("hello");
s.find_first_not_of("he"); // return 2
s.find_first_not_of("he", 3); // return 3
s.find_first_not_of('x'); // return 0
#find_last_of
1. size_t find_last_of(const char* s, size_t pos=npos) const;
2. size_t find_last_of(const char* s, size_t pos, size_t n) const;
3. size_t find_last_of(const fastring& s, size_t pos=npos) const;
4. size_t find_last_of(const std::string& s, size_t pos=npos) const;
- Find the last occurrence of a character in the specified character set
s
. - This method starts a reverse search from
pos
(npos
by default), and when it encounters any character ins
, it returns the position of the character, otherwise it returnsnpos
.
Coost v3.0.1 adds 2-4. This method supports search of binary strings.
- Example
fastring s("hello");
s.find_last_of("le"); // return 3
s.find_last_of("le", 1); // return 1
#find_last_not_of
1. size_t find_last_not_of(char c, size_t pos=npos) const;
2. size_t find_last_not_of(const char* s, size_t pos=npos) const;
3. size_t find_last_not_of(const char* s, size_t pos, size_t n) const;
4. size_t find_last_not_of(const fastring& s, size_t pos=npos) const;
5. size_t find_last_not_of(const std::string& s, size_t pos=npos) const;
- Find the last occurrence of a character not equal to
c
or not in the specified character sets
. - This method starts a reverse search from
pos
(npos
by default), and when it encounters any character not equal toc
or not ins
, it returns the position of the character, otherwise it returnsnpos
.
Coost v3.0.1 adds 3-5, and supports search of binary strings.
- Example
fastring s("hello");
s.find_last_not_of("le"); // return 4
s.find_last_not_of("le", 3); // return 0
s.find_last_not_of('o'); // return 3
#npos
static const size_t npos = (size_t)-1;
-
It is the maximum value of the size_t type.
-
When it is used as the length, it means until the end of the string.
-
When it is used as the return value, it means not found.
-
Example
fastring s("hello");
size_t r = s.find('x');
r == s.npos; // true
#substr
fastring substr(size_t pos) const;
fastring substr(size_t pos, size_t len) const;
-
The first version returns the substring starting at position pos.
-
The second version returns a substring of length len starting at position pos.
-
Example
fastring s("hello");
s.substr(2); // "llo"
s.substr(2, 2); // "ll"
#βββββββββββ
#starts_with
bool starts_with(char c) const;
bool starts_with(const char* s, size_t n) const;
bool starts_with(const char* s) const;
bool starts_with(const fastring& s) const;
bool starts_with(const std::string& s) const;
- This method determines whether fastring starts with character
c
or strings
,n
is the length ofs
. - When
s
is empty, this method always returns true.
#ends_with
bool ends_with(char s) const;
bool ends_with(const char* s, size_t n) const;
bool ends_with(const char* s) const;
bool ends_with(const fastring& s) const;
bool ends_with(const std::string& s) const;
- This method determines whether fastring ends with character
c
or strings
,n
is the length ofs
. - When
s
is empty, this method always returns true.
#match
bool match(const char* pattern) const;
-
Check whether fastring matches the pattern,
*
matches 0 or more characters, and?
matches exactly one character. -
Example
fastring s("hello");
s.match("he??o"); // true
s.match("h*o"); // true
s.match("he?o"); // false
s.match("*o"); // true
s.match("h*l?"); // true
#remove_prefix
fastring& remove_prefix(const char* s, size_t n);
fastring& remove_prefix(const char* s);
fastring& remove_prefix(const fastring& s);
fastring& remove_prefix(const std::string& s);
-
Remove the prefix
s
of fastring,n
is the length ofs
. -
Added in v3.0.1.
-
Example
fastring s("12345678");
s.remove_prefix("123"); // s -> "45678"
s.remove_prefix("xxx"); // nothing will be done
#remove_suffix
fastring& remove_suffix(const char* s, size_t n);
fastring& remove_suffix(const char* s);
fastring& remove_suffix(const fastring& s);
fastring& remove_suffix(const std::string& s);
- Remove the suffix
s
from fastring,n
is the length ofs
.
Coost v3.0.1 renames remove_tail to remove_suffix.
- Example
fastring s("hello.log");
s.remove_suffix(".log"); // s -> "hello"
s.remove_suffix(".xxx"); // nothing will be done
#βββββββββββ
#replace
1. fastring& replace(const char* sub, const char* to, size_t maxreplace=0);
2. fastring& replace(const fastring& sub, const fastring& to, size_t maxreplace=0);
3. fastring& replace(const char* sub, size_t n, const char* to, size_t m, size_t maxreplace=0);
- This method replaces the substring
sub
in fastring withto
. The parametermaxreplace
specifies the maximum number of replacements, and 0 means unlimited.n
andm
are the lengths of the substringssub
andto
respectively.
Coost v3.0.1 adds 2-3, and supports replacement of binary strings.
- Example
fastring s("hello");
s.replace("ll", "rr"); // s -> "herro"
s.replace("err", "ok").replace("k", "o"); // s -> "hooo"
#strip
fastring& strip(const char* s=" \t\r\n", char d='b');
fastring& strip(char s, char d='b');
- Trim the string, the same as trim.
#trim
1. fastring& trim(char c, char d='b');
2. fastring& trim(unsigned char c, char d='b');
3. fastring& trim(signed char c, char d='b');
4. fastring& trim(const char* s=" \t\r\n", char d='b');
5. fastring& trim(size_t n, char d='b');
6. fastring& trim(int n, char d='b');
- Trim the string, remove the specified characters on the left, right, or both sides of fastring.
- The parameter
d
is the direction, ’l’ or ‘L’ means left, ‘r’ or ‘R’ means right, and the default is ‘b’ for both sides. - 1-3, remove single character
c
from left, right or both sides. - 4, remove characters in
s
on the left, right or both sides. - 5-6, remove
n
characters from the left, right or both sides.
Since v3.0.1, the parameterc
can be\0
.
- Example
fastring s = " sos\r\n";
s.trim(); // s -> "sos"
s.trim('s', 'l'); // s -> "os"
s.trim('s', 'r'); // s -> "o"
s = "[[xx]]";
s.trim(2); // s -> "xx"
#tolower
fastring& tolower();
- This method converts fastring to lowercase and returns a reference to fastring.
#toupper
fastring& toupper();
- This method converts fastring to uppercase and returns a reference to fastring.
#lower
fastring lower() const;
- This method returns the lowercase form of fastring.
#upper
fastring upper() const;
-
This method returns the uppercase form of fastring.
-
Example
fastring s("Hello");
fastring x = s.lower(); // x = "hello", s remains unchanged
fastring y = s.upper(); // x = "HELLO", s remains unchanged
s.tolower(); // s -> "hello"
s.toupper(); // s -> "HELLO"
#global functions
#operator+
fastring operator+(const fastring& a, char b);
fastring operator+(char a, const fastring& b);
fastring operator+(const fastring& a, const fastring& b);
fastring operator+(const fastring& a, const char* b);
fastring operator+(const char* a, const fastring& b);
fastring operator+(const fastring& a, const std::string& b);
fastring operator+(const std::string& a, const fastring& b);
-
At least one parameter of this method is fastring.
-
Example
fastring s;
s = s + '^'; // s -> "^"
s = "o" + s + "o"; // s -> "o^o"
#operator==
bool operator==(const fastring& a, const fastring& b);
bool operator==(const fastring& a, const char* b);
bool operator==(const char* a, const fastring& b);
bool operator==(const fastring& a, const std::string& b);
bool operator==(const std::string& a, const fastring& b);
- This method determines whether two strings are equal, at least one parameter is fastring.
#operator!=
bool operator!=(const fastring& a, const fastring& b);
bool operator!=(const fastring& a, const char* b);
bool operator!=(const char* a, const fastring& b);
bool operator!=(const fastring& a, const std::string& b);
bool operator!=(const std::string& a, const fastring& b);
- This method determines whether two strings are not equal, at least one parameter is fastring.
#operator<
bool operator<(const fastring& a, const fastring& b);
bool operator<(const fastring& a, const char* b);
bool operator<(const char* a, const fastring& b);
bool operator<(const fastring& a, const std::string& b);
bool operator<(const std::string& a, const fastring& b);
- This method determines whether the string a is less than b, and at least one parameter is fastring.
#operator>
bool operator>(const fastring& a, const fastring& b);
bool operator>(const fastring& a, const char* b);
bool operator>(const char* a, const fastring& b);
bool operator>(const fastring& a, const std::string& b);
bool operator>(const std::string& a, const fastring& b);
- This method determines whether the string a is greater than b, and at least one parameter is fastring.
#operator<=
bool operator<=(const fastring& a, const fastring& b);
bool operator<=(const fastring& a, const char* b);
bool operator<=(const char* a, const fastring& b);
bool operator<=(const fastring& a, const std::string& b);
bool operator<=(const std::string& a, const fastring& b);
- This method determines whether the string a is less than or equal to b. At least one parameter is fastring.
#operator>=
bool operator>=(const fastring& a, const fastring& b);
bool operator>=(const fastring& a, const char* b);
bool operator>=(const char* a, const fastring& b);
bool operator>=(const fastring& a, const std::string& b);
bool operator>=(const std::string& a, const fastring& b);
-
This method determines whether the string a is greater than or equal to b, and at least one parameter is fastring.
-
Example
fastring s("hello");
s == "hello"; // true
s != "hello"; // false
s > "aa"; // true
s < "xx"; // true
s >= "he"; // true
s <= "he"; // false
#operator«
std::ostream& operator<<(std::ostream& os, const fastring& s);
- Example
fastring s("xx");
std::cout << s << std::endl;