Commit 284f19bf by Jerry Quinn Committed by Jerry Quinn

basic_string.h: Document public functions.

2003-07-15  Jerry Quinn  <jlquinn@optonline.net>

        * include/bits/basic_string.h:  Document public functions.
	* docs/doxygen/TODO:  Update c21 todo.

From-SVN: r69386
parent 709e7c9f
2003-07-15 Jerry Quinn <jlquinn@optonline.net> 2003-07-15 Jerry Quinn <jlquinn@optonline.net>
* include/bits/basic_string.h: Document public functions.
* docs/doxygen/TODO: Update c21 todo.
2003-07-15 Jerry Quinn <jlquinn@optonline.net>
* include/bits/stl_list.h: Document more functions. * include/bits/stl_list.h: Document more functions.
* docs/doxygen/TODO: Update c23 todo. * docs/doxygen/TODO: Update c23 todo.
......
...@@ -22,8 +22,7 @@ c17 FINISHED (Nothing in Clause 17 "exists" in terms of code.) ...@@ -22,8 +22,7 @@ c17 FINISHED (Nothing in Clause 17 "exists" in terms of code.)
c18 FINISHED, Note A c18 FINISHED, Note A
c19 Note A c19 Note A
c20 Note A c20 Note A
c21 Untouched (top-level class note for basic_string done), c21 Public functions basic_string done, Note B
Note B
c22 Untouched; see docs/html/22_locale/* c22 Untouched; see docs/html/22_locale/*
c23 See doxygroups.cc and Note B. Notes on what invalidates c23 See doxygroups.cc and Note B. Notes on what invalidates
iterators need to be added. iterators need to be added.
......
...@@ -248,6 +248,8 @@ namespace std ...@@ -248,6 +248,8 @@ namespace std
// Data Members (public): // Data Members (public):
// NB: This is an unsigned type, and thus represents the maximum // NB: This is an unsigned type, and thus represents the maximum
// size that the allocator can hold. // size that the allocator can hold.
/// @var
/// Value returned by various member functions when they fail.
static const size_type npos = static_cast<size_type>(-1); static const size_type npos = static_cast<size_type>(-1);
private: private:
...@@ -339,41 +341,109 @@ namespace std ...@@ -339,41 +341,109 @@ namespace std
// NB: We overload ctors in some cases instead of using default // NB: We overload ctors in some cases instead of using default
// arguments, per 17.4.4.4 para. 2 item 2. // arguments, per 17.4.4.4 para. 2 item 2.
/**
* @brief Default constructor creates an empty string.
*/
inline inline
basic_string(); basic_string();
/**
* @brief Construct an empty string using allocator a.
*/
explicit explicit
basic_string(const _Alloc& __a); basic_string(const _Alloc& __a);
// NB: per LWG issue 42, semantics different from IS: // NB: per LWG issue 42, semantics different from IS:
/**
* @brief Construct string with copy of value of @a str.
* @param str Source string.
*/
basic_string(const basic_string& __str); basic_string(const basic_string& __str);
/**
* @brief Construct string as copy of a substring.
* @param str Source string.
* @param pos Index of first character to copy from.
* @param n Number of characters to copy (default remainder).
*/
basic_string(const basic_string& __str, size_type __pos, basic_string(const basic_string& __str, size_type __pos,
size_type __n = npos); size_type __n = npos);
/**
* @brief Construct string as copy of a substring.
* @param str Source string.
* @param pos Index of first character to copy from.
* @param n Number of characters to copy.
* @param a Allocator to use.
*/
basic_string(const basic_string& __str, size_type __pos, basic_string(const basic_string& __str, size_type __pos,
size_type __n, const _Alloc& __a); size_type __n, const _Alloc& __a);
/**
* @brief Construct string as copy of a C substring.
* @param s Source C string.
* @param n Number of characters to copy.
* @param a Allocator to use (default is default allocator).
*/
basic_string(const _CharT* __s, size_type __n, basic_string(const _CharT* __s, size_type __n,
const _Alloc& __a = _Alloc()); const _Alloc& __a = _Alloc());
/**
* @brief Construct string as copy of a C string.
* @param s Source C string.
* @param a Allocator to use (default is default allocator).
*/
basic_string(const _CharT* __s, const _Alloc& __a = _Alloc()); basic_string(const _CharT* __s, const _Alloc& __a = _Alloc());
/**
* @brief Construct string as multiple characters.
* @param n Number of characters.
* @param c Character to use.
* @param a Allocator to use (default is default allocator).
*/
basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc()); basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc());
/**
* @brief Construct string as copy of a range.
* @param beg Start of range.
* @param end End of range.
* @param a Allocator to use (default is default allocator).
*/
template<class _InputIterator> template<class _InputIterator>
basic_string(_InputIterator __beg, _InputIterator __end, basic_string(_InputIterator __beg, _InputIterator __end,
const _Alloc& __a = _Alloc()); const _Alloc& __a = _Alloc());
/**
* @brief Destroy the string instance.
*/
~basic_string() ~basic_string()
{ _M_rep()->_M_dispose(this->get_allocator()); } { _M_rep()->_M_dispose(this->get_allocator()); }
/**
* @brief Assign the value of @a str to this string.
* @param str Source string.
*/
basic_string& basic_string&
operator=(const basic_string& __str) { return this->assign(__str); } operator=(const basic_string& __str) { return this->assign(__str); }
/**
* @brief Copy contents of @a s into this string.
* @param s Source null-terminated string.
*/
basic_string& basic_string&
operator=(const _CharT* __s) { return this->assign(__s); } operator=(const _CharT* __s) { return this->assign(__s); }
/**
* @brief Set value to string of length 1.
* @param c Source character.
*
* Assigning to a character makes this string length 1 and
* (*this)[0] == @a c.
*/
basic_string& basic_string&
operator=(_CharT __c) { return this->assign(1, __c); } operator=(_CharT __c) { return this->assign(1, __c); }
// Iterators: // Iterators:
/**
* Returns a read/write iterator that points to the first character in
* the %string. Unshares the string.
*/
iterator iterator
begin() begin()
{ {
...@@ -381,10 +451,18 @@ namespace std ...@@ -381,10 +451,18 @@ namespace std
return iterator(_M_data()); return iterator(_M_data());
} }
/**
* Returns a read-only (constant) iterator that points to the first
* character in the %string.
*/
const_iterator const_iterator
begin() const begin() const
{ return const_iterator(_M_data()); } { return const_iterator(_M_data()); }
/**
* Returns a read/write iterator that points one past the last
* character in the %string. Unshares the string.
*/
iterator iterator
end() end()
{ {
...@@ -392,60 +470,156 @@ namespace std ...@@ -392,60 +470,156 @@ namespace std
return iterator(_M_data() + this->size()); return iterator(_M_data() + this->size());
} }
/**
* Returns a read-only (constant) iterator that points one past the
* last character in the %string.
*/
const_iterator const_iterator
end() const end() const
{ return const_iterator(_M_data() + this->size()); } { return const_iterator(_M_data() + this->size()); }
/**
* Returns a read/write reverse iterator that points to the last
* character in the %string. Iteration is done in reverse element
* order. Unshares the string.
*/
reverse_iterator reverse_iterator
rbegin() rbegin()
{ return reverse_iterator(this->end()); } { return reverse_iterator(this->end()); }
/**
* Returns a read-only (constant) reverse iterator that points
* to the last character in the %string. Iteration is done in
* reverse element order.
*/
const_reverse_iterator const_reverse_iterator
rbegin() const rbegin() const
{ return const_reverse_iterator(this->end()); } { return const_reverse_iterator(this->end()); }
/**
* Returns a read/write reverse iterator that points to one before the
* first character in the %string. Iteration is done in reverse
* element order. Unshares the string.
*/
reverse_iterator reverse_iterator
rend() rend()
{ return reverse_iterator(this->begin()); } { return reverse_iterator(this->begin()); }
/**
* Returns a read-only (constant) reverse iterator that points
* to one before the first character in the %string. Iteration
* is done in reverse element order.
*/
const_reverse_iterator const_reverse_iterator
rend() const rend() const
{ return const_reverse_iterator(this->begin()); } { return const_reverse_iterator(this->begin()); }
public: public:
// Capacity: // Capacity:
/// Returns the number of characters in the string, not including any
/// null-termination.
size_type size_type
size() const { return _M_rep()->_M_length; } size() const { return _M_rep()->_M_length; }
/// Returns the number of characters in the string, not including any
/// null-termination.
size_type size_type
length() const { return _M_rep()->_M_length; } length() const { return _M_rep()->_M_length; }
/// Returns the size() of the largest possible %string.
size_type size_type
max_size() const { return _Rep::_S_max_size; } max_size() const { return _Rep::_S_max_size; }
/**
* @brief Resizes the %string to the specified number of characters.
* @param n Number of characters the %string should contain.
* @param c Character to fill any new elements.
*
* This function will %resize the %string to the specified
* number of characters. If the number is smaller than the
* %string's current size the %string is truncated, otherwise
* the %string is extended and new elements are set to @a c.
*/
void void
resize(size_type __n, _CharT __c); resize(size_type __n, _CharT __c);
/**
* @brief Resizes the %string to the specified number of characters.
* @param n Number of characters the %string should contain.
*
* This function will resize the %string to the specified length. If
* the new size is smaller than the %string's current size the %string
* is truncated, otherwise the %string is extended and new characters
* are default-constructed. For basic types such as char, this means
* setting them to 0.
*/
void void
resize(size_type __n) { this->resize(__n, _CharT()); } resize(size_type __n) { this->resize(__n, _CharT()); }
/**
* Returns the total number of characters that the %string can hold
* before needing to allocate more memory.
*/
size_type size_type
capacity() const { return _M_rep()->_M_capacity; } capacity() const { return _M_rep()->_M_capacity; }
/**
* @brief Attempt to preallocate enough memory for specified number of
* characters.
* @param n Number of characters required.
* @throw std::length_error If @a n exceeds @c max_size().
*
* This function attempts to reserve enough memory for the
* %string to hold the specified number of characters. If the
* number requested is more than max_size(), length_error is
* thrown.
*
* The advantage of this function is that if optimal code is a
* necessity and the user can determine the string length that will be
* required, the user can reserve the memory in %advance, and thus
* prevent a possible reallocation of memory and copying of %string
* data.
*/
void void
reserve(size_type __res_arg = 0); reserve(size_type __res_arg = 0);
/**
* Erases the string, making it empty.
*/
void void
clear() { _M_mutate(0, this->size(), 0); } clear() { _M_mutate(0, this->size(), 0); }
/**
* Returns true if the %string is empty. Equivalent to *this == "".
*/
bool bool
empty() const { return this->size() == 0; } empty() const { return this->size() == 0; }
// Element access: // Element access:
/**
* @brief Subscript access to the data contained in the %string.
* @param n The index of the character to access.
* @return Read-only (constant) reference to the character.
*
* This operator allows for easy, array-style, data access.
* Note that data access with this operator is unchecked and
* out_of_range lookups are not defined. (For checked lookups
* see at().)
*/
const_reference const_reference
operator[] (size_type __pos) const operator[] (size_type __pos) const
{ return _M_data()[__pos]; } { return _M_data()[__pos]; }
/**
* @brief Subscript access to the data contained in the %string.
* @param n The index of the character to access.
* @return Read/write reference to the character.
*
* This operator allows for easy, array-style, data access.
* Note that data access with this operator is unchecked and
* out_of_range lookups are not defined. (For checked lookups
* see at().) Unshares the string.
*/
reference reference
operator[](size_type __pos) operator[](size_type __pos)
{ {
...@@ -453,6 +627,16 @@ namespace std ...@@ -453,6 +627,16 @@ namespace std
return _M_data()[__pos]; return _M_data()[__pos];
} }
/**
* @brief Provides access to the data contained in the %string.
* @param n The index of the character to access.
* @return Read-only (const) reference to the character.
* @throw std::out_of_range If @a n is an invalid index.
*
* This function provides for safer data access. The parameter is
* first checked that it is in the range of the string. The function
* throws out_of_range if the check fails.
*/
const_reference const_reference
at(size_type __n) const at(size_type __n) const
{ {
...@@ -461,6 +645,17 @@ namespace std ...@@ -461,6 +645,17 @@ namespace std
return _M_data()[__n]; return _M_data()[__n];
} }
/**
* @brief Provides access to the data contained in the %string.
* @param n The index of the character to access.
* @return Read/write reference to the character.
* @throw std::out_of_range If @a n is an invalid index.
*
* This function provides for safer data access. The parameter is
* first checked that it is in the range of the string. The function
* throws out_of_range if the check fails. Success results in
* unsharing the string.
*/
reference reference
at(size_type __n) at(size_type __n)
{ {
...@@ -471,85 +666,300 @@ namespace std ...@@ -471,85 +666,300 @@ namespace std
} }
// Modifiers: // Modifiers:
/**
* @brief Append a string to this string.
* @param str The string to append.
* @return Reference to this string.
*/
basic_string& basic_string&
operator+=(const basic_string& __str) { return this->append(__str); } operator+=(const basic_string& __str) { return this->append(__str); }
/**
* @brief Append a C string.
* @param s The C string to append.
* @return Reference to this string.
*/
basic_string& basic_string&
operator+=(const _CharT* __s) { return this->append(__s); } operator+=(const _CharT* __s) { return this->append(__s); }
/**
* @brief Append a character.
* @param s The character to append.
* @return Reference to this string.
*/
basic_string& basic_string&
operator+=(_CharT __c) { return this->append(size_type(1), __c); } operator+=(_CharT __c) { return this->append(size_type(1), __c); }
/**
* @brief Append a string to this string.
* @param str The string to append.
* @return Reference to this string.
*/
basic_string& basic_string&
append(const basic_string& __str); append(const basic_string& __str);
/**
* @brief Append a substring.
* @param str The string to append.
* @param pos Index of the first character of str to append.
* @param n The number of characters to append.
* @return Reference to this string.
* @throw std::out_of_range if @a pos is not a valid index.
*
* This function appends @a n characters from @a str starting at @a pos
* to this string. If @a n is is larger than the number of available
* characters in @a str, the remainder of @a str is appended.
*/
basic_string& basic_string&
append(const basic_string& __str, size_type __pos, size_type __n); append(const basic_string& __str, size_type __pos, size_type __n);
/**
* @brief Append a C substring.
* @param s The C string to append.
* @param n The number of characters to append.
* @return Reference to this string.
*/
basic_string& basic_string&
append(const _CharT* __s, size_type __n); append(const _CharT* __s, size_type __n);
/**
* @brief Append a C string.
* @param s The C string to append.
* @return Reference to this string.
*/
basic_string& basic_string&
append(const _CharT* __s) append(const _CharT* __s)
{ return this->append(__s, traits_type::length(__s)); } { return this->append(__s, traits_type::length(__s)); }
/**
* @brief Append multiple characters.
* @param n The number of characters to append.
* @param c The character to use.
* @return Reference to this string.
*
* Appends n copies of c to this string.
*/
basic_string& basic_string&
append(size_type __n, _CharT __c); append(size_type __n, _CharT __c);
/**
* @brief Append a range of characters.
* @param first Iterator referencing the first character to append.
* @param last Iterator marking the end of the range.
* @return Reference to this string.
*
* Appends characters in the range [first,last) to this string.
*/
template<class _InputIterator> template<class _InputIterator>
basic_string& basic_string&
append(_InputIterator __first, _InputIterator __last) append(_InputIterator __first, _InputIterator __last)
{ return this->replace(_M_iend(), _M_iend(), __first, __last); } { return this->replace(_M_iend(), _M_iend(), __first, __last); }
/**
* @brief Append a single character.
* @param c Character to append.
*/
void void
push_back(_CharT __c) push_back(_CharT __c)
{ this->replace(_M_iend(), _M_iend(), 1, __c); } { this->replace(_M_iend(), _M_iend(), 1, __c); }
/**
* @brief Set value to contents of another string.
* @param str Source string to use.
* @return Reference to this string.
*/
basic_string& basic_string&
assign(const basic_string& __str); assign(const basic_string& __str);
/**
* @brief Set value to a substring of a string.
* @param str The string to use.
* @param pos Index of the first character of str.
* @param n Number of characters to use.
* @return Reference to this string.
* @throw std::out_of_range if @a pos is not a valid index.
*
* This function sets this string to the substring of @a str consisting
* of @a n characters at @a pos. If @a n is is larger than the number
* of available characters in @a str, the remainder of @a str is used.
*/
basic_string& basic_string&
assign(const basic_string& __str, size_type __pos, size_type __n); assign(const basic_string& __str, size_type __pos, size_type __n);
/**
* @brief Set value to a C substring.
* @param s The C string to use.
* @param n Number of characters to use.
* @return Reference to this string.
*
* This function sets the value of this string to the first @a n
* characters of @a s. If @a n is is larger than the number of
* available characters in @a s, the remainder of @a s is used.
*/
basic_string& basic_string&
assign(const _CharT* __s, size_type __n); assign(const _CharT* __s, size_type __n);
/**
* @brief Set value to contents of a C string.
* @param s The C string to use.
* @return Reference to this string.
*
* This function sets the value of this string to the value of @a s.
* The data is copied, so there is no dependence on @a s once the
* function returns.
*/
basic_string& basic_string&
assign(const _CharT* __s) assign(const _CharT* __s)
{ return this->assign(__s, traits_type::length(__s)); } { return this->assign(__s, traits_type::length(__s)); }
/**
* @brief Set value to multiple characters.
* @param n Length of the resulting string.
* @param c The character to use.
* @return Reference to this string.
*
* This function sets the value of this string to @a n copies of
* character @a c.
*/
basic_string& basic_string&
assign(size_type __n, _CharT __c) assign(size_type __n, _CharT __c)
{ return this->replace(_M_ibegin(), _M_iend(), __n, __c); } { return this->replace(_M_ibegin(), _M_iend(), __n, __c); }
/**
* @brief Set value to a range of characters.
* @param first Iterator referencing the first character to append.
* @param last Iterator marking the end of the range.
* @return Reference to this string.
*
* Sets value of string to characters in the range [first,last).
*/
template<class _InputIterator> template<class _InputIterator>
basic_string& basic_string&
assign(_InputIterator __first, _InputIterator __last) assign(_InputIterator __first, _InputIterator __last)
{ return this->replace(_M_ibegin(), _M_iend(), __first, __last); } { return this->replace(_M_ibegin(), _M_iend(), __first, __last); }
/**
* @brief Insert multiple characters.
* @param p Iterator referencing location in string to insert at.
* @param n Number of characters to insert
* @param c The character to insert.
* @throw std::length_error If new length exceeds @c max_size().
*
* Inserts @a n copies of character @a c starting at the position
* referenced by iterator @a p. If adding characters causes the length
* to exceed max_size(), length_error is thrown. The value of the
* string doesn't change if an error is thrown.
*/
void void
insert(iterator __p, size_type __n, _CharT __c) insert(iterator __p, size_type __n, _CharT __c)
{ this->replace(__p, __p, __n, __c); } { this->replace(__p, __p, __n, __c); }
/**
* @brief Insert a range of characters.
* @param p Iterator referencing location in string to insert at.
* @param beg Start of range.
* @param end End of range.
* @throw std::length_error If new length exceeds @c max_size().
*
* Inserts characters in range [beg,end). If adding characters causes
* the length to exceed max_size(), length_error is thrown. The value
* of the string doesn't change if an error is thrown.
*/
template<class _InputIterator> template<class _InputIterator>
void insert(iterator __p, _InputIterator __beg, _InputIterator __end) void insert(iterator __p, _InputIterator __beg, _InputIterator __end)
{ this->replace(__p, __p, __beg, __end); } { this->replace(__p, __p, __beg, __end); }
/**
* @brief Insert value of a string.
* @param pos1 Iterator referencing location in string to insert at.
* @param str The string to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Inserts value of @a str starting at @a pos1. If adding characters
* causes the length to exceed max_size(), length_error is thrown. The
* value of the string doesn't change if an error is thrown.
*/
basic_string& basic_string&
insert(size_type __pos1, const basic_string& __str) insert(size_type __pos1, const basic_string& __str)
{ return this->insert(__pos1, __str, 0, __str.size()); } { return this->insert(__pos1, __str, 0, __str.size()); }
/**
* @brief Insert a substring.
* @param pos1 Iterator referencing location in string to insert at.
* @param str The string to insert.
* @param pos2 Start of characters in str to insert.
* @param n Number of characters to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
* @throw std::out_of_range If @a pos1 > size() or
* @a pos2 > @a str.size().
*
* Starting at @a pos1, insert @a n character of @a str beginning with
* @a pos2. If adding characters causes the length to exceed
* max_size(), length_error is thrown. If @a pos1 is beyond the end of
* this string or @a pos2 is beyond the end of @a str, out_of_range is
* thrown. The value of the string doesn't change if an error is
* thrown.
*/
basic_string& basic_string&
insert(size_type __pos1, const basic_string& __str, insert(size_type __pos1, const basic_string& __str,
size_type __pos2, size_type __n); size_type __pos2, size_type __n);
/**
* @brief Insert a C substring.
* @param pos Iterator referencing location in string to insert at.
* @param s The C string to insert.
* @param n The number of characters to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
* @throw std::out_of_range If @a pos is beyond the end of this
* string.
*
* Inserts the first @a n characters of @a s starting at @a pos. If
* adding characters causes the length to exceed max_size(),
* length_error is thrown. If @a pos is beyond end(), out_of_range is
* thrown. The value of the string doesn't change if an error is
* thrown.
*/
basic_string& basic_string&
insert(size_type __pos, const _CharT* __s, size_type __n); insert(size_type __pos, const _CharT* __s, size_type __n);
/**
* @brief Insert a C string.
* @param pos Iterator referencing location in string to insert at.
* @param s The C string to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
* @throw std::out_of_range If @a pos is beyond the end of this
* string.
*
* Inserts the first @a n characters of @a s starting at @a pos. If
* adding characters causes the length to exceed max_size(),
* length_error is thrown. If @a pos is beyond end(), out_of_range is
* thrown. The value of the string doesn't change if an error is
* thrown.
*/
basic_string& basic_string&
insert(size_type __pos, const _CharT* __s) insert(size_type __pos, const _CharT* __s)
{ return this->insert(__pos, __s, traits_type::length(__s)); } { return this->insert(__pos, __s, traits_type::length(__s)); }
/**
* @brief Insert multiple characters.
* @param pos Index in string to insert at.
* @param n Number of characters to insert
* @param c The character to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
* @throw std::out_of_range If @a pos is beyond the end of this
* string.
*
* Inserts @a n copies of character @a c starting at index @a pos. If
* adding characters causes the length to exceed max_size(),
* length_error is thrown. If @a pos > length(), out_of_range is
* thrown. The value of the string doesn't change if an error is
* thrown.
*/
basic_string& basic_string&
insert(size_type __pos, size_type __n, _CharT __c) insert(size_type __pos, size_type __n, _CharT __c)
{ {
...@@ -557,6 +967,19 @@ namespace std ...@@ -557,6 +967,19 @@ namespace std
return *this; return *this;
} }
/**
* @brief Insert one character.
* @param p Iterator referencing position in string to insert at.
* @param c The character to insert.
* @return Iterator referencing newly inserted char.
* @throw std::length_error If new length exceeds @c max_size().
* @throw std::out_of_range If @a p is beyond the end of this string.
*
* Inserts character @a c at position referenced by @a p. If adding
* character causes the length to exceed max_size(), length_error is
* thrown. If @a p is beyond end of string, out_of_range is thrown.
* The value of the string doesn't change if an error is thrown.
*/
iterator iterator
insert(iterator __p, _CharT __c = _CharT()) insert(iterator __p, _CharT __c = _CharT())
{ {
...@@ -566,6 +989,20 @@ namespace std ...@@ -566,6 +989,20 @@ namespace std
return this->_M_ibegin() + __pos; return this->_M_ibegin() + __pos;
} }
/**
* @brief Remove characters.
* @param pos Index of first character to remove (default 0).
* @param n Number of characters to remove (default remainder).
* @return Reference to this string.
* @throw std::out_of_range If @a pos is beyond the end of this
* string.
*
* Removes @a n characters from this string starting at @a pos. The
* length of the string is reduced by @a n. If there are < @a n
* characters to remove, the remainder of the string is truncated. If
* @a p is beyond end of string, out_of_range is thrown. The value of
* the string doesn't change if an error is thrown.
*/
basic_string& basic_string&
erase(size_type __pos = 0, size_type __n = npos) erase(size_type __pos = 0, size_type __n = npos)
{ {
...@@ -573,6 +1010,17 @@ namespace std ...@@ -573,6 +1010,17 @@ namespace std
_M_data(), _M_data()); _M_data(), _M_data());
} }
/**
* @brief Remove one character.
* @param position Iterator referencing the character to remove.
* @return iterator referencing same location after removal.
* @throw std::out_of_range If @a position is beyond the end of this
* string.
*
* Removes the character at @a position from this string. If @a
* position is beyond end of string, out_of_range is thrown. The value
* of the string doesn't change if an error is thrown.
*/
iterator iterator
erase(iterator __position) erase(iterator __position)
{ {
...@@ -582,6 +1030,18 @@ namespace std ...@@ -582,6 +1030,18 @@ namespace std
return _M_ibegin() + __i; return _M_ibegin() + __i;
} }
/**
* @brief Remove a range of characters.
* @param first Iterator referencing the first character to remove.
* @param last Iterator referencing the end of the range.
* @return Iterator referencing location of first after removal.
* @throw std::out_of_range If @a first is beyond the end of this
* string.
*
* Removes the characters in the range [first,last) from this string.
* If @a first is beyond end of string, out_of_range is thrown. The
* value of the string doesn't change if an error is thrown.
*/
iterator iterator
erase(iterator __first, iterator __last) erase(iterator __first, iterator __last)
{ {
...@@ -591,43 +1051,193 @@ namespace std ...@@ -591,43 +1051,193 @@ namespace std
return _M_ibegin() + __i; return _M_ibegin() + __i;
} }
/**
* @brief Replace characters with value from another string.
* @param pos Index of first character to replace.
* @param n Number of characters to be replaced.
* @param str String to insert.
* @return Reference to this string.
* @throw std::out_of_range If @a pos is beyond the end of this
* string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [pos,pos+n) from this string.
* In place, the value of @a str is inserted. If @a pos is beyond end
* of string, out_of_range is thrown. If the length of the result
* exceeds max_size(), length_error is thrown. The value of the string
* doesn't change if an error is thrown.
*/
basic_string& basic_string&
replace(size_type __pos, size_type __n, const basic_string& __str) replace(size_type __pos, size_type __n, const basic_string& __str)
{ return this->replace(__pos, __n, __str._M_data(), __str.size()); } { return this->replace(__pos, __n, __str._M_data(), __str.size()); }
/**
* @brief Replace characters with value from another string.
* @param pos1 Index of first character to replace.
* @param n1 Number of characters to be replaced.
* @param str String to insert.
* @param pos2 Index of first character of str to use.
* @param n2 Number of characters from str to use.
* @return Reference to this string.
* @throw std::out_of_range If @a pos1 > size() or @a pos2 >
* str.size().
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [pos1,pos1 + n) from this
* string. In place, the value of @a str is inserted. If @a pos is
* beyond end of string, out_of_range is thrown. If the length of the
* result exceeds max_size(), length_error is thrown. The value of the
* string doesn't change if an error is thrown.
*/
basic_string& basic_string&
replace(size_type __pos1, size_type __n1, const basic_string& __str, replace(size_type __pos1, size_type __n1, const basic_string& __str,
size_type __pos2, size_type __n2); size_type __pos2, size_type __n2);
/**
* @brief Replace characters with value of a C substring.
* @param pos Index of first character to replace.
* @param n1 Number of characters to be replaced.
* @param str C string to insert.
* @param n2 Number of characters from str to use.
* @return Reference to this string.
* @throw std::out_of_range If @a pos1 > size().
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [pos,pos + n1) from this string.
* In place, the first @a n2 characters of @a str are inserted, or all
* of @a str if @a n2 is too large. If @a pos is beyond end of string,
* out_of_range is thrown. If the length of result exceeds max_size(),
* length_error is thrown. The value of the string doesn't change if
* an error is thrown.
*/
basic_string& basic_string&
replace(size_type __pos, size_type __n1, const _CharT* __s, replace(size_type __pos, size_type __n1, const _CharT* __s,
size_type __n2); size_type __n2);
/**
* @brief Replace characters with value of a C string.
* @param pos Index of first character to replace.
* @param n1 Number of characters to be replaced.
* @param str C string to insert.
* @return Reference to this string.
* @throw std::out_of_range If @a pos > size().
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [pos,pos + n1) from this string.
* In place, the first @a n characters of @a str are inserted. If @a
* pos is beyond end of string, out_of_range is thrown. If the length
* of result exceeds max_size(), length_error is thrown. The value of
* the string doesn't change if an error is thrown.
*/
basic_string& basic_string&
replace(size_type __pos, size_type __n1, const _CharT* __s) replace(size_type __pos, size_type __n1, const _CharT* __s)
{ return this->replace(__pos, __n1, __s, traits_type::length(__s)); } { return this->replace(__pos, __n1, __s, traits_type::length(__s)); }
/**
* @brief Replace characters with multiple characters.
* @param pos Index of first character to replace.
* @param n1 Number of characters to be replaced.
* @param n2 Number of characters to insert.
* @param c Character to insert.
* @return Reference to this string.
* @throw std::out_of_range If @a pos > size().
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [pos,pos + n1) from this string.
* In place, @a n2 copies of @a c are inserted. If @a pos is beyond
* end of string, out_of_range is thrown. If the length of result
* exceeds max_size(), length_error is thrown. The value of the string
* doesn't change if an error is thrown.
*/
basic_string& basic_string&
replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c) replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
{ return this->replace(_M_check(__pos), _M_fold(__pos, __n1), __n2, __c); } { return this->replace(_M_check(__pos), _M_fold(__pos, __n1), __n2, __c); }
/**
* @brief Replace range of characters with string.
* @param i1 Iterator referencing start of range to replace.
* @param i2 Iterator referencing end of range to replace.
* @param str String value to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [i1,i2). In place, the value of
* @a str is inserted. If the length of result exceeds max_size(),
* length_error is thrown. The value of the string doesn't change if
* an error is thrown.
*/
basic_string& basic_string&
replace(iterator __i1, iterator __i2, const basic_string& __str) replace(iterator __i1, iterator __i2, const basic_string& __str)
{ return this->replace(__i1, __i2, __str._M_data(), __str.size()); } { return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
/**
* @brief Replace range of characters with C substring.
* @param i1 Iterator referencing start of range to replace.
* @param i2 Iterator referencing end of range to replace.
* @param s C string value to insert.
* @param n Number of characters from s to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [i1,i2). In place, the first @a
* n characters of @a s are inserted. If the length of result exceeds
* max_size(), length_error is thrown. The value of the string doesn't
* change if an error is thrown.
*/
basic_string& basic_string&
replace(iterator __i1, iterator __i2, replace(iterator __i1, iterator __i2,
const _CharT* __s, size_type __n) const _CharT* __s, size_type __n)
{ return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n); } { return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n); }
/**
* @brief Replace range of characters with C string.
* @param i1 Iterator referencing start of range to replace.
* @param i2 Iterator referencing end of range to replace.
* @param s C string value to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [i1,i2). In place, the
* characters of @a s are inserted. If the length of result exceeds
* max_size(), length_error is thrown. The value of the string doesn't
* change if an error is thrown.
*/
basic_string& basic_string&
replace(iterator __i1, iterator __i2, const _CharT* __s) replace(iterator __i1, iterator __i2, const _CharT* __s)
{ return this->replace(__i1, __i2, __s, traits_type::length(__s)); } { return this->replace(__i1, __i2, __s, traits_type::length(__s)); }
/**
* @brief Replace range of characters with multiple characters
* @param i1 Iterator referencing start of range to replace.
* @param i2 Iterator referencing end of range to replace.
* @param n Number of characters to insert.
* @param c Character to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [i1,i2). In place, @a n copies
* of @a c are inserted. If the length of result exceeds max_size(),
* length_error is thrown. The value of the string doesn't change if
* an error is thrown.
*/
basic_string& basic_string&
replace(iterator __i1, iterator __i2, size_type __n, _CharT __c) replace(iterator __i1, iterator __i2, size_type __n, _CharT __c)
{ return _M_replace_aux(__i1, __i2, __n, __c); } { return _M_replace_aux(__i1, __i2, __n, __c); }
/**
* @brief Replace range of characters with range.
* @param i1 Iterator referencing start of range to replace.
* @param i2 Iterator referencing end of range to replace.
* @param k1 Iterator referencing start of range to insert.
* @param k2 Iterator referencing end of range to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [i1,i2). In place, characters
* in the range [k1,k2) are inserted. If the length of result exceeds
* max_size(), length_error is thrown. The value of the string doesn't
* change if an error is thrown.
*/
template<class _InputIterator> template<class _InputIterator>
basic_string& basic_string&
replace(iterator __i1, iterator __i2, replace(iterator __i1, iterator __i2,
...@@ -735,13 +1345,37 @@ namespace std ...@@ -735,13 +1345,37 @@ namespace std
public: public:
/**
* @brief Copy substring into C string.
* @param s C string to copy value into.
* @param n Number of characters to copy.
* @param pos Index of first character to copy.
* @return Number of characters actually copied
* @throw std::out_of_range If pos > size().
*
* Copies up to @a n characters starting at @a pos into the C string @a
* s. If @a pos is greater than size(), out_of_range is thrown.
*/
size_type size_type
copy(_CharT* __s, size_type __n, size_type __pos = 0) const; copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
/**
* @brief Swap contents with another string.
* @param s String to swap with.
*
* Exchanges the contents of this string with that of @a s in constant
* time.
*/
void void
swap(basic_string& __s); swap(basic_string& __s);
// String operations: // String operations:
/**
* @brief Return const pointer to null-terminated contents.
*
* This is a handle to internal data. Do not modify or dire things may
* happen.
*/
const _CharT* const _CharT*
c_str() const c_str() const
{ {
...@@ -751,99 +1385,371 @@ namespace std ...@@ -751,99 +1385,371 @@ namespace std
return _M_data(); return _M_data();
} }
/**
* @brief Return const pointer to contents.
*
* This is a handle to internal data. It may not be null-terminated.
* Do not modify or dire things may happen.
*/
const _CharT* const _CharT*
data() const { return _M_data(); } data() const { return _M_data(); }
/**
* @brief Return copy of allocator used to construct this string.
*/
allocator_type allocator_type
get_allocator() const { return _M_dataplus; } get_allocator() const { return _M_dataplus; }
/**
* @brief Find position of a C substring.
* @param s C string to locate.
* @param pos Index of character to search from.
* @param n Number of characters from @a s to search for.
* @return Index of start of first occurrence.
*
* Starting from @a pos, searches forward for the first @a n characters
* in @a s within this string. If found, returns the index where it
* begins. If not found, returns npos.
*/
size_type size_type
find(const _CharT* __s, size_type __pos, size_type __n) const; find(const _CharT* __s, size_type __pos, size_type __n) const;
/**
* @brief Find position of a string.
* @param str String to locate.
* @param pos Index of character to search from (default 0).
* @return Index of start of first occurrence.
*
* Starting from @a pos, searches forward for value of @a str within
* this string. If found, returns the index where it begins. If not
* found, returns npos.
*/
size_type size_type
find(const basic_string& __str, size_type __pos = 0) const find(const basic_string& __str, size_type __pos = 0) const
{ return this->find(__str.data(), __pos, __str.size()); } { return this->find(__str.data(), __pos, __str.size()); }
/**
* @brief Find position of a C string.
* @param s C string to locate.
* @param pos Index of character to search from (default 0).
* @return Index of start of first occurrence.
*
* Starting from @a pos, searches forward for the value of @a s within
* this string. If found, returns the index where it begins. If not
* found, returns npos.
*/
size_type size_type
find(const _CharT* __s, size_type __pos = 0) const find(const _CharT* __s, size_type __pos = 0) const
{ return this->find(__s, __pos, traits_type::length(__s)); } { return this->find(__s, __pos, traits_type::length(__s)); }
/**
* @brief Find position of a character.
* @param c Character to locate.
* @param pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a pos, searches forward for @a c within this string.
* If found, returns the index where it was found. If not found,
* returns npos.
*/
size_type size_type
find(_CharT __c, size_type __pos = 0) const; find(_CharT __c, size_type __pos = 0) const;
/**
* @brief Find last position of a string.
* @param str String to locate.
* @param pos Index of character to search back from (default end).
* @return Index of start of last occurrence.
*
* Starting from @a pos, searches backward for value of @a str within
* this string. If found, returns the index where it begins. If not
* found, returns npos.
*/
size_type size_type
rfind(const basic_string& __str, size_type __pos = npos) const rfind(const basic_string& __str, size_type __pos = npos) const
{ return this->rfind(__str.data(), __pos, __str.size()); } { return this->rfind(__str.data(), __pos, __str.size()); }
/**
* @brief Find last position of a C substring.
* @param s C string to locate.
* @param pos Index of character to search back from.
* @param n Number of characters from s to search for.
* @return Index of start of last occurrence.
*
* Starting from @a pos, searches backward for the first @a n
* characters in @a s within this string. If found, returns the index
* where it begins. If not found, returns npos.
*/
size_type size_type
rfind(const _CharT* __s, size_type __pos, size_type __n) const; rfind(const _CharT* __s, size_type __pos, size_type __n) const;
/**
* @brief Find last position of a C string.
* @param s C string to locate.
* @param pos Index of character to start search at (default 0).
* @return Index of start of last occurrence.
*
* Starting from @a pos, searches backward for the value of @a s within
* this string. If found, returns the index where it begins. If not
* found, returns npos.
*/
size_type size_type
rfind(const _CharT* __s, size_type __pos = npos) const rfind(const _CharT* __s, size_type __pos = npos) const
{ return this->rfind(__s, __pos, traits_type::length(__s)); } { return this->rfind(__s, __pos, traits_type::length(__s)); }
/**
* @brief Find last position of a character.
* @param c Character to locate.
* @param pos Index of character to search back from (default 0).
* @return Index of last occurrence.
*
* Starting from @a pos, searches backward for @a c within this string.
* If found, returns the index where it was found. If not found,
* returns npos.
*/
size_type size_type
rfind(_CharT __c, size_type __pos = npos) const; rfind(_CharT __c, size_type __pos = npos) const;
/**
* @brief Find position of a character of string.
* @param str String containing characters to locate.
* @param pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a pos, searches forward for one of the characters of
* @a str within this string. If found, returns the index where it was
* found. If not found, returns npos.
*/
size_type size_type
find_first_of(const basic_string& __str, size_type __pos = 0) const find_first_of(const basic_string& __str, size_type __pos = 0) const
{ return this->find_first_of(__str.data(), __pos, __str.size()); } { return this->find_first_of(__str.data(), __pos, __str.size()); }
/**
* @brief Find position of a character of C substring.
* @param s String containing characters to locate.
* @param pos Index of character to search from (default 0).
* @param n Number of characters from s to search for.
* @return Index of first occurrence.
*
* Starting from @a pos, searches forward for one of the first @a n
* characters of @a s within this string. If found, returns the index
* where it was found. If not found, returns npos.
*/
size_type size_type
find_first_of(const _CharT* __s, size_type __pos, size_type __n) const; find_first_of(const _CharT* __s, size_type __pos, size_type __n) const;
/**
* @brief Find position of a character of C string.
* @param s String containing characters to locate.
* @param pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a pos, searches forward for one of the characters of
* @a s within this string. If found, returns the index where it was
* found. If not found, returns npos.
*/
size_type size_type
find_first_of(const _CharT* __s, size_type __pos = 0) const find_first_of(const _CharT* __s, size_type __pos = 0) const
{ return this->find_first_of(__s, __pos, traits_type::length(__s)); } { return this->find_first_of(__s, __pos, traits_type::length(__s)); }
/**
* @brief Find position of a character.
* @param c Character to locate.
* @param pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a pos, searches forward for the character @a c within
* this string. If found, returns the index where it was found. If
* not found, returns npos.
*
* Note: equivalent to find(c, pos).
*/
size_type size_type
find_first_of(_CharT __c, size_type __pos = 0) const find_first_of(_CharT __c, size_type __pos = 0) const
{ return this->find(__c, __pos); } { return this->find(__c, __pos); }
/**
* @brief Find last position of a character of string.
* @param str String containing characters to locate.
* @param pos Index of character to search back from (default end).
* @return Index of last occurrence.
*
* Starting from @a pos, searches backward for one of the characters of
* @a str within this string. If found, returns the index where it was
* found. If not found, returns npos.
*/
size_type size_type
find_last_of(const basic_string& __str, size_type __pos = npos) const find_last_of(const basic_string& __str, size_type __pos = npos) const
{ return this->find_last_of(__str.data(), __pos, __str.size()); } { return this->find_last_of(__str.data(), __pos, __str.size()); }
/**
* @brief Find last position of a character of C substring.
* @param s C string containing characters to locate.
* @param pos Index of character to search back from (default end).
* @param n Number of characters from s to search for.
* @return Index of last occurrence.
*
* Starting from @a pos, searches backward for one of the first @a n
* characters of @a s within this string. If found, returns the index
* where it was found. If not found, returns npos.
*/
size_type size_type
find_last_of(const _CharT* __s, size_type __pos, size_type __n) const; find_last_of(const _CharT* __s, size_type __pos, size_type __n) const;
/**
* @brief Find last position of a character of C string.
* @param s C string containing characters to locate.
* @param pos Index of character to search back from (default end).
* @return Index of last occurrence.
*
* Starting from @a pos, searches backward for one of the characters of
* @a s within this string. If found, returns the index where it was
* found. If not found, returns npos.
*/
size_type size_type
find_last_of(const _CharT* __s, size_type __pos = npos) const find_last_of(const _CharT* __s, size_type __pos = npos) const
{ return this->find_last_of(__s, __pos, traits_type::length(__s)); } { return this->find_last_of(__s, __pos, traits_type::length(__s)); }
/**
* @brief Find last position of a character.
* @param c Character to locate.
* @param pos Index of character to search back from (default 0).
* @return Index of last occurrence.
*
* Starting from @a pos, searches backward for @a c within this string.
* If found, returns the index where it was found. If not found,
* returns npos.
*
* Note: equivalent to rfind(c, pos).
*/
size_type size_type
find_last_of(_CharT __c, size_type __pos = npos) const find_last_of(_CharT __c, size_type __pos = npos) const
{ return this->rfind(__c, __pos); } { return this->rfind(__c, __pos); }
/**
* @brief Find position of a character not in string.
* @param str String containing characters to avoid.
* @param pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a pos, searches forward for a character not contained
* in @a str within this string. If found, returns the index where it
* was found. If not found, returns npos.
*/
size_type size_type
find_first_not_of(const basic_string& __str, size_type __pos = 0) const find_first_not_of(const basic_string& __str, size_type __pos = 0) const
{ return this->find_first_not_of(__str.data(), __pos, __str.size()); } { return this->find_first_not_of(__str.data(), __pos, __str.size()); }
/**
* @brief Find position of a character not in C substring.
* @param s C string containing characters to avoid.
* @param pos Index of character to search from (default 0).
* @param n Number of characters from s to consider.
* @return Index of first occurrence.
*
* Starting from @a pos, searches forward for a character not contained
* in the first @a n characters of @a s within this string. If found,
* returns the index where it was found. If not found, returns npos.
*/
size_type size_type
find_first_not_of(const _CharT* __s, size_type __pos, find_first_not_of(const _CharT* __s, size_type __pos,
size_type __n) const; size_type __n) const;
/**
* @brief Find position of a character not in C string.
* @param s C string containing characters to avoid.
* @param pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a pos, searches forward for a character not contained
* in @a s within this string. If found, returns the index where it
* was found. If not found, returns npos.
*/
size_type size_type
find_first_not_of(const _CharT* __s, size_type __pos = 0) const find_first_not_of(const _CharT* __s, size_type __pos = 0) const
{ return this->find_first_not_of(__s, __pos, traits_type::length(__s)); } { return this->find_first_not_of(__s, __pos, traits_type::length(__s)); }
/**
* @brief Find position of a different character.
* @param c Character to avoid.
* @param pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a pos, searches forward for a character other than @a c
* within this string. If found, returns the index where it was found.
* If not found, returns npos.
*/
size_type size_type
find_first_not_of(_CharT __c, size_type __pos = 0) const; find_first_not_of(_CharT __c, size_type __pos = 0) const;
/**
* @brief Find last position of a character not in string.
* @param str String containing characters to avoid.
* @param pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a pos, searches backward for a character not
* contained in @a str within this string. If found, returns the index
* where it was found. If not found, returns npos.
*/
size_type size_type
find_last_not_of(const basic_string& __str, size_type __pos = npos) const find_last_not_of(const basic_string& __str, size_type __pos = npos) const
{ return this->find_last_not_of(__str.data(), __pos, __str.size()); } { return this->find_last_not_of(__str.data(), __pos, __str.size()); }
/**
* @brief Find last position of a character not in C substring.
* @param s C string containing characters to avoid.
* @param pos Index of character to search from (default 0).
* @param n Number of characters from s to consider.
* @return Index of first occurrence.
*
* Starting from @a pos, searches backward for a character not
* contained in the first @a n characters of @a s within this string.
* If found, returns the index where it was found. If not found,
* returns npos.
*/
size_type size_type
find_last_not_of(const _CharT* __s, size_type __pos, find_last_not_of(const _CharT* __s, size_type __pos,
size_type __n) const; size_type __n) const;
/**
* @brief Find position of a character not in C string.
* @param s C string containing characters to avoid.
* @param pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a pos, searches backward for a character not
* contained in @a s within this string. If found, returns the index
* where it was found. If not found, returns npos.
*/
size_type size_type
find_last_not_of(const _CharT* __s, size_type __pos = npos) const find_last_not_of(const _CharT* __s, size_type __pos = npos) const
{ return this->find_last_not_of(__s, __pos, traits_type::length(__s)); } { return this->find_last_not_of(__s, __pos, traits_type::length(__s)); }
/**
* @brief Find last position of a different character.
* @param c Character to avoid.
* @param pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a pos, searches backward for a character other than
* @a c within this string. If found, returns the index where it was
* found. If not found, returns npos.
*/
size_type size_type
find_last_not_of(_CharT __c, size_type __pos = npos) const; find_last_not_of(_CharT __c, size_type __pos = npos) const;
/**
* @brief Get a substring.
* @param pos Index of first character (default 0).
* @param n Number of characters in substring (default remainder).
* @return The new string.
* @throw std::out_of_range If pos > size().
*
* Construct and return a new string using the @a n characters starting
* at @a pos. If the string is too short, use the remainder of the
* characters. If @a pos is beyond the end of the string, out_of_range
* is thrown.
*/
basic_string basic_string
substr(size_type __pos = 0, size_type __n = npos) const substr(size_type __pos = 0, size_type __n = npos) const
{ {
...@@ -852,6 +1758,17 @@ namespace std ...@@ -852,6 +1758,17 @@ namespace std
return basic_string(*this, __pos, __n); return basic_string(*this, __pos, __n);
} }
/**
* @brief Compare to a string.
* @param str String to compare against.
* @return Integer < 0, 0, or > 0.
*
* Returns an integer < 0 if this string is ordered before @a str, 0 if
* their values are equivalent, or > 0 if this string is ordered after
* @a str. If the lengths of @a str and this string are different, the
* shorter one is ordered first. If they are the same, returns the
* result of traits::compare(data(),str.data(),size());
*/
int int
compare(const basic_string& __str) const compare(const basic_string& __str) const
{ {
...@@ -865,21 +1782,98 @@ namespace std ...@@ -865,21 +1782,98 @@ namespace std
return __r; return __r;
} }
/**
* @brief Compare substring to a string.
* @param pos Index of first character of substring.
* @param n Number of characters in substring.
* @param str String to compare against.
* @return Integer < 0, 0, or > 0.
*
* Form the substring of this string from the @a n characters starting
* at @a pos. Returns an integer < 0 if the substring is ordered
* before @a str, 0 if their values are equivalent, or > 0 if the
* substring is ordered after @a str. If the lengths @a of str and the
* substring are different, the shorter one is ordered first. If they
* are the same, returns the result of
* traits::compare(substring.data(),str.data(),size());
*/
int int
compare(size_type __pos, size_type __n, const basic_string& __str) const; compare(size_type __pos, size_type __n, const basic_string& __str) const;
/**
* @brief Compare substring to a substring.
* @param pos1 Index of first character of substring.
* @param n1 Number of characters in substring.
* @param str String to compare against.
* @param pos2 Index of first character of substring of str.
* @param n2 Number of characters in substring of str.
* @return Integer < 0, 0, or > 0.
*
* Form the substring of this string from the @a n1 characters starting
* at @a pos1. Form the substring of @a str from the @a n2 characters
* starting at @a pos2. Returns an integer < 0 if this substring is
* ordered before the substring of @a str, 0 if their values are
* equivalent, or > 0 if this substring is ordered after the substring
* of @a str. If the lengths of the substring of @a str and this
* substring are different, the shorter one is ordered first. If they
* are the same, returns the result of
* traits::compare(substring.data(),str.substr(pos2,n2).data(),size());
*/
int int
compare(size_type __pos1, size_type __n1, const basic_string& __str, compare(size_type __pos1, size_type __n1, const basic_string& __str,
size_type __pos2, size_type __n2) const; size_type __pos2, size_type __n2) const;
/**
* @brief Compare to a C string.
* @param s C string to compare against.
* @return Integer < 0, 0, or > 0.
*
* Returns an integer < 0 if this string is ordered before @a s, 0 if
* their values are equivalent, or > 0 if this string is ordered after
* @a s. If the lengths of @a s and this string are different, the
* shorter one is ordered first. If they are the same, returns the
* result of traits::compare(data(),s,size());
*/
int int
compare(const _CharT* __s) const; compare(const _CharT* __s) const;
// _GLIBCXX_RESOLVE_LIB_DEFECTS // _GLIBCXX_RESOLVE_LIB_DEFECTS
// 5 String::compare specification questionable // 5 String::compare specification questionable
/**
* @brief Compare substring to a C string.
* @param pos Index of first character of substring.
* @param n1 Number of characters in substring.
* @param s C string to compare against.
* @return Integer < 0, 0, or > 0.
*
* Form the substring of this string from the @a n1 characters starting
* at @a pos. Returns an integer < 0 if the substring is ordered
* before @a s, 0 if their values are equivalent, or > 0 if the
* substring is ordered after @a s. If the lengths of @a s and the
* substring are different, the shorter one is ordered first. If they
* are the same, returns the result of
* traits::compare(substring.data(),s,size());
*/
int int
compare(size_type __pos, size_type __n1, const _CharT* __s) const; compare(size_type __pos, size_type __n1, const _CharT* __s) const;
/**
* @brief Compare substring against a C substring.
* @param pos1 Index of first character of substring.
* @param n1 Number of characters in substring.
* @param s C string to compare against.
* @param n2 Number of characters in substring of s.
* @return Integer < 0, 0, or > 0.
*
* Form the substring of this string from the @a n1 characters starting
* at @a pos1. Form the substring of @a s from the first @a n
* characters of @a s. Returns an integer < 0 if this substring is
* ordered before the substring of @a s, 0 if their values are
* equivalent, or > 0 if this substring is ordered after the substring
* of @a s. If the lengths of this substring and @a n are different,
* the shorter one is ordered first. If they are the same, returns the
* result of traits::compare(substring.data(),s,size());
*/
int int
compare(size_type __pos, size_type __n1, const _CharT* __s, compare(size_type __pos, size_type __n1, const _CharT* __s,
size_type __n2) const; size_type __n2) const;
...@@ -892,6 +1886,12 @@ namespace std ...@@ -892,6 +1886,12 @@ namespace std
: _M_dataplus(_S_empty_rep()._M_refdata(), _Alloc()) { } : _M_dataplus(_S_empty_rep()._M_refdata(), _Alloc()) { }
// operator+ // operator+
/**
* @brief Concatenate two strings.
* @param lhs First string.
* @param rhs Last string.
* @return New string with value of @a lhs followed by @a rhs.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT, _Traits, _Alloc> basic_string<_CharT, _Traits, _Alloc>
operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
...@@ -902,15 +1902,33 @@ namespace std ...@@ -902,15 +1902,33 @@ namespace std
return __str; return __str;
} }
/**
* @brief Concatenate C string and string.
* @param lhs First string.
* @param rhs Last string.
* @return New string with value of @a lhs followed by @a rhs.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT,_Traits,_Alloc> basic_string<_CharT,_Traits,_Alloc>
operator+(const _CharT* __lhs, operator+(const _CharT* __lhs,
const basic_string<_CharT,_Traits,_Alloc>& __rhs); const basic_string<_CharT,_Traits,_Alloc>& __rhs);
/**
* @brief Concatenate character and string.
* @param lhs First string.
* @param rhs Last string.
* @return New string with @a lhs followed by @a rhs.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT,_Traits,_Alloc> basic_string<_CharT,_Traits,_Alloc>
operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Alloc>& __rhs); operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Alloc>& __rhs);
/**
* @brief Concatenate string and C string.
* @param lhs First string.
* @param rhs Last string.
* @return New string with @a lhs followed by @a rhs.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_string<_CharT, _Traits, _Alloc> inline basic_string<_CharT, _Traits, _Alloc>
operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
...@@ -921,6 +1939,12 @@ namespace std ...@@ -921,6 +1939,12 @@ namespace std
return __str; return __str;
} }
/**
* @brief Concatenate string and character.
* @param lhs First string.
* @param rhs Last string.
* @return New string with @a lhs followed by @a rhs.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_string<_CharT, _Traits, _Alloc> inline basic_string<_CharT, _Traits, _Alloc>
operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, _CharT __rhs) operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, _CharT __rhs)
...@@ -933,18 +1957,36 @@ namespace std ...@@ -933,18 +1957,36 @@ namespace std
} }
// operator == // operator ==
/**
* @brief Test equivalence of two strings.
* @param lhs First string.
* @param rhs Second string.
* @return True if @a lhs.compare(@a rhs) == 0. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline bool inline bool
operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs, operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs) const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{ return __lhs.compare(__rhs) == 0; } { return __lhs.compare(__rhs) == 0; }
/**
* @brief Test equivalence of C string and string.
* @param lhs C string.
* @param rhs String.
* @return True if @a rhs.compare(@a lhs) == 0. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline bool inline bool
operator==(const _CharT* __lhs, operator==(const _CharT* __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs) const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{ return __rhs.compare(__lhs) == 0; } { return __rhs.compare(__lhs) == 0; }
/**
* @brief Test equivalence of string and C string.
* @param lhs String.
* @param rhs C string.
* @return True if @a lhs.compare(@a rhs) == 0. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline bool inline bool
operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs, operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
...@@ -952,18 +1994,36 @@ namespace std ...@@ -952,18 +1994,36 @@ namespace std
{ return __lhs.compare(__rhs) == 0; } { return __lhs.compare(__rhs) == 0; }
// operator != // operator !=
/**
* @brief Test difference of two strings.
* @param lhs First string.
* @param rhs Second string.
* @return True if @a lhs.compare(@a rhs) != 0. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline bool inline bool
operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs, operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs) const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{ return __rhs.compare(__lhs) != 0; } { return __rhs.compare(__lhs) != 0; }
/**
* @brief Test difference of C string and string.
* @param lhs C string.
* @param rhs String.
* @return True if @a rhs.compare(@a lhs) != 0. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline bool inline bool
operator!=(const _CharT* __lhs, operator!=(const _CharT* __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs) const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{ return __rhs.compare(__lhs) != 0; } { return __rhs.compare(__lhs) != 0; }
/**
* @brief Test difference of string and C string.
* @param lhs String.
* @param rhs C string.
* @return True if @a lhs.compare(@a rhs) != 0. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline bool inline bool
operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs, operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
...@@ -971,18 +2031,36 @@ namespace std ...@@ -971,18 +2031,36 @@ namespace std
{ return __lhs.compare(__rhs) != 0; } { return __lhs.compare(__rhs) != 0; }
// operator < // operator <
/**
* @brief Test if string precedes string.
* @param lhs First string.
* @param rhs Second string.
* @return True if @a lhs precedes @a rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline bool inline bool
operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs, operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs) const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{ return __lhs.compare(__rhs) < 0; } { return __lhs.compare(__rhs) < 0; }
/**
* @brief Test if string precedes C string.
* @param lhs String.
* @param rhs C string.
* @return True if @a lhs precedes @a rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline bool inline bool
operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs, operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const _CharT* __rhs) const _CharT* __rhs)
{ return __lhs.compare(__rhs) < 0; } { return __lhs.compare(__rhs) < 0; }
/**
* @brief Test if C string precedes string.
* @param lhs C string.
* @param rhs String.
* @return True if @a lhs precedes @a rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline bool inline bool
operator<(const _CharT* __lhs, operator<(const _CharT* __lhs,
...@@ -990,18 +2068,36 @@ namespace std ...@@ -990,18 +2068,36 @@ namespace std
{ return __rhs.compare(__lhs) > 0; } { return __rhs.compare(__lhs) > 0; }
// operator > // operator >
/**
* @brief Test if string follows string.
* @param lhs First string.
* @param rhs Second string.
* @return True if @a lhs follows @a rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline bool inline bool
operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs, operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs) const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{ return __lhs.compare(__rhs) > 0; } { return __lhs.compare(__rhs) > 0; }
/**
* @brief Test if string follows C string.
* @param lhs String.
* @param rhs C string.
* @return True if @a lhs follows @a rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline bool inline bool
operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs, operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const _CharT* __rhs) const _CharT* __rhs)
{ return __lhs.compare(__rhs) > 0; } { return __lhs.compare(__rhs) > 0; }
/**
* @brief Test if C string follows string.
* @param lhs C string.
* @param rhs String.
* @return True if @a lhs follows @a rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline bool inline bool
operator>(const _CharT* __lhs, operator>(const _CharT* __lhs,
...@@ -1009,18 +2105,36 @@ namespace std ...@@ -1009,18 +2105,36 @@ namespace std
{ return __rhs.compare(__lhs) < 0; } { return __rhs.compare(__lhs) < 0; }
// operator <= // operator <=
/**
* @brief Test if string doesn't follow string.
* @param lhs First string.
* @param rhs Second string.
* @return True if @a lhs doesn't follow @a rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline bool inline bool
operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs, operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs) const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{ return __lhs.compare(__rhs) <= 0; } { return __lhs.compare(__rhs) <= 0; }
/**
* @brief Test if string doesn't follow C string.
* @param lhs String.
* @param rhs C string.
* @return True if @a lhs doesn't follow @a rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline bool inline bool
operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs, operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const _CharT* __rhs) const _CharT* __rhs)
{ return __lhs.compare(__rhs) <= 0; } { return __lhs.compare(__rhs) <= 0; }
/**
* @brief Test if C string doesn't follow string.
* @param lhs C string.
* @param rhs String.
* @return True if @a lhs doesn't follow @a rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline bool inline bool
operator<=(const _CharT* __lhs, operator<=(const _CharT* __lhs,
...@@ -1028,18 +2142,36 @@ namespace std ...@@ -1028,18 +2142,36 @@ namespace std
{ return __rhs.compare(__lhs) >= 0; } { return __rhs.compare(__lhs) >= 0; }
// operator >= // operator >=
/**
* @brief Test if string doesn't precede string.
* @param lhs First string.
* @param rhs Second string.
* @return True if @a lhs doesn't precede @a rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline bool inline bool
operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs, operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs) const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{ return __lhs.compare(__rhs) >= 0; } { return __lhs.compare(__rhs) >= 0; }
/**
* @brief Test if string doesn't precede C string.
* @param lhs String.
* @param rhs C string.
* @return True if @a lhs doesn't precede @a rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline bool inline bool
operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs, operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const _CharT* __rhs) const _CharT* __rhs)
{ return __lhs.compare(__rhs) >= 0; } { return __lhs.compare(__rhs) >= 0; }
/**
* @brief Test if C string doesn't precede string.
* @param lhs C string.
* @param rhs String.
* @return True if @a lhs doesn't precede @a rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline bool inline bool
operator>=(const _CharT* __lhs, operator>=(const _CharT* __lhs,
...@@ -1047,27 +2179,79 @@ namespace std ...@@ -1047,27 +2179,79 @@ namespace std
{ return __rhs.compare(__lhs) <= 0; } { return __rhs.compare(__lhs) <= 0; }
/**
* @brief Swap contents of two strings.
* @param lhs First string.
* @param rhs Second string.
*
* Exchanges the contents of @a lhs and @a rhs in constant time.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline void inline void
swap(basic_string<_CharT, _Traits, _Alloc>& __lhs, swap(basic_string<_CharT, _Traits, _Alloc>& __lhs,
basic_string<_CharT, _Traits, _Alloc>& __rhs) basic_string<_CharT, _Traits, _Alloc>& __rhs)
{ __lhs.swap(__rhs); } { __lhs.swap(__rhs); }
/**
* @brief Read stream into a string.
* @param is Input stream.
* @param str Buffer to store into.
* @return Reference to the input stream.
*
* Stores characters from @a is into @a str until whitespace is found, the
* end of the stream is encountered, or str.max_size() is reached. If
* is.width() is non-zero, that is the limit on the number of characters
* stored into @a str. Any previous contents of @a str are erased.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
basic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>&
operator>>(basic_istream<_CharT, _Traits>& __is, operator>>(basic_istream<_CharT, _Traits>& __is,
basic_string<_CharT, _Traits, _Alloc>& __str); basic_string<_CharT, _Traits, _Alloc>& __str);
/**
* @brief Write string to a stream.
* @param os Output stream.
* @param str String to write out.
* @return Reference to the output stream.
*
* Output characters of @a str into os following the same rules as for
* writing a C string.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>&
operator<<(basic_ostream<_CharT, _Traits>& __os, operator<<(basic_ostream<_CharT, _Traits>& __os,
const basic_string<_CharT, _Traits, _Alloc>& __str); const basic_string<_CharT, _Traits, _Alloc>& __str);
/**
* @brief Read a line from stream into a string.
* @param is Input stream.
* @param str Buffer to store into.
* @param delim Character marking end of line.
* @return Reference to the input stream.
*
* Stores characters from @a is into @a str until @a delim is found, the
* end of the stream is encountered, or str.max_size() is reached. If
* is.width() is non-zero, that is the limit on the number of characters
* stored into @a str. Any previous contents of @a str are erased. If @a
* delim was encountered, it is extracted but not stored into @a str.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
basic_istream<_CharT,_Traits>& basic_istream<_CharT,_Traits>&
getline(basic_istream<_CharT, _Traits>& __is, getline(basic_istream<_CharT, _Traits>& __is,
basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim); basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim);
/**
* @brief Read a line from stream into a string.
* @param is Input stream.
* @param str Buffer to store into.
* @return Reference to the input stream.
*
* Stores characters from is into @a str until '\n' is found, the end of
* the stream is encountered, or str.max_size() is reached. If is.width()
* is non-zero, that is the limit on the number of characters stored into
* @a str. Any previous contents of @a str are erased. If end of line was
* encountered, it is extracted but not stored into @a str.
*/
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_istream<_CharT,_Traits>& inline basic_istream<_CharT,_Traits>&
getline(basic_istream<_CharT, _Traits>& __is, getline(basic_istream<_CharT, _Traits>& __is,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment