Cleanup overload constraints, improve append

This commit is contained in:
Krystian Stasiowski
2020-02-21 19:00:54 -05:00
parent 38185d5942
commit e7f8fc3bd8
2 changed files with 232 additions and 259 deletions

View File

@ -100,6 +100,24 @@ struct void_t_helper
template<typename... Ts>
using void_t = typename void_t_helper<Ts...>::type;
// Check if a type can be used for templated
// overloads string_view_type
template<typename T, typename CharT, typename Traits, typename = void>
struct enable_if_viewable { };
template<typename T, typename CharT, typename Traits>
struct enable_if_viewable<T, CharT, Traits,
typename std::enable_if<
std::is_convertible<const T&, basic_string_view<CharT, Traits>>::value &&
!std::is_convertible<const T&, const CharT*>::value>::type>
{
using type = void;
};
template<typename T, typename CharT, typename Traits>
using enable_if_viewable_t = typename enable_if_viewable<T, CharT, Traits>::type;
// Simplified check for if a type is an iterator
template<class T, typename = void>
struct is_iterator : std::false_type { };
@ -814,8 +832,7 @@ public:
*/
template<typename T
#ifndef GENERATING_DOCUMENTATION
, class = typename std::enable_if<
std::is_convertible<T, string_view_type>::value>::type
, typename = detail::enable_if_viewable_t<T, CharT, Traits>
#endif
>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
@ -1037,16 +1054,13 @@ public:
@throw std::length_error if `string_view_type{t}.size() > max_size()`
*/
template<typename T>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
#if GENERATING_DOCUMENTATION
basic_static_string&
#else
typename std::enable_if<
std::is_convertible<T, string_view_type>::value &&
!std::is_convertible<T, const_pointer>::value,
basic_static_string&>::type
template<typename T
#ifndef GENERATING_DOCUMENTATION
, typename = detail::enable_if_viewable_t<T, CharT, Traits>
#endif
>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
basic_static_string&
assign(const T& t)
{
string_view_type ss{t};
@ -1065,22 +1079,18 @@ public:
@throw std::length_error if `string_view_type{t}.substr(pos, count).size() > max_size()`
*/
template<typename T>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
#if GENERATING_DOCUMENTATION
basic_static_string&
#else
typename std::enable_if<
std::is_convertible<T, string_view_type>::value &&
!std::is_convertible<T, const_pointer>::value,
basic_static_string&>::type
template<typename T
#ifndef GENERATING_DOCUMENTATION
, typename = detail::enable_if_viewable_t<T, CharT, Traits>
#endif
>
basic_static_string&
assign(
const T& t,
size_type pos,
size_type count = npos)
{
return assign(string_view_type{t}.substr(pos, count));
return assign(string_view_type(t).substr(pos, count));
}
//--------------------------------------------------------------------------
@ -1209,7 +1219,7 @@ public:
BOOST_STATIC_STRING_CPP11_CONSTEXPR
operator string_view_type() const noexcept
{
return string_view_type{data(), size()};
return string_view_type(data(), size());
}
//--------------------------------------------------------------------------
@ -1592,9 +1602,7 @@ public:
size_type index_str,
size_type count = npos)
{
BOOST_STATIC_STRING_THROW_IF(
index_str > str.size(), std::out_of_range{"index_str > str.size()"});
return insert_unchecked(index, str.data() + index_str, (std::min)(count, str.size() - index_str));
return insert_unchecked(index, str.data() + index_str, str.capped_length(index_str, count));
}
#ifndef GENERATING_DOCUMENTATION
@ -1606,9 +1614,7 @@ public:
size_type index_str,
size_type count = npos)
{
BOOST_STATIC_STRING_THROW_IF(
index_str > str.size(), std::out_of_range{"index_str > str.size()"});
return insert(index, str.data() + index_str, (std::min)(count, str.size() - index_str));
return insert(index, str.data() + index_str, str.capped_length(index_str, count));
}
#endif
@ -1714,7 +1720,7 @@ public:
*/
template<typename InputIterator>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
#if GENERATING_DOCUMENTATION
#ifdef GENERATING_DOCUMENTATION
iterator
#else
typename std::enable_if<
@ -1806,18 +1812,13 @@ public:
@throw std::length_error `size() + sv.size() > max_size()`
@throw std::out_of_range `index > size()`
*/
template<typename T>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
#if GENERATING_DOCUMENTATION
basic_static_string&
#else
typename std::enable_if<
std::is_convertible<
const T&, string_view_type>::value &&
!std::is_convertible<
const T&, const_pointer>::value,
basic_static_string&>::type
template<typename T
#ifndef GENERATING_DOCUMENTATION
, typename = detail::enable_if_viewable_t<T, CharT, Traits>
#endif
>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
basic_static_string&
insert(
size_type index,
const T& t)
@ -1857,16 +1858,13 @@ public:
@throw std::out_of_range `index > size()`
@throw std::out_of_range `index_str > sv.size()`
*/
template<typename T>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
#if GENERATING_DOCUMENTATION
basic_static_string&
#else
typename std::enable_if<
std::is_convertible<const T&, string_view_type>::value &&
!std::is_convertible<const T&, const_pointer>::value,
basic_static_string&>::type
template<typename T
#ifndef GENERATING_DOCUMENTATION
, typename = detail::enable_if_viewable_t<T, CharT, Traits>
#endif
>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
basic_static_string&
insert(
size_type index,
const T& t,
@ -1886,7 +1884,11 @@ public:
basic_static_string&
erase(
size_type index = 0,
size_type count = npos);
size_type count = npos)
{
erase(data() + index, data() + index + capped_length(index, count));
return *this;
}
/** Removes the character at `pos`
@ -1942,46 +1944,45 @@ public:
basic_static_string&
append(
size_type count,
value_type ch)
value_type ch);
/** Append to the string.
Appends the string `s`.
The appended string can contain null characters.
@throw std::length_error if `s.size() > max_size() - size()`
@return `*this`
*/
template<std::size_t M>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
basic_static_string&
append(
const basic_static_string<M, CharT, Traits>& s)
{
return insert(size(), count, ch);
return append(s.data(), s.size());
}
/** Append to the string.
Appends the contents of string view `sv`
Appends the contents of `s.substr(pos, count)`
The appended string can contain null characters.
@throw std::length_error if `sv.size() > max_size() - size()`
@throw std::out_of_range if `pos > s.size()`
@throw std::length_error if `s.substr(pos, count).size() > max_size() - size()`
@return `*this`
*/
template<std::size_t M>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
basic_static_string&
append(
string_view_type sv)
{
return append(sv.data(), sv.size());
}
/** Append to the string.
Appends the contents of `sv.substr(pos, count)`
The appended string can contain null characters.
@throw std::out_of_range if `pos > sv.size()`
@throw std::length_error if `sv.substr(pos, count).size() > max_size() - size()`
@return `*this`
*/
BOOST_STATIC_STRING_CPP14_CONSTEXPR
basic_static_string&
append(
string_view_type sv,
const basic_static_string<M, CharT, Traits>& s,
size_type pos,
size_type count = npos)
{
return append(sv.substr(pos, count));
return append(s.data() + pos, s.capped_length(pos, count));
}
/** Append to the string.
@ -2011,8 +2012,7 @@ public:
*/
BOOST_STATIC_STRING_CPP14_CONSTEXPR
basic_static_string&
append(
const_pointer s)
append(const_pointer s)
{
return append(s, traits_type::length(s));
}
@ -2030,7 +2030,7 @@ public:
*/
template<typename InputIterator>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
#if GENERATING_DOCUMENTATION
#ifdef GENERATING_DOCUMENTATION
basic_static_string&
#else
typename std::enable_if<
@ -2039,11 +2039,7 @@ public:
#endif
append(
InputIterator first,
InputIterator last)
{
insert(end(), first, last);
return *this;
}
InputIterator last);
/** Append to the string.
@ -2059,8 +2055,7 @@ public:
append(
std::initializer_list<value_type> ilist)
{
insert(end(), ilist);
return *this;
return append(ilist.begin(), ilist.size());
}
/** Append to the string.
@ -2075,22 +2070,17 @@ public:
@throw std::length_error if `string_view_type{t}.size() > max_size() - size()`
@return `*this`
*/
template<typename T>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
#if GENERATING_DOCUMENTATION
basic_static_string&
#else
typename std::enable_if<
std::is_convertible<
const T&, string_view_type>::value &&
!std::is_convertible<
const T&, const_pointer>::value,
basic_static_string&>::type
template<typename T
#ifndef GENERATING_DOCUMENTATION
, typename = detail::enable_if_viewable_t<T, CharT, Traits>
#endif
append(
const T& t)
>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
basic_static_string&
append(const T& t)
{
return append(string_view_type{t});
const string_view_type sv = t;
return append(sv.data(), sv.size());
}
/** Append to the string.
@ -2106,24 +2096,19 @@ public:
@throw std::length_error if `string_view_type{t}.substr(pos, count).size() > max_size() - size()`
@return `*this`
*/
template<typename T>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
#if GENERATING_DOCUMENTATION
basic_static_string&
#else
typename std::enable_if<
std::is_convertible<
const T&, string_view_type>::value &&
!std::is_convertible<
const T&, const_pointer>::value,
basic_static_string&>::type
template<typename T
#ifndef GENERATING_DOCUMENTATION
, typename = detail::enable_if_viewable_t<T, CharT, Traits>
#endif
>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
basic_static_string&
append(
const T& t,
size_type pos,
size_type count = npos)
{
return append(string_view_type{t}.substr(pos, count));
return append(string_view_type(t).substr(pos, count));
}
/** Append to the string.
@ -2136,7 +2121,7 @@ public:
operator+=(
const basic_static_string<M, CharT, Traits>& s)
{
return append(s.data(), s.size());
return append(s);
}
/** Append to the string.
@ -2147,8 +2132,7 @@ public:
*/
BOOST_STATIC_STRING_CPP14_CONSTEXPR
basic_static_string&
operator+=(
value_type ch)
operator+=(value_type ch)
{
push_back(ch);
return *this;
@ -2166,8 +2150,7 @@ public:
*/
BOOST_STATIC_STRING_CPP14_CONSTEXPR
basic_static_string&
operator+=(
const_pointer s)
operator+=(const_pointer s)
{
return append(s);
}
@ -2200,16 +2183,13 @@ public:
@throw std::length_error if `string_view_type{t}.size() > max_size()`
*/
template<typename T>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
#if GENERATING_DOCUMENTATION
basic_static_string&
#else
typename std::enable_if<
std::is_convertible<T, string_view_type>::value &&
!std::is_convertible<T, const_pointer>::value,
basic_static_string&>::type
template<typename T
#ifndef GENERATING_DOCUMENTATION
, typename = detail::enable_if_viewable_t<T, CharT, Traits>
#endif
>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
basic_static_string&
operator+=(
const T& t)
{
@ -2347,16 +2327,13 @@ public:
`T` is convertible to `string_view_type` and `T` is not
convertible to `const_pointer`.
*/
template<typename T>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
#if GENERATING_DOCUMENTATION
int
#else
typename std::enable_if<
std::is_convertible<const T&, string_view_type>::value &&
!std::is_convertible<const T&, const_pointer>::value,
int>::type
template<typename T
#ifndef GENERATING_DOCUMENTATION
, typename = detail::enable_if_viewable_t<T, CharT, Traits>
#endif
>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
int
compare(
size_type pos1,
size_type count1,
@ -2392,9 +2369,7 @@ public:
size_type pos = 0,
size_type count = npos) const
{
BOOST_STATIC_STRING_THROW_IF(
pos > size(), std::out_of_range{"pos > size()"});
return basic_static_string(&data()[pos], (std::min)(count, size() - pos));
return basic_static_string(&data()[pos], capped_length(pos, count));
}
/** Return a view of a substring.
@ -2421,9 +2396,7 @@ public:
size_type pos = 0,
size_type count = npos) const
{
BOOST_STATIC_STRING_THROW_IF(
pos > size(), std::out_of_range{"pos > size()"});
return string_view_type(&data()[pos], (std::min)(count, size() - pos));
return string_view_type(&data()[pos], capped_length(pos, count));
}
/** Copy a substring to another string.
@ -2583,10 +2556,7 @@ public:
size_type pos2,
size_type n2 = npos)
{
// this check is not redundant, its for the substr operation performed on str
BOOST_STATIC_STRING_THROW_IF(
pos2 > str.size(), std::out_of_range{"pos2 > str.size()"});
return replace_unchecked(pos1, n1, str.data() + pos2, (std::min)(n2, str.size() - pos2));
return replace_unchecked(pos1, n1, str.data() + pos2, str.capped_length(pos2, n2));
}
#ifndef GENERATING_DOCUMENTATION
@ -2599,9 +2569,7 @@ public:
size_type pos2,
size_type n2 = npos)
{
BOOST_STATIC_STRING_THROW_IF(
pos2 > str.size(), std::out_of_range{"pos2 > str.size()"});
return replace(pos1, n1, str.data() + pos2, (std::min)(n2, str.size() - pos2));
return replace(pos1, n1, str.data() + pos2, str.capped_length(pos2, n2));
}
#endif
@ -2635,16 +2603,13 @@ public:
@throw std::length_error `size() + (sv.size() - rcount) > max_size()`
@throw std::out_of_range `pos1 > size()`
*/
template<typename T>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
#if GENERATING_DOCUMENTATION
basic_static_string&
#else
typename std::enable_if<
std::is_convertible<T, string_view_type>::value &&
!std::is_convertible<T, const_pointer>::value,
basic_static_string&>::type
template<typename T
#ifndef GENERATING_DOCUMENTATION
, typename = detail::enable_if_viewable_t<T, CharT, Traits>
#endif
>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
basic_static_string&
replace(
size_type pos1,
size_type n1,
@ -2688,16 +2653,13 @@ public:
@throw std::out_of_range `pos1 > size()`
@throw std::out_of_range `pos2 > sv.size()`
*/
template<typename T>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
#if GENERATING_DOCUMENTATION
basic_static_string&
#else
typename std::enable_if<
std::is_convertible<T, string_view_type>::value &&
!std::is_convertible<T, const_pointer>::value,
basic_static_string&>::type
template<typename T
#ifndef GENERATING_DOCUMENTATION
, typename = detail::enable_if_viewable_t<T, CharT, Traits>
#endif
>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
basic_static_string&
replace(
size_type pos1,
size_type n1,
@ -2740,9 +2702,7 @@ public:
const_pointer s,
size_type n2)
{
BOOST_STATIC_STRING_THROW_IF(
pos > size(), std::out_of_range{"pos > size()"});
return replace(data() + pos, data() + pos + (std::min)(n1, size() - pos), s, n2);
return replace(data() + pos, data() + pos + capped_length(pos, n1), s, n2);
}
/** Replace a substring with a string.
@ -2809,9 +2769,7 @@ public:
size_type n2,
value_type c)
{
BOOST_STATIC_STRING_THROW_IF(
pos > size(), std::out_of_range{"pos > size()"});
return replace(data() + pos, data() + pos + (std::min)(n1, size() - pos), n2, c);
return replace(data() + pos, data() + pos + capped_length(pos, n1), n2, c);
}
/** Replace a range with a string.
@ -2903,16 +2861,13 @@ public:
@throw std::length_error `size() + (sv.size() - std::distance(i1, i2)) > max_size()`
*/
template<typename T>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
#if GENERATING_DOCUMENTATION
basic_static_string&
#else
typename std::enable_if<
std::is_convertible<T, string_view_type>::value &&
!std::is_convertible<T, const_pointer>::value,
basic_static_string&>::type
template<typename T
#ifndef GENERATING_DOCUMENTATION
, typename = detail::enable_if_viewable_t<T, CharT, Traits>
#endif
>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
basic_static_string&
replace(
const_iterator i1,
const_iterator i2,
@ -3070,7 +3025,7 @@ public:
*/
template<typename InputIterator>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
#if GENERATING_DOCUMENTATION
#ifdef GENERATING_DOCUMENTATION
basic_static_string&
#else
typename std::enable_if<
@ -3169,16 +3124,13 @@ public:
@param pos The index to start searching at. The default argument
for this parameter is `0`.
*/
template<class T>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
#if GENERATING_DOCUMENTATION
size_type
#else
typename std::enable_if<
std::is_convertible<T, string_view_type>::value &&
!std::is_convertible<T, const_pointer>::value,
size_type>::type
template<typename T
#ifndef GENERATING_DOCUMENTATION
, typename = detail::enable_if_viewable_t<T, CharT, Traits>
#endif
>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
size_type
find(
const T& t,
size_type pos = 0) const
@ -3325,16 +3277,13 @@ public:
@param pos The index to start searching at. The default argument
for this parameter is @ref npos.
*/
template<class T>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
#if GENERATING_DOCUMENTATION
size_type
#else
typename std::enable_if<
std::is_convertible<T, string_view_type>::value &&
!std::is_convertible<T, const_pointer>::value,
size_type>::type
template<typename T
#ifndef GENERATING_DOCUMENTATION
, typename = detail::enable_if_viewable_t<T, CharT, Traits>
#endif
>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
size_type
rfind(
const T& t,
size_type pos = npos) const
@ -3476,16 +3425,13 @@ public:
@param pos The index to start searching at. The default argument
for this parameter is `0`.
*/
template<class T>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
#if GENERATING_DOCUMENTATION
size_type
#else
typename std::enable_if<
std::is_convertible<T, string_view_type>::value &&
!std::is_convertible<T, const_pointer>::value,
size_type>::type
template<typename T
#ifndef GENERATING_DOCUMENTATION
, typename = detail::enable_if_viewable_t<T, CharT, Traits>
#endif
>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
size_type
find_first_of(
const T& t,
size_type pos = 0) const
@ -3622,16 +3568,13 @@ public:
@param pos The index to stop searching at. The default argument
for this parameter is @ref npos.
*/
template<class T>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
#if GENERATING_DOCUMENTATION
size_type
#else
typename std::enable_if<
std::is_convertible<T, string_view_type>::value &&
!std::is_convertible<T, const_pointer>::value,
size_type>::type
template<typename T
#ifndef GENERATING_DOCUMENTATION
, typename = detail::enable_if_viewable_t<T, CharT, Traits>
#endif
>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
size_type
find_last_of(
const T& t,
size_type pos = npos) const
@ -3767,16 +3710,13 @@ public:
@param pos The index to start searching at. The default argument
for this parameter is `0`.
*/
template<class T>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
#if GENERATING_DOCUMENTATION
size_type
#else
typename std::enable_if<
std::is_convertible<T, string_view_type>::value &&
!std::is_convertible<T, const_pointer>::value,
size_type>::type
template<typename T
#ifndef GENERATING_DOCUMENTATION
, typename = detail::enable_if_viewable_t<T, CharT, Traits>
#endif
>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
size_type
find_first_not_of(
const T& t,
size_type pos = 0) const
@ -3911,16 +3851,13 @@ public:
@param pos The index to start searching at. The default argument
for this parameter is @ref npos.
*/
template<class T>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
#if GENERATING_DOCUMENTATION
size_type
#else
typename std::enable_if<
std::is_convertible<T, string_view_type>::value &&
!std::is_convertible<T, const_pointer>::value,
size_type>::type
template<typename T
#ifndef GENERATING_DOCUMENTATION
, typename = detail::enable_if_viewable_t<T, CharT, Traits>
#endif
>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
size_type
find_last_not_of(
const T& t,
size_type pos = npos) const
@ -4121,6 +4058,7 @@ private:
BOOST_STATIC_STRING_CPP14_CONSTEXPR
size_type
read_back(
bool overwrite_null,
InputIterator first,
InputIterator last);
@ -4134,7 +4072,7 @@ private:
{
BOOST_STATIC_STRING_THROW_IF(
pos > size(), std::out_of_range{"pos > size()"});
return replace_unchecked(data() + pos, data() + pos + n1, s, n2);
return replace_unchecked(data() + pos, data() + pos + capped_length(pos, n1), s, n2);
}
BOOST_STATIC_STRING_CPP14_CONSTEXPR
@ -4164,6 +4102,17 @@ private:
const_iterator pos,
const_pointer s,
size_type count);
BOOST_STATIC_STRING_CPP14_CONSTEXPR
size_type
capped_length(
size_type index,
size_type length) const
{
BOOST_STATIC_STRING_THROW_IF(
index > size(), std::out_of_range{"index > size()"});
return (std::min)(length, size() - index);
}
};
//------------------------------------------------------------------------------
@ -4518,7 +4467,7 @@ operator<<(
std::basic_ostream<CharT, Traits>& os,
const basic_static_string<N, CharT, Traits>& s)
{
return os << typename basic_static_string<N, CharT, Traits>::string_view_type(s.data(), s.size());
return os << boost::static_string::basic_string_view<CharT, Traits>(s.data(), s.size());
}
//------------------------------------------------------------------------------
@ -4728,7 +4677,7 @@ namespace std {
template<std::size_t N, typename CharT, typename Traits>
struct hash<
#if GENERATING_DOCUMENTATION
#ifdef GENERATING_DOCUMENTATION
basic_static_string
#else
boost::static_string::basic_static_string<N, CharT, Traits>
@ -4943,28 +4892,13 @@ insert(
{
const auto curr_size = size();
const auto curr_data = data();
const auto count = read_back(first, last);
const auto count = read_back(false, first, last);
const std::size_t index = pos - curr_data;
std::rotate(&curr_data[index], &curr_data[curr_size + 1], &curr_data[curr_size + count + 1]);
this->set_size(curr_size + count);
return curr_data + index;
}
template<std::size_t N, typename CharT, typename Traits>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
auto
basic_static_string<N, CharT, Traits>::
erase(
size_type index,
size_type count) ->
basic_static_string&
{
BOOST_STATIC_STRING_THROW_IF(
index > size(), std::out_of_range{"index > size()"});
erase(data() + index, data() + index + (std::min)(count, size() - index));
return *this;
}
template<std::size_t N, typename CharT, typename Traits>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
auto
@ -4996,6 +4930,23 @@ push_back(
term();
}
template<std::size_t N, typename CharT, typename Traits>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
auto
basic_static_string<N, CharT, Traits>::
append(
size_type count,
value_type ch) ->
basic_static_string&
{
const auto curr_size = size();
BOOST_STATIC_STRING_THROW_IF(
count > max_size() - curr_size, std::length_error{"count > max_size() - size()"});
traits_type::assign(end(), count, ch);
this->set_size(curr_size + count);
return term();
}
template<std::size_t N, typename CharT, typename Traits>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
auto
@ -5008,11 +4959,27 @@ append(
const auto curr_size = size();
BOOST_STATIC_STRING_THROW_IF(
count > max_size() - curr_size, std::length_error{"count > max_size() - size()"});
traits_type::copy(&data()[curr_size], s, count);
traits_type::copy(end(), s, count);
this->set_size(curr_size + count);
return term();
}
template<std::size_t N, typename CharT, typename Traits>
template<class InputIterator>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
auto
basic_static_string<N, CharT, Traits>::
append(
InputIterator first,
InputIterator last) ->
typename std::enable_if<
detail::is_input_iterator<InputIterator>::value,
basic_static_string&>::type
{
this->set_size(size() + read_back(true, first, last));
return term();
}
template<std::size_t N, typename CharT, typename Traits>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
auto
@ -5197,7 +5164,7 @@ replace(
const auto curr_size = size();
const auto curr_data = data();
const std::size_t n1 = detail::distance(i1, i2);
const std::size_t n2 = read_back(j1, j2);
const std::size_t n2 = read_back(false, j1, j2);
const std::size_t pos = i1 - curr_data;
BOOST_STATIC_STRING_THROW_IF(
n2 > max_size() ||
@ -5338,6 +5305,7 @@ BOOST_STATIC_STRING_CPP14_CONSTEXPR
auto
basic_static_string<N, CharT, Traits>::
read_back(
bool overwrite_null,
InputIterator first,
InputIterator last) ->
size_type
@ -5346,9 +5314,14 @@ read_back(
auto new_size = size();
for (; first != last; ++first)
{
BOOST_STATIC_STRING_THROW_IF(
new_size >= max_size(), std::length_error{"count > max_size() - size()"});
traits_type::assign(curr_data[++new_size], *first);
if (new_size >= max_size())
{
if (overwrite_null)
term();
BOOST_STATIC_STRING_THROW(
std::length_error{"count > max_size() - size()"});
}
traits_type::assign(curr_data[new_size++ + (!overwrite_null)], *first);
}
return new_size - size();
}