2019-12-16 12:23:46 -05:00
|
|
|
//
|
|
|
|
// Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
|
|
|
|
// Copyright (c) 2019 Krystian Stasiowski (sdkrystian at gmail dot com)
|
|
|
|
//
|
|
|
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
|
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
//
|
|
|
|
// Official repository: https://github.com/boostorg/static_string
|
|
|
|
//
|
|
|
|
|
|
|
|
#ifndef BOOST_STATIC_STRING_STATIC_STRING_HPP
|
|
|
|
#define BOOST_STATIC_STRING_STATIC_STRING_HPP
|
|
|
|
|
|
|
|
#include <boost/static_string/config.hpp>
|
|
|
|
#include <boost/static_string/detail/static_string.hpp>
|
|
|
|
#include <algorithm>
|
|
|
|
#include <cstdint>
|
|
|
|
#include <initializer_list>
|
|
|
|
#include <iosfwd>
|
|
|
|
#include <type_traits>
|
|
|
|
|
|
|
|
namespace boost {
|
|
|
|
namespace static_string {
|
|
|
|
|
|
|
|
/** A fixed-capacity string.
|
|
|
|
|
|
|
|
These objects behave like `std::string` except that the storage
|
|
|
|
is not dynamically allocated but rather fixed in size, and
|
|
|
|
stored in the object itself.
|
|
|
|
|
|
|
|
These strings offer performance advantages when an algorithm
|
|
|
|
can execute with a reasonable upper limit on the size of a value.
|
|
|
|
|
|
|
|
@see to_static_string
|
|
|
|
*/
|
|
|
|
template<
|
|
|
|
std::size_t N,
|
|
|
|
typename CharT,
|
|
|
|
typename Traits = std::char_traits<CharT>>
|
|
|
|
class basic_static_string
|
|
|
|
#ifndef GENERATING_DOCUMENTATION
|
|
|
|
: detail::optimization_base<N, CharT, Traits>
|
|
|
|
#endif
|
2019-10-27 21:01:44 -04:00
|
|
|
{
|
2019-12-16 12:23:46 -05:00
|
|
|
private:
|
|
|
|
template<std::size_t, class, class>
|
|
|
|
friend class basic_static_string;
|
|
|
|
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
void
|
|
|
|
term() noexcept
|
|
|
|
{
|
|
|
|
this->term_impl();
|
|
|
|
}
|
|
|
|
|
|
|
|
using base = detail::optimization_base<N, CharT, Traits>;
|
|
|
|
|
|
|
|
public:
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Member types
|
|
|
|
//
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
|
|
using traits_type = Traits;
|
|
|
|
using value_type = typename Traits::char_type;
|
|
|
|
using size_type = std::size_t;
|
|
|
|
using difference_type = std::ptrdiff_t;
|
|
|
|
using pointer = value_type*;
|
|
|
|
using reference = value_type&;
|
|
|
|
using const_pointer = value_type const*;
|
|
|
|
using const_reference = value_type const&;
|
|
|
|
using iterator = value_type*;
|
|
|
|
using const_iterator = value_type const*;
|
|
|
|
|
|
|
|
using reverse_iterator =
|
|
|
|
std::reverse_iterator<iterator>;
|
|
|
|
|
|
|
|
using const_reverse_iterator =
|
|
|
|
std::reverse_iterator<const_iterator>;
|
|
|
|
|
|
|
|
/// The type of `string_view` returned by the interface
|
|
|
|
using string_view_type =
|
2019-12-16 18:19:01 -05:00
|
|
|
basic_string_view<CharT, Traits>;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Constants
|
|
|
|
//
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
|
|
/// Maximum size of the string excluding any null terminator
|
|
|
|
static constexpr size_type static_capacity = N;
|
|
|
|
|
|
|
|
/// A special index
|
|
|
|
static constexpr size_type npos = size_type(-1);
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Construction
|
|
|
|
//
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
|
|
/** Construct a `basic_static_string`.
|
|
|
|
|
|
|
|
Construct an empty string
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP11_CONSTEXPR
|
|
|
|
basic_static_string() noexcept;
|
|
|
|
|
|
|
|
/** Construct a `basic_static_string`.
|
|
|
|
|
|
|
|
Construct the string with `count` copies of character `ch`.
|
|
|
|
|
|
|
|
The behavior is undefined if `count >= npos`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string(
|
|
|
|
size_type count,
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT ch) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Construct a `basic_static_string`.
|
|
|
|
|
|
|
|
Construct with a substring (pos, other.size()) of `other`.
|
|
|
|
*/
|
|
|
|
template<std::size_t M>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string(
|
|
|
|
basic_static_string<M, CharT, Traits> const& other,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type pos) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Construct a `basic_static_string`.
|
|
|
|
|
|
|
|
Construct with a substring (pos, count) of `other`.
|
|
|
|
*/
|
|
|
|
template<std::size_t M>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string(
|
|
|
|
basic_static_string<M, CharT, Traits> const& other,
|
|
|
|
size_type pos,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type count) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Construct a `basic_static_string`.
|
|
|
|
|
|
|
|
Construct with the first `count` characters of `s`, including nulls.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string(
|
|
|
|
CharT const* s,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type count) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Construct a `basic_static_string`.
|
|
|
|
|
|
|
|
Construct from a null terminated string.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string(
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT const* s) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Construct a `basic_static_string`.
|
|
|
|
|
|
|
|
Construct from a range of characters
|
|
|
|
*/
|
|
|
|
template<class InputIterator>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string(
|
|
|
|
InputIterator first,
|
|
|
|
InputIterator last
|
|
|
|
#ifndef GENERATING_DOCUMENTATION
|
|
|
|
, typename std::enable_if<
|
|
|
|
detail::is_input_iterator<InputIterator>::value,
|
|
|
|
iterator>::type* = 0
|
|
|
|
#endif
|
2019-12-26 17:22:57 -05:00
|
|
|
) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Construct a `basic_static_string`.
|
|
|
|
|
|
|
|
Copy constructor.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string(
|
|
|
|
basic_static_string const& other) noexcept;
|
|
|
|
|
|
|
|
/** Construct a `basic_static_string`.
|
|
|
|
|
|
|
|
Copy constructor.
|
|
|
|
*/
|
|
|
|
template<std::size_t M>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string(
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<M, CharT, Traits> const& other) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Construct a `basic_static_string`.
|
|
|
|
|
|
|
|
Construct from an initializer list
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string(
|
2019-12-26 17:22:57 -05:00
|
|
|
std::initializer_list<CharT> init) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Construct a `basic_static_string`.
|
|
|
|
|
|
|
|
Construct from a `string_view`
|
|
|
|
*/
|
|
|
|
explicit
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string(
|
2019-12-26 17:22:57 -05:00
|
|
|
string_view_type sv) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Construct a `basic_static_string`.
|
|
|
|
|
|
|
|
Construct from any object convertible to `string_view_type`.
|
|
|
|
|
|
|
|
The range (pos, n) is extracted from the value
|
|
|
|
obtained by converting `t` to `string_view_type`,
|
|
|
|
and used to construct the string.
|
|
|
|
*/
|
|
|
|
template<typename T
|
|
|
|
#ifndef GENERATING_DOCUMENTATION
|
|
|
|
, class = typename std::enable_if<
|
|
|
|
std::is_convertible<T, string_view_type>::value>::type
|
|
|
|
#endif
|
|
|
|
>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string(
|
|
|
|
T const& t,
|
|
|
|
size_type pos,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type n) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Assignment
|
|
|
|
//
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
|
|
/** Assign to the string.
|
|
|
|
|
|
|
|
If `*this` and `s` are the same object,
|
|
|
|
this function has no effect.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
operator=(
|
|
|
|
basic_static_string const& s) noexcept
|
|
|
|
{
|
|
|
|
return assign(s);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Assign to the string.
|
|
|
|
|
|
|
|
Replace the contents with a copy of `s`
|
|
|
|
|
|
|
|
@throw std::length_error if `s.size() > max_size()`
|
|
|
|
*/
|
|
|
|
template<std::size_t M>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
operator=(
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<M, CharT, Traits> const& s) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return assign(s);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Assign to the string.
|
|
|
|
|
|
|
|
Replace the contents with those of the null-terminated string `s`
|
|
|
|
|
|
|
|
@throw std::length_error if `Traits::length(s) > max_size()`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
operator=(
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT const* s) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return assign(s);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Assign to the string.
|
|
|
|
|
|
|
|
Assign from single character.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
operator=(
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT ch) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return assign_char(ch,
|
2019-12-16 17:36:12 -05:00
|
|
|
std::integral_constant<bool, (N > 0)>{});
|
2019-12-16 12:23:46 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/** Assign to the string.
|
|
|
|
|
|
|
|
Assign from initializer list.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
operator=(
|
2019-12-26 17:22:57 -05:00
|
|
|
std::initializer_list<CharT> ilist) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return assign(ilist);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Assign to the string.
|
|
|
|
|
|
|
|
Assign from `string_view_type`.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
operator=(
|
2019-12-26 17:22:57 -05:00
|
|
|
string_view_type sv) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return assign(sv);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Replace the contents.
|
|
|
|
|
|
|
|
Replace the contents with `count` copies of character `ch`
|
|
|
|
|
|
|
|
@throw std::length_error if `count > max_size()`
|
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
assign(
|
|
|
|
size_type count,
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT ch) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Replace the contents.
|
|
|
|
|
|
|
|
Replace the contents with a copy of another `basic_static_string`
|
|
|
|
|
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
assign(
|
|
|
|
basic_static_string const& s) noexcept;
|
|
|
|
|
|
|
|
/** Replace the contents.
|
|
|
|
|
|
|
|
Replace the contents with a copy of another `basic_static_string`
|
|
|
|
|
|
|
|
@throw std::length_error if `s.size() > max_size()`
|
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
template<std::size_t M>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
assign(
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<M, CharT, Traits> const& s) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
// VFALCO this could come in two flavors,
|
|
|
|
// N>M and N<M, and skip the exception
|
|
|
|
// check when N>M
|
|
|
|
return assign(s.data(), s.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Replace the contents.
|
|
|
|
|
|
|
|
Replace the contents with a copy of `count` characters starting at `npos` from `s`.
|
|
|
|
|
|
|
|
@throw std::length_error if `count > max_size()`
|
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
template<std::size_t M>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
assign(
|
|
|
|
basic_static_string<M, CharT, Traits> const& s,
|
|
|
|
size_type pos,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type count = npos) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Replace the contents.
|
|
|
|
|
|
|
|
Replace the contents with the first `count` characters of `s`, including nulls.
|
|
|
|
|
|
|
|
@throw std::length_error if `count > max_size()`
|
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
assign(
|
|
|
|
CharT const* s,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type count) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Replace the contents.
|
|
|
|
|
|
|
|
Replace the contents with a copy of a null terminated string `s`
|
|
|
|
|
|
|
|
@throw std::length_error if `Traits::length(s) > max_size()`
|
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
assign(
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT const* s) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return assign(s, Traits::length(s));
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Replace the contents.
|
|
|
|
|
|
|
|
Replace the contents with a copy of characters from the range `(first, last)`
|
|
|
|
|
|
|
|
@throw std::length_error if `std::distance(first, last) > max_size()`
|
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
template<typename InputIterator>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
#ifdef GENERATING_DOCUMENTATION
|
|
|
|
basic_static_string&
|
|
|
|
#else
|
|
|
|
typename std::enable_if<
|
|
|
|
detail::is_input_iterator<InputIterator>::value,
|
|
|
|
basic_static_string&>::type
|
|
|
|
#endif
|
|
|
|
assign(
|
|
|
|
InputIterator first,
|
2019-12-26 17:22:57 -05:00
|
|
|
InputIterator last) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Replace the contents.
|
|
|
|
|
|
|
|
Replace the contents with the characters in an initializer list
|
|
|
|
|
|
|
|
@throw std::length_error if `ilist.size() > max_size()`
|
|
|
|
@return `*this`
|
|
|
|
*/
|
2019-12-30 16:44:17 -05:00
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
basic_static_string&
|
|
|
|
assign(
|
2019-12-26 17:22:57 -05:00
|
|
|
std::initializer_list<CharT> ilist) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return assign(ilist.begin(), ilist.end());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Replace the contents.
|
|
|
|
|
|
|
|
Replace the contents with a copy of the characters from `string_view_type{t}`
|
|
|
|
|
|
|
|
@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, CharT const*>::value,
|
|
|
|
basic_static_string&>::type
|
|
|
|
#endif
|
2019-12-26 17:22:57 -05:00
|
|
|
assign(T const& t) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
string_view_type ss{t};
|
|
|
|
return assign(ss.data(), ss.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Replace the contents.
|
|
|
|
|
|
|
|
Replace the contents with a copy of the characters from `string_view_type{t}.substr(pos, count)`
|
|
|
|
|
|
|
|
The range `[pos, count)` is extracted from the value
|
|
|
|
obtained by converting `t` to `string_view_type`,
|
|
|
|
and used to assign the string.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `pos > string_view_type{t}.size()`
|
|
|
|
@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, CharT const*>::value,
|
|
|
|
basic_static_string&>::type
|
|
|
|
#endif
|
|
|
|
assign(
|
|
|
|
T const& t,
|
|
|
|
size_type pos,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type count = npos) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return assign(string_view_type{t}.substr(pos, count));
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Element access
|
|
|
|
//
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
|
|
/** Access specified character with bounds checking.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `pos >= size()`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
reference
|
2019-12-26 17:22:57 -05:00
|
|
|
at(size_type pos) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Access specified character with bounds checking.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `pos >= size()`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
const_reference
|
2019-12-26 17:22:57 -05:00
|
|
|
at(size_type pos) const BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Access specified character
|
|
|
|
|
|
|
|
Undefined behavior if `pos > size()`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
reference
|
|
|
|
operator[](size_type pos) noexcept
|
|
|
|
{
|
|
|
|
return data()[pos];
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Access specified character.
|
|
|
|
|
|
|
|
Undefined behavior if `pos > size()`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
const_reference
|
|
|
|
operator[](size_type pos) const noexcept
|
|
|
|
{
|
|
|
|
return data()[pos];
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Accesses the first character.
|
|
|
|
|
|
|
|
Undefined behavior if `empty() == true`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
CharT&
|
|
|
|
front() noexcept
|
|
|
|
{
|
|
|
|
return data()[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Accesses the first character.
|
|
|
|
|
|
|
|
Undefined behavior if `empty() == true`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
CharT const&
|
|
|
|
front() const noexcept
|
|
|
|
{
|
|
|
|
return data()[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Accesses the last character.
|
|
|
|
|
|
|
|
Undefined behavior if `empty() == true`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
CharT&
|
|
|
|
back() noexcept
|
|
|
|
{
|
|
|
|
return data()[size()-1];
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Accesses the last character.
|
|
|
|
|
|
|
|
Undefined behavior if `empty() == true`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
CharT const&
|
|
|
|
back() const noexcept
|
|
|
|
{
|
|
|
|
return data()[size()-1];
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns a pointer to the first character of the string.
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
CharT*
|
|
|
|
data() noexcept
|
|
|
|
{
|
|
|
|
return this->data_impl();
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns a pointer to the first character of a string.
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
CharT const*
|
|
|
|
data() const noexcept
|
|
|
|
{
|
|
|
|
return this->data_impl();
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns a non-modifiable standard C character array version of the string.
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
CharT const*
|
|
|
|
c_str() const noexcept
|
|
|
|
{
|
|
|
|
return data();
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Convert a static string to a `string_view_type`
|
|
|
|
BOOST_STATIC_STRING_CPP11_CONSTEXPR
|
|
|
|
operator string_view_type() const noexcept
|
|
|
|
{
|
|
|
|
return string_view_type{data(), size()};
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Iterators
|
|
|
|
//
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
|
|
/// Returns an iterator to the beginning.
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
iterator
|
|
|
|
begin() noexcept
|
|
|
|
{
|
|
|
|
return data();
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns an iterator to the beginning.
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
const_iterator
|
|
|
|
begin() const noexcept
|
|
|
|
{
|
|
|
|
return data();
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns an iterator to the beginning.
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
const_iterator
|
|
|
|
cbegin() const noexcept
|
|
|
|
{
|
|
|
|
return data();
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns an iterator to the end.
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
iterator
|
|
|
|
end() noexcept
|
|
|
|
{
|
|
|
|
return &data()[size()];
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns an iterator to the end.
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
const_iterator
|
|
|
|
end() const noexcept
|
|
|
|
{
|
|
|
|
return &data()[size()];
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns an iterator to the end.
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
const_iterator
|
|
|
|
cend() const noexcept
|
|
|
|
{
|
|
|
|
return &data()[size()];
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns a reverse iterator to the beginning.
|
2019-12-16 13:56:16 -05:00
|
|
|
BOOST_STATIC_STRING_CPP17_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
reverse_iterator
|
|
|
|
rbegin() noexcept
|
|
|
|
{
|
|
|
|
return reverse_iterator{end()};
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns a reverse iterator to the beginning.
|
2019-12-16 13:56:16 -05:00
|
|
|
BOOST_STATIC_STRING_CPP17_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
const_reverse_iterator
|
|
|
|
rbegin() const noexcept
|
|
|
|
{
|
|
|
|
return const_reverse_iterator{cend()};
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns a reverse iterator to the beginning.
|
2019-12-16 13:56:16 -05:00
|
|
|
BOOST_STATIC_STRING_CPP17_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
const_reverse_iterator
|
|
|
|
crbegin() const noexcept
|
|
|
|
{
|
|
|
|
return const_reverse_iterator{cend()};
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns a reverse iterator to the end.
|
2019-12-16 13:56:16 -05:00
|
|
|
BOOST_STATIC_STRING_CPP17_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
reverse_iterator
|
|
|
|
rend() noexcept
|
|
|
|
{
|
|
|
|
return reverse_iterator{begin()};
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns a reverse iterator to the end.
|
2019-12-16 13:56:16 -05:00
|
|
|
BOOST_STATIC_STRING_CPP17_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
const_reverse_iterator
|
|
|
|
rend() const noexcept
|
|
|
|
{
|
|
|
|
return const_reverse_iterator{cbegin()};
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns a reverse iterator to the end.
|
2019-12-16 13:56:16 -05:00
|
|
|
BOOST_STATIC_STRING_CPP17_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
const_reverse_iterator
|
|
|
|
crend() const noexcept
|
|
|
|
{
|
|
|
|
return const_reverse_iterator{cbegin()};
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Capacity
|
|
|
|
//
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
|
|
/// Returns `true` if the string is empty.
|
|
|
|
BOOST_STATIC_STRING_NODISCARD
|
|
|
|
BOOST_STATIC_STRING_CPP11_CONSTEXPR
|
|
|
|
bool
|
|
|
|
empty() const noexcept
|
|
|
|
{
|
|
|
|
return size() == 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns the number of characters, excluding the null terminator.
|
|
|
|
BOOST_STATIC_STRING_CPP11_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
size() const noexcept
|
|
|
|
{
|
|
|
|
return this->size_impl();
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Returns the number of characters, excluding the null terminator
|
|
|
|
|
|
|
|
Equivalent to calling `size()`.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP11_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
length() const noexcept
|
|
|
|
{
|
|
|
|
return size();
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns the maximum number of characters that can be stored, excluding the null terminator.
|
|
|
|
BOOST_STATIC_STRING_CPP11_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
max_size() const noexcept
|
|
|
|
{
|
|
|
|
return N;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Reserve space for `n` characters, excluding the null terminator
|
|
|
|
|
|
|
|
This function has no effect when `n <= max_size()`.
|
|
|
|
|
|
|
|
@throw std::length_error if `n > max_size()`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
void
|
2019-12-26 17:22:57 -05:00
|
|
|
reserve(std::size_t n) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Returns the number of characters that can be held in currently allocated storage.
|
|
|
|
|
|
|
|
This function always returns `max_size()`.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP11_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
capacity() const noexcept
|
|
|
|
{
|
|
|
|
return max_size();
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Reduces memory usage by freeing unused memory.
|
|
|
|
|
|
|
|
This function call has no effect.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
void
|
|
|
|
shrink_to_fit() noexcept
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Operations
|
|
|
|
//
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
|
|
/// Clears the contents
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
void
|
|
|
|
clear() noexcept;
|
|
|
|
|
|
|
|
/** Insert into the string.
|
|
|
|
|
|
|
|
Inserts `count` copies of character `ch` at the position `index`
|
|
|
|
|
|
|
|
@throw std::out_of_range if `index > size()`
|
2019-12-16 16:56:19 -05:00
|
|
|
@throw std::length_error if `count > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
insert(
|
|
|
|
size_type index,
|
|
|
|
size_type count,
|
2019-12-30 16:44:17 -05:00
|
|
|
CharT ch) BOOST_STATIC_STRING_COND_NOEXCEPT
|
|
|
|
{
|
|
|
|
BOOST_STATIC_STRING_THROW_IF(
|
|
|
|
index > size(), std::out_of_range{"index > size()"});
|
|
|
|
insert(begin() + index, count, ch);
|
|
|
|
return *this;
|
|
|
|
}
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Insert into the string.
|
|
|
|
|
|
|
|
Inserts null-terminated string pointed to by `s` at the position `index`
|
|
|
|
|
|
|
|
@throw std::out_of_range if `index > size()`
|
2019-12-16 16:56:19 -05:00
|
|
|
@throw std::length_error if `count > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
insert(
|
|
|
|
size_type index,
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT const* s) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return insert(index, s, Traits::length(s));
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Insert into the string.
|
|
|
|
|
|
|
|
Inserts the characters in the range `(s, s+count)` at the position `index`
|
|
|
|
|
|
|
|
The inserted string can contain null characters.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `index > size()`
|
2019-12-16 16:56:19 -05:00
|
|
|
@throw std::length_error if `count > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
insert(
|
|
|
|
size_type index,
|
|
|
|
CharT const* s,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type count) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Insert into the string.
|
|
|
|
|
|
|
|
Inserts the contents of string view `sv` at the position `index`
|
|
|
|
|
|
|
|
The inserted string can contain null characters.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `index > size()`
|
2019-12-16 16:56:19 -05:00
|
|
|
@throw std::length_error if `sv.size() > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
insert(
|
|
|
|
size_type index,
|
2019-12-26 17:22:57 -05:00
|
|
|
string_view_type sv) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return insert(index, sv.data(), sv.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Insert into the string.
|
|
|
|
|
|
|
|
Inserts the string `sv.substr(index_str, count)` at the position `index`
|
|
|
|
|
|
|
|
The inserted string can contain null characters.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `index > size() || index_str > sv.size()`
|
2019-12-16 16:56:19 -05:00
|
|
|
@throw std::length_error if `sv.substr(index_str, count).size() > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
insert(
|
|
|
|
size_type index,
|
|
|
|
string_view_type sv,
|
|
|
|
size_type index_str,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type count = npos) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return insert(index, sv.substr(index_str, count));
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Insert into the string.
|
|
|
|
|
|
|
|
Inserts character `ch` before the character (if any) pointed by `pos`
|
|
|
|
|
|
|
|
The inserted character can be null.
|
|
|
|
|
2019-12-16 16:56:19 -05:00
|
|
|
@throw std::length_error if `1 > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return An iterator to the first inserted character or pos if no insertion took place
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
iterator
|
|
|
|
insert(
|
|
|
|
const_iterator pos,
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT ch) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return insert(pos, 1, ch);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Insert into the string.
|
|
|
|
|
|
|
|
Inserts `count` copies of character `ch` before the character (if any) pointed by `pos`
|
|
|
|
|
|
|
|
The inserted characters can be null.
|
|
|
|
|
2019-12-16 16:56:19 -05:00
|
|
|
@throw std::length_error if `count > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return An iterator to the first inserted character or pos if no insertion took place
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
iterator
|
|
|
|
insert(
|
|
|
|
const_iterator pos,
|
|
|
|
size_type count,
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT ch) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Insert into the string.
|
|
|
|
|
|
|
|
Inserts characters from the range `(first, last)` before the element (if any) pointed by `pos`
|
|
|
|
|
|
|
|
The inserted string can contain null characters.
|
|
|
|
This function does not participate in overload resolution if
|
|
|
|
`InputIterator` does not satisfy <em>LegacyInputIterator</em>
|
|
|
|
|
2019-12-16 16:56:19 -05:00
|
|
|
@throw std::length_error if `std::distance(first, last) > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return An iterator to the first inserted character or pos if no insertion took place
|
|
|
|
*/
|
|
|
|
template<typename InputIterator>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
#if GENERATING_DOCUMENTATION
|
|
|
|
iterator
|
|
|
|
#else
|
|
|
|
typename std::enable_if<
|
2019-12-30 21:12:20 -05:00
|
|
|
detail::is_input_iterator<
|
|
|
|
InputIterator>::value &&
|
|
|
|
! detail::is_forward_iterator<
|
|
|
|
InputIterator>::value, iterator>::type
|
2019-12-16 12:23:46 -05:00
|
|
|
#endif
|
|
|
|
insert(
|
|
|
|
const_iterator pos,
|
|
|
|
InputIterator first,
|
2019-12-26 17:22:57 -05:00
|
|
|
InputIterator last) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
2019-12-30 21:12:20 -05:00
|
|
|
/** Insert into the string.
|
|
|
|
|
|
|
|
Inserts characters from the range `(first, last)` before the element (if any) pointed by `pos`
|
|
|
|
|
|
|
|
The inserted string can contain null characters.
|
|
|
|
This function does not participate in overload resolution if
|
|
|
|
`LegacyForwardIterator` does not satisfy <em>LegacyForwardIterator</em>
|
|
|
|
|
|
|
|
@throw std::length_error if `std::distance(first, last) > max_size() - size()`
|
|
|
|
@return An iterator to the first inserted character or pos if no insertion took place
|
|
|
|
*/
|
|
|
|
template<typename ForwardIterator>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
#if GENERATING_DOCUMENTATION
|
|
|
|
iterator
|
|
|
|
#else
|
|
|
|
typename std::enable_if<
|
|
|
|
detail::is_forward_iterator<
|
|
|
|
ForwardIterator>::value,
|
|
|
|
iterator>::type
|
|
|
|
#endif
|
|
|
|
insert(
|
|
|
|
const_iterator pos,
|
|
|
|
ForwardIterator first,
|
|
|
|
ForwardIterator last) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
|
|
|
|
2019-12-16 12:23:46 -05:00
|
|
|
/** Insert into the string.
|
|
|
|
|
|
|
|
Inserts elements from initializer list `ilist` before the element (if any) pointed by `pos`
|
|
|
|
|
|
|
|
The inserted string can contain null characters.
|
|
|
|
|
2019-12-16 16:56:19 -05:00
|
|
|
@throw std::length_error if `ilist.size() > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return An iterator to the first inserted character or pos if no insertion took place
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-30 21:12:20 -05:00
|
|
|
iterator
|
|
|
|
insert(
|
2019-12-16 12:23:46 -05:00
|
|
|
const_iterator pos,
|
2019-12-30 16:44:17 -05:00
|
|
|
std::initializer_list<CharT> ilist) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Insert into the string.
|
|
|
|
|
2019-12-16 18:19:01 -05:00
|
|
|
Inserts elements from `string_view_type{t}` at the position `index`
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
The inserted string can contain null characters.
|
|
|
|
This function participates in overload resolution if
|
|
|
|
`T` is convertible to `string_view` and `T` is not
|
|
|
|
convertible to `CharT const*`.
|
|
|
|
|
2019-12-16 18:19:01 -05:00
|
|
|
@throw std::length_error if `string_view_type{t}.substr(index_str, count).size() > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
template<typename T>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
#if GENERATING_DOCUMENTATION
|
|
|
|
basic_static_string&
|
|
|
|
#else
|
|
|
|
typename std::enable_if<
|
|
|
|
std::is_convertible<
|
|
|
|
T const&, string_view_type>::value &&
|
|
|
|
! std::is_convertible<
|
|
|
|
T const&, CharT const*>::value,
|
|
|
|
basic_static_string&>::type
|
|
|
|
#endif
|
|
|
|
insert(
|
|
|
|
size_type index,
|
2019-12-30 16:44:17 -05:00
|
|
|
T const& t) BOOST_STATIC_STRING_COND_NOEXCEPT
|
|
|
|
{
|
|
|
|
return insert(index, t, 0, npos);
|
|
|
|
}
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Insert into the string.
|
|
|
|
|
2019-12-16 18:19:01 -05:00
|
|
|
Inserts elements from `string_view_type{t}.substr(index_str, count)` at the position `index`
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
The inserted string can contain null characters.
|
|
|
|
This function participates in overload resolution if
|
|
|
|
`T` is convertible to `string_view` and `T` is not
|
|
|
|
convertible to `CharT const*`.
|
|
|
|
|
2019-12-16 18:19:01 -05:00
|
|
|
@throw std::out_of_range if `index_str > string_view_type{t}.size()`
|
|
|
|
@throw std::length_error if `string_view_type{t}.substr(index_str, count).size() > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
template<typename T>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
#if GENERATING_DOCUMENTATION
|
|
|
|
basic_static_string&
|
|
|
|
#else
|
|
|
|
typename std::enable_if<
|
|
|
|
std::is_convertible<T const&, string_view_type>::value &&
|
|
|
|
! std::is_convertible<T const&, CharT const*>::value,
|
|
|
|
basic_static_string&>::type
|
|
|
|
#endif
|
|
|
|
insert(
|
|
|
|
size_type index,
|
|
|
|
T const& t,
|
|
|
|
size_type index_str,
|
2019-12-30 16:44:17 -05:00
|
|
|
size_type count = npos) BOOST_STATIC_STRING_COND_NOEXCEPT
|
|
|
|
{
|
|
|
|
auto const s = string_view_type(t).substr(index_str, count);
|
|
|
|
return insert(index, s.data(), s.size());
|
|
|
|
}
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Removes `min(count, size() - index)` characters starting at `index`
|
|
|
|
|
|
|
|
@throw std::out_of_range if `index > size()`
|
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
erase(
|
|
|
|
size_type index = 0,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type count = npos) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Removes the character at `pos`
|
|
|
|
|
|
|
|
@return iterator pointing to the character immediately following the character erased, or `end()` if no such character exists
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
iterator
|
|
|
|
erase(
|
2019-12-26 17:22:57 -05:00
|
|
|
const_iterator pos) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Removes the characters in the range `(first, last)`
|
|
|
|
|
|
|
|
@return iterator pointing to the character last pointed to before the erase, or `end()` if no such character exists
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
iterator
|
|
|
|
erase(
|
|
|
|
const_iterator first,
|
2019-12-26 17:22:57 -05:00
|
|
|
const_iterator last) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Appends the given character `ch` to the end of the string.
|
|
|
|
|
2019-12-16 16:56:19 -05:00
|
|
|
@throw std::length_error if `1 > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
void
|
|
|
|
push_back(
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT ch) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Removes the last character from the string
|
|
|
|
|
|
|
|
The behavior is undefined if the string is empty.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
void
|
|
|
|
pop_back() noexcept
|
|
|
|
{
|
|
|
|
BOOST_STATIC_STRING_ASSERT(size() > 0);
|
|
|
|
this->set_size(size() - 1);
|
|
|
|
term();
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Appends `count` copies of character `ch`
|
|
|
|
|
|
|
|
The appended characters may be null.
|
|
|
|
|
2019-12-16 16:56:19 -05:00
|
|
|
@throw std::length_error if `count > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
append(
|
|
|
|
size_type count,
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT ch) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return insert(size(), count, ch);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Append to the string.
|
|
|
|
|
|
|
|
Appends the contents of string view `sv`
|
|
|
|
|
|
|
|
The appended string can contain null characters.
|
|
|
|
|
2019-12-16 16:56:19 -05:00
|
|
|
@throw std::length_error if `sv.size() > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
append(
|
2019-12-26 17:22:57 -05:00
|
|
|
string_view_type sv) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
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()`
|
2019-12-16 16:56:19 -05:00
|
|
|
@throw std::length_error if `sv.substr(pos, count).size() > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
append(
|
|
|
|
string_view_type sv,
|
|
|
|
size_type pos,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type count = npos) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return append(sv.substr(pos, count));
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Append to the string.
|
|
|
|
|
|
|
|
Appends characters in the range `(s, s + count)`
|
|
|
|
|
|
|
|
The appended string can contain null characters.
|
|
|
|
|
2019-12-16 16:56:19 -05:00
|
|
|
@throw std::length_error if `count > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
append(
|
|
|
|
CharT const* s,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type count) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Append to the string.
|
|
|
|
|
|
|
|
Appends the null-terminated character string pointed to by `s`
|
|
|
|
|
|
|
|
The length of the string is determined by the first
|
|
|
|
null character using `Traits::length(s)`.
|
|
|
|
|
2019-12-16 16:56:19 -05:00
|
|
|
@throw std::length_error if `Traits::length(s) > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
append(
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT const* s) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return append(s, Traits::length(s));
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Append to the string.
|
|
|
|
|
|
|
|
Appends characters from the range `(first, last)`
|
|
|
|
|
|
|
|
The inserted string can contain null characters.
|
|
|
|
This function does not participate in overload resolution if
|
|
|
|
`InputIterator` does not satisfy <em>LegacyInputIterator</em>
|
|
|
|
|
2019-12-16 16:56:19 -05:00
|
|
|
@throw std::length_error if `std::distance(first, last) > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
template<typename InputIterator>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
#if GENERATING_DOCUMENTATION
|
|
|
|
basic_static_string&
|
|
|
|
#else
|
|
|
|
typename std::enable_if<
|
|
|
|
detail::is_input_iterator<InputIterator>::value,
|
|
|
|
basic_static_string&>::type
|
|
|
|
#endif
|
|
|
|
append(
|
|
|
|
InputIterator first,
|
2019-12-26 17:22:57 -05:00
|
|
|
InputIterator last) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
insert(end(), first, last);
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Append to the string.
|
|
|
|
|
|
|
|
Appends characters from initializer list `ilist`
|
|
|
|
|
|
|
|
The appended string can contain null characters.
|
|
|
|
|
2019-12-16 16:56:19 -05:00
|
|
|
@throw std::length_error if `ilist.size() > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
append(
|
2019-12-26 17:22:57 -05:00
|
|
|
std::initializer_list<CharT> ilist) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
insert(end(), ilist);
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Append to the string.
|
|
|
|
|
2019-12-16 18:19:01 -05:00
|
|
|
Appends characters from `string_view_type{t}`
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
The appended string can contain null characters.
|
|
|
|
This function participates in overload resolution if
|
|
|
|
`T` is convertible to `string_view` and `T` is not
|
|
|
|
convertible to `CharT const*`.
|
|
|
|
|
2019-12-16 18:19:01 -05:00
|
|
|
@throw std::length_error if `string_view_type{t}.size() > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
template<typename T>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
#if GENERATING_DOCUMENTATION
|
|
|
|
basic_static_string&
|
|
|
|
#else
|
|
|
|
typename std::enable_if<
|
|
|
|
std::is_convertible<
|
|
|
|
T const&, string_view_type>::value &&
|
|
|
|
! std::is_convertible<
|
|
|
|
T const&, CharT const*>::value,
|
|
|
|
basic_static_string&>::type
|
|
|
|
#endif
|
|
|
|
append(
|
2019-12-26 17:22:57 -05:00
|
|
|
T const& t) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
2019-12-16 18:19:01 -05:00
|
|
|
return append(string_view_type{t});
|
2019-12-16 12:23:46 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/** Append to the string.
|
|
|
|
|
2019-12-16 18:19:01 -05:00
|
|
|
Appends characters from `string_view_type{t}.substr{pos, count}`
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
The appended string can contain null characters.
|
|
|
|
This function participates in overload resolution if
|
2019-12-16 18:19:01 -05:00
|
|
|
`T` is convertible to `string_view_type` and `T` is not
|
2019-12-16 12:23:46 -05:00
|
|
|
convertible to `CharT const*`.
|
|
|
|
|
2019-12-16 18:19:01 -05:00
|
|
|
@throw std::out_of_range if `pos > string_view_type{t}.size()`
|
|
|
|
@throw std::length_error if `string_view_type{t}.substr(pos, count).size() > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
template<typename T>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
#if GENERATING_DOCUMENTATION
|
|
|
|
basic_static_string&
|
|
|
|
#else
|
|
|
|
typename std::enable_if<
|
|
|
|
std::is_convertible<
|
|
|
|
T const&, string_view_type>::value &&
|
|
|
|
! std::is_convertible<
|
|
|
|
T const&, CharT const*>::value,
|
|
|
|
basic_static_string&>::type
|
|
|
|
#endif
|
|
|
|
append(
|
|
|
|
T const& t,
|
|
|
|
size_type pos,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type count = npos) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
2019-12-16 18:19:01 -05:00
|
|
|
return append(string_view_type{t}.substr(pos, count));
|
2019-12-16 12:23:46 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/** Append to the string.
|
|
|
|
|
2019-12-16 16:56:19 -05:00
|
|
|
@throw std::length_error if `s.size() > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
*/
|
|
|
|
template<std::size_t M>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
operator+=(
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<M, CharT, Traits> const& s) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return append(s.data(), s.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Append to the string.
|
|
|
|
|
|
|
|
Appends the given character `ch` to the end of the string.
|
|
|
|
|
2019-12-16 16:56:19 -05:00
|
|
|
@throw std::length_error if `1 > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
operator+=(
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT ch) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
push_back(ch);
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Append to the string.
|
|
|
|
|
|
|
|
Appends the null-terminated character string pointed to by `s`
|
|
|
|
|
|
|
|
The length of the string is determined by the first
|
|
|
|
null character using `Traits::length(s)`.
|
|
|
|
|
2019-12-16 16:56:19 -05:00
|
|
|
@throw std::length_error if `Traits::length(s) > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
operator+=(
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT const* s) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return append(s);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Append to the string.
|
|
|
|
|
|
|
|
Appends characters from initializer list `ilist`
|
|
|
|
|
|
|
|
The appended string can contain null characters.
|
|
|
|
|
2019-12-16 16:56:19 -05:00
|
|
|
@throw std::length_error if `ilist.size() > max_size() - size()`
|
2019-12-16 12:23:46 -05:00
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
operator+=(
|
2019-12-26 17:22:57 -05:00
|
|
|
std::initializer_list<CharT> ilist) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return append(ilist);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Append to the string.
|
|
|
|
|
|
|
|
Appends a copy of the characters from `string_view_type{t}`
|
|
|
|
|
|
|
|
The appended string can contain null characters.
|
|
|
|
This function participates in overload resolution if
|
2019-12-16 18:19:01 -05:00
|
|
|
`T` is convertible to `string_view_type` and `T` is not
|
2019-12-16 12:23:46 -05:00
|
|
|
convertible to `CharT const*`.
|
|
|
|
|
|
|
|
@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, CharT const*>::value,
|
|
|
|
basic_static_string&>::type
|
|
|
|
#endif
|
|
|
|
operator+=(
|
2019-12-26 17:22:57 -05:00
|
|
|
T const& t) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return append(t);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Compare the string with another.
|
|
|
|
|
|
|
|
Compares this string to `s`.
|
|
|
|
*/
|
|
|
|
template<std::size_t M>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
int
|
|
|
|
compare(
|
|
|
|
basic_static_string<M, CharT, Traits> const& s) const noexcept
|
|
|
|
{
|
|
|
|
return detail::lexicographical_compare<CharT, Traits>(
|
|
|
|
data(), size(), s.data(), s.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Compare the string with another.
|
|
|
|
|
|
|
|
Compares a `[pos1, pos1+count1)` substring of this string to `s`. If `count1 > size() - pos1` the substring is `[pos1, size())`.
|
|
|
|
*/
|
|
|
|
template<std::size_t M>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
int
|
|
|
|
compare(
|
|
|
|
size_type pos1,
|
|
|
|
size_type count1,
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<M, CharT, Traits> const& s) const BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return detail::lexicographical_compare<CharT, Traits>(
|
|
|
|
subview(pos1, count1), s.data(), s.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Compare the string with another.
|
|
|
|
|
|
|
|
Compares a `[pos1, pos1+count1)` substring of this string to a substring `[pos2, pos2+count2)` of `s`.
|
|
|
|
If `count1 > size() - pos1` the first substring is `[pos1, size())`. Likewise, if `count2 > s.size() - pos2` the
|
|
|
|
second substring is `[pos2, s.size())`.
|
|
|
|
*/
|
|
|
|
template<std::size_t M>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
int
|
|
|
|
compare(
|
|
|
|
size_type pos1,
|
|
|
|
size_type count1,
|
|
|
|
basic_static_string<M, CharT, Traits> const& s,
|
|
|
|
size_type pos2,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type count2 = npos) const BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return detail::lexicographical_compare(
|
|
|
|
subview(pos1, count1), s.subview(pos2, count2));
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Compare the string with another.
|
|
|
|
|
|
|
|
Compares this string to the null-terminated character sequence beginning at the character pointed to by `s` with length `Traits::length(s)`.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
int
|
|
|
|
compare(
|
|
|
|
CharT const* s) const noexcept
|
|
|
|
{
|
|
|
|
return detail::lexicographical_compare<CharT, Traits>(
|
|
|
|
data(), size(), s, Traits::length(s));
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Compare the string with another.
|
|
|
|
|
|
|
|
Compares a `[pos1, pos1+count1)` substring of this string to the null-terminated character sequence beginning at the character pointed to by `s` with
|
|
|
|
length `Traits::length(s)`. If `count1 > size() - pos1` the substring is `[pos1, size())`.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
int
|
|
|
|
compare(
|
|
|
|
size_type pos1,
|
|
|
|
size_type count1,
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT const* s) const BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return detail::lexicographical_compare<CharT, Traits>(
|
|
|
|
subview(pos1, count1), s, Traits::length(s));
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Compare the string with another.
|
|
|
|
|
|
|
|
Compares a `[pos1, pos1+count1)` substring of this string to the characters in the range `[s, s + count2)`. If `count1 > size() - pos1` the substring is `[pos1, size())`.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
int
|
|
|
|
compare(
|
|
|
|
size_type pos1,
|
|
|
|
size_type count1,
|
|
|
|
CharT const* s,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type count2) const BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return detail::lexicographical_compare<CharT, Traits>(
|
|
|
|
subview(pos1, count1), s, count2);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Compare the string with another.
|
|
|
|
|
|
|
|
Compares this string to `s`.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
int
|
|
|
|
compare(
|
|
|
|
string_view_type s) const noexcept
|
|
|
|
{
|
|
|
|
return detail::lexicographical_compare<CharT, Traits>(
|
|
|
|
data(), size(), s.data(), s.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Compare the string with another.
|
|
|
|
|
|
|
|
Compares a `[pos1, pos1+count1)` substring of this string to `s`. If `count1 > size() - pos1` the substring is `[pos1, size())`.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
int
|
|
|
|
compare(
|
|
|
|
size_type pos1,
|
|
|
|
size_type count1,
|
2019-12-26 17:22:57 -05:00
|
|
|
string_view_type s) const BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return detail::lexicographical_compare<CharT, Traits>(
|
|
|
|
subview(pos1, count1), s);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Compare the string with another.
|
|
|
|
|
|
|
|
Replaces the part of the string indicated by `[pos1, pos1 + count1)` with a substring `[pos2, pos2 + count2)` of `t` after converting to `string_view_type`.
|
|
|
|
|
|
|
|
This function participates in overload resolution if
|
|
|
|
`T` is convertible to `string_view` and `T` is not
|
|
|
|
convertible to `CharT const*`.
|
|
|
|
*/
|
|
|
|
template<typename T>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
#if GENERATING_DOCUMENTATION
|
|
|
|
int
|
|
|
|
#else
|
|
|
|
typename std::enable_if<
|
|
|
|
std::is_convertible<T const&, string_view_type>::value &&
|
|
|
|
! std::is_convertible<T const&, CharT const*>::value,
|
|
|
|
int>::type
|
|
|
|
#endif
|
|
|
|
compare(
|
|
|
|
size_type pos1,
|
|
|
|
size_type count1,
|
|
|
|
T const& t,
|
|
|
|
size_type pos2,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type count2 = npos) const BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return compare(pos1, count1,
|
|
|
|
string_view_type(t).substr(pos2, count2));
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Returns a substring.
|
|
|
|
|
|
|
|
Returns a substring `(pos, pos + count)`. If the requested substring is greater than the size of the string, the returned substring is `[pos, size())`.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `pos > size()`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string
|
|
|
|
substr(
|
|
|
|
size_type pos = 0,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type count = npos) const BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Returns a view of a substring.
|
|
|
|
|
|
|
|
Returns a view of a substring `(pos, pos + count)`. If the requested view is greater than the size of the string, the returned view is `[pos, size())`.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `pos > size()`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
string_view_type
|
|
|
|
subview(
|
|
|
|
size_type pos = 0,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type count = npos) const BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Copy a substring.
|
|
|
|
|
|
|
|
Copy a substring `(pos, pos+count)` to character string pointed to by `dest`.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
copy(
|
|
|
|
CharT* dest,
|
|
|
|
size_type count,
|
|
|
|
size_type pos = 0) const noexcept;
|
|
|
|
|
|
|
|
/** Changes the number of characters stored.
|
|
|
|
|
|
|
|
If the resulting string is larger, the new
|
|
|
|
characters are uninitialized.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
void
|
|
|
|
resize(
|
2019-12-26 17:22:57 -05:00
|
|
|
std::size_t n) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Changes the number of characters stored.
|
|
|
|
|
|
|
|
If the resulting string is larger, the new
|
|
|
|
characters are initialized to the value of `c`.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
void
|
|
|
|
resize(
|
|
|
|
std::size_t n,
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT c) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/// Exchange the contents of this string with another.
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
void
|
|
|
|
swap(
|
|
|
|
basic_static_string& s) noexcept;
|
|
|
|
|
|
|
|
/// Exchange the contents of this string with another.
|
|
|
|
template<std::size_t M>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
void
|
|
|
|
swap(
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<M, CharT, Traits>& s) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Replace a subset of the string.
|
|
|
|
|
2020-01-01 15:38:41 -05:00
|
|
|
Replaces the part of the string indicated by `[pos1, pos1 + n1)` with `s`. This replacement is done unchecked.
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
@throw std::out_of_range if `pos1 > size()`
|
|
|
|
@throw std::length_error if the resulting string exceeds `max_size()`
|
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
template<size_t M>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
replace(
|
|
|
|
size_type pos1,
|
|
|
|
size_type n1,
|
2019-12-26 17:22:57 -05:00
|
|
|
const basic_static_string<M, CharT, Traits>& str) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
2020-01-01 15:01:39 -05:00
|
|
|
return replace_unchecked(pos1, n1, str.data(), str.size());
|
2019-12-16 12:23:46 -05:00
|
|
|
}
|
|
|
|
|
2020-01-01 15:38:41 -05:00
|
|
|
/** Replace a subset of the string.
|
|
|
|
|
|
|
|
Replaces the part of the string indicated by `[pos1, pos1 + n1)` with `s`.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `pos1 > size()`
|
|
|
|
@throw std::length_error if the resulting string exceeds `max_size()`
|
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
replace(
|
|
|
|
size_type pos1,
|
|
|
|
size_type n1,
|
|
|
|
const basic_static_string& str) BOOST_STATIC_STRING_COND_NOEXCEPT
|
|
|
|
{
|
|
|
|
return replace(pos1, n1, str.data(), str.size());
|
|
|
|
}
|
|
|
|
|
2019-12-16 12:23:46 -05:00
|
|
|
/** Replace a subset of the string.
|
|
|
|
|
|
|
|
Replaces the part of the string indicated by `[pos1, pos1 + n1)` with substring `[pos2, pos2 + n2)` of `str`
|
|
|
|
except that if `n2` is greater than `str.size()`, `[pos2, pos2 + str.size())` is used.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `pos1 > size()`
|
|
|
|
@throw std::length_error if the resulting string exceeds `max_size()`
|
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
replace(
|
|
|
|
size_type pos1,
|
|
|
|
size_type n1,
|
|
|
|
const basic_static_string& str,
|
|
|
|
size_type pos2,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type n2 = npos) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return replace(pos1, n1, str.subview(pos2, n2));
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Replace a subset of the string.
|
|
|
|
|
|
|
|
Replaces the part of the string indicated by `[pos1, pos1 + n1)` with `t` after converting to `string_view_type`.
|
|
|
|
|
|
|
|
This function participates in overload resolution if
|
|
|
|
`T` is convertible to `string_view` and `T` is not
|
|
|
|
convertible to `CharT const*`.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `pos1 > size()`
|
|
|
|
@throw std::length_error if the resulting string exceeds `max_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<T, string_view_type>::value &&
|
|
|
|
! std::is_convertible<T, CharT const*>::value,
|
|
|
|
basic_static_string&>::type
|
|
|
|
#endif
|
|
|
|
replace(
|
|
|
|
size_type pos1,
|
|
|
|
size_type n1,
|
2019-12-26 17:22:57 -05:00
|
|
|
const T& t) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
string_view_type sv = t;
|
|
|
|
return replace(pos1, n1, sv.data(), sv.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Replace a subset of the string.
|
|
|
|
|
|
|
|
Replaces the part of the string indicated by `[pos1, pos1 + n1)` with substring `[pos2, pos2 + n2)` of `t`
|
|
|
|
after converting to `string_view_type`, except that if `n2` is greater than `t.size()`, `[pos2, pos2 + t.size())` is used.
|
|
|
|
|
|
|
|
This function participates in overload resolution if
|
|
|
|
`T` is convertible to `string_view` and `T` is not
|
|
|
|
convertible to `CharT const*`.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `pos1 > size()`
|
|
|
|
@throw std::length_error if the resulting string exceeds `max_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<T, string_view_type>::value &&
|
|
|
|
! std::is_convertible<T, CharT const*>::value,
|
|
|
|
basic_static_string&>::type
|
|
|
|
#endif
|
|
|
|
replace(
|
|
|
|
size_type pos1,
|
|
|
|
size_type n1,
|
|
|
|
const T& t,
|
|
|
|
size_type pos2,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type n2 = npos) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
string_view_type sv = t;
|
|
|
|
return replace(pos1, n1, sv.substr(pos2, n2));
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Replace a subset of the string.
|
|
|
|
|
|
|
|
Replaces the part of the string indicated by `[pos1, pos1 + n1)` with the characters in the range `[s, s + n2)`.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `pos1 > size()`
|
|
|
|
@throw std::length_error if the resulting string exceeds `max_size()`
|
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
replace(
|
|
|
|
size_type pos,
|
|
|
|
size_type n1,
|
|
|
|
const CharT* s,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type n2) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
|
|
|
|
/** Replace a subset of the string.
|
|
|
|
|
|
|
|
Replaces the part of the string indicated by `[pos1, pos1 + n1)` with the characters in the range `[s, s + Traits::length(s))`.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `pos1 > size()`
|
|
|
|
@throw std::length_error if the resulting string exceeds `max_size()`
|
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
replace(
|
|
|
|
size_type pos,
|
|
|
|
size_type n1,
|
2019-12-26 17:22:57 -05:00
|
|
|
const CharT* s) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return replace(pos, n1, s, Traits::length(s));
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Replace a subset of the string.
|
|
|
|
|
|
|
|
Replaces the part of the string indicated by `[pos1, pos1 + n1)` with `n2` copies of `c`.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `pos1 > size()`
|
|
|
|
@throw std::length_error if the resulting string exceeds `max_size()`
|
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
replace(
|
|
|
|
size_type pos,
|
|
|
|
size_type n1,
|
|
|
|
size_type n2,
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT c) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
/** Replace a subset of the string.
|
|
|
|
|
|
|
|
Replaces the part of the string indicated by `[i1, i2)` with `s`
|
|
|
|
|
|
|
|
@throw std::out_of_range if `pos1 > size()`
|
|
|
|
@throw std::length_error if the resulting string exceeds `max_size()`
|
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
replace(
|
|
|
|
const_iterator i1,
|
|
|
|
const_iterator i2,
|
2019-12-26 17:22:57 -05:00
|
|
|
const basic_static_string& str) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return replace(i1, i2, str.data(), str.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Replace a subset of the string.
|
|
|
|
|
|
|
|
Replaces the part of the string indicated by `[i1, i2)` with `t` after converting to `string_view_type`.
|
|
|
|
|
|
|
|
This function participates in overload resolution if
|
|
|
|
`T` is convertible to `string_view` and `T` is not
|
|
|
|
convertible to `CharT const*`.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `i1` and `i2` do not refer to elements within the range `[0, size())`
|
|
|
|
@throw std::length_error if the resulting string exceeds `max_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<T, string_view_type>::value &&
|
|
|
|
! std::is_convertible<T, CharT const*>::value,
|
|
|
|
basic_static_string&>::type
|
|
|
|
#endif
|
|
|
|
replace(
|
|
|
|
const_iterator i1,
|
|
|
|
const_iterator i2,
|
2019-12-26 17:22:57 -05:00
|
|
|
const T& t) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
string_view_type sv = t;
|
|
|
|
return replace(i1 - begin(), i2 - i1, sv.data(), sv.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Replace a subset of the string.
|
|
|
|
|
|
|
|
Replaces the part of the string indicated by `[i1, i2)` with the characters in the range `[s, s + n)`.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `i1` and `i2` do not refer to elements within the range `[0, size())`
|
|
|
|
@throw std::length_error if the resulting string exceeds `max_size()`
|
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
replace(
|
|
|
|
const_iterator i1,
|
|
|
|
const_iterator i2,
|
|
|
|
const CharT* s,
|
2019-12-26 17:22:57 -05:00
|
|
|
size_type n) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return replace(i1 - begin(), i2 - i1, s, n);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Replace a subset of the string.
|
|
|
|
|
|
|
|
Replaces the part of the string indicated by `[i1, i2)` with the characters in the range `[s, s + Traits::length(s))`.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `i1` and `i2` do not refer to elements within the range `[0, size())`
|
|
|
|
@throw std::length_error if the resulting string exceeds `max_size()`
|
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
replace(
|
|
|
|
const_iterator i1,
|
|
|
|
const_iterator i2,
|
2019-12-26 17:22:57 -05:00
|
|
|
const CharT* s) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return replace(i1, i2, s, Traits::length(s));
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Replace a subset of the string.
|
|
|
|
|
|
|
|
Replaces the part of the string indicated by `[i1, i2)` with `n` copies of `c`.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `i1` and `i2` do not refer to elements within the range `[0, size())`
|
|
|
|
@throw std::length_error if the resulting string exceeds `max_size()`
|
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
replace(
|
|
|
|
const_iterator i1,
|
|
|
|
const_iterator i2,
|
|
|
|
size_type n,
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT c) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return replace(i1 - begin(), i2 - i1, n, c);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Replace a subset of the string.
|
|
|
|
|
|
|
|
Replaces the part of the string indicated by `[i1, i2)` with the characters in the range `[j1, j2)`.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `i1` and `i2` do not refer to elements within the range `[0, size())`
|
|
|
|
@throw std::length_error if the resulting string exceeds `max_size()`
|
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
template<typename InputIterator>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
#if GENERATING_DOCUMENTATION
|
|
|
|
basic_static_string&
|
|
|
|
#else
|
|
|
|
typename std::enable_if<
|
2019-12-30 21:12:20 -05:00
|
|
|
detail::is_input_iterator<
|
|
|
|
InputIterator>::value &&
|
|
|
|
! detail::is_forward_iterator<
|
|
|
|
InputIterator>::value,
|
|
|
|
basic_static_string<N, CharT, Traits>&>::type
|
2019-12-16 12:23:46 -05:00
|
|
|
#endif
|
|
|
|
replace(
|
|
|
|
const_iterator i1,
|
|
|
|
const_iterator i2,
|
|
|
|
InputIterator j1,
|
2019-12-30 16:44:17 -05:00
|
|
|
InputIterator j2) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
2019-12-30 21:12:20 -05:00
|
|
|
/** Replace a subset of the string.
|
|
|
|
|
|
|
|
Replaces the part of the string indicated by `[i1, i2)` with the characters in the range `[j1, j2)`.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `i1` and `i2` do not refer to elements within the range `[0, size())`
|
|
|
|
@throw std::length_error if the resulting string exceeds `max_size()`
|
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
template<typename ForwardIterator>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
#if GENERATING_DOCUMENTATION
|
|
|
|
basic_static_string&
|
|
|
|
#else
|
|
|
|
typename std::enable_if<
|
|
|
|
detail::is_forward_iterator<
|
|
|
|
ForwardIterator>::value,
|
|
|
|
basic_static_string<N, CharT, Traits>&>::type
|
|
|
|
#endif
|
|
|
|
replace(
|
|
|
|
const_iterator i1,
|
|
|
|
const_iterator i2,
|
|
|
|
ForwardIterator j1,
|
|
|
|
ForwardIterator j2) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
|
|
|
|
2019-12-16 12:23:46 -05:00
|
|
|
/** Replace a subset of the string.
|
|
|
|
|
|
|
|
Replaces the part of the string indicated by `[i1, i2)` with the characters in the initializer list `il`.
|
|
|
|
|
|
|
|
@throw std::out_of_range if `i1` and `i2` do not refer to elements within the range `[0, size())`
|
|
|
|
@throw std::length_error if the resulting string exceeds `max_size()`
|
|
|
|
@return `*this`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2020-01-01 15:01:39 -05:00
|
|
|
basic_static_string&
|
|
|
|
replace(
|
2019-12-16 12:23:46 -05:00
|
|
|
const_iterator i1,
|
|
|
|
const_iterator i2,
|
2020-01-01 15:01:39 -05:00
|
|
|
std::initializer_list<CharT> il) BOOST_STATIC_STRING_COND_NOEXCEPT
|
|
|
|
{
|
|
|
|
return replace_unchecked(i1 - begin(), i2 - i1, il.begin(), il.size());
|
|
|
|
}
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Search
|
|
|
|
//
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
|
|
/** Finds the first substring.
|
|
|
|
|
|
|
|
Finds the first substring equal to `t`.
|
|
|
|
|
|
|
|
This function participates in overload resolution if
|
|
|
|
`T` is convertible to `string_view` and `T` is not
|
|
|
|
convertible to `CharT const*`.
|
|
|
|
*/
|
|
|
|
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, CharT const*>::value,
|
|
|
|
size_type>::type
|
|
|
|
#endif
|
|
|
|
find(
|
|
|
|
const T& t,
|
2019-12-16 13:52:55 -05:00
|
|
|
size_type pos = 0) const noexcept(detail::is_nothrow_convertible<const T&,
|
|
|
|
string_view_type>::value)
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
string_view_type sv = t;
|
|
|
|
return find(sv.data(), pos, sv.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Finds the first substring.
|
|
|
|
|
|
|
|
Finds the first substring equal to `str`.
|
|
|
|
*/
|
|
|
|
template<std::size_t M>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
2020-01-03 16:59:34 -05:00
|
|
|
find(
|
2019-12-16 12:23:46 -05:00
|
|
|
const basic_static_string<M, CharT, Traits>& str,
|
|
|
|
size_type pos = 0) const noexcept
|
|
|
|
{
|
|
|
|
return find(str.data(), pos, str.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Finds the first substring.
|
|
|
|
|
|
|
|
Finds the first substring equal to the range `(s, s + count)`. This range may contain null characters.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
find(
|
|
|
|
const CharT* s,
|
|
|
|
size_type pos,
|
|
|
|
size_type n) const noexcept;
|
|
|
|
|
|
|
|
/** Finds the first substring.
|
|
|
|
|
|
|
|
Finds the first substring equal to the character
|
|
|
|
string pointed to by `s`.
|
|
|
|
|
|
|
|
The length of the string is determined by the first
|
|
|
|
null character using `Traits::length(s)`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
find(
|
|
|
|
const CharT* s,
|
|
|
|
size_type pos = 0) const noexcept
|
|
|
|
{
|
|
|
|
return find(s, pos, Traits::length(s));
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Finds the first character `c`.
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
find(
|
|
|
|
CharT c,
|
|
|
|
size_type pos = 0) const noexcept
|
|
|
|
{
|
|
|
|
return find(&c, pos, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** Finds the last substring.
|
|
|
|
|
|
|
|
Finds the last substring equal to `t`.
|
|
|
|
|
|
|
|
This function participates in overload resolution if
|
|
|
|
`T` is convertible to `string_view` and `T` is not
|
|
|
|
convertible to `CharT const*`.
|
|
|
|
*/
|
|
|
|
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, CharT const*>::value,
|
|
|
|
size_type>::type
|
|
|
|
#endif
|
|
|
|
rfind(
|
|
|
|
const T& t,
|
2019-12-16 13:52:55 -05:00
|
|
|
size_type pos = npos) const noexcept(detail::is_nothrow_convertible<const T&,
|
|
|
|
string_view_type>::value)
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
string_view_type sv = t;
|
|
|
|
return rfind(sv.data(), pos, sv.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Finds the last substring.
|
|
|
|
|
|
|
|
Finds the last substring equal to `str`.
|
|
|
|
*/
|
|
|
|
template<std::size_t M>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
rfind(
|
|
|
|
const basic_static_string<M, CharT, Traits>& str,
|
|
|
|
size_type pos = npos) const noexcept
|
|
|
|
{
|
|
|
|
return rfind(str.data(), pos, str.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Finds the last substring.
|
|
|
|
|
|
|
|
Finds the last substring equal to the range `(s, s + count)`. This range may contain null characters.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
rfind(
|
|
|
|
const CharT* s,
|
|
|
|
size_type pos,
|
|
|
|
size_type n) const noexcept;
|
|
|
|
|
|
|
|
/** Finds the last substring.
|
|
|
|
|
|
|
|
Finds the last substring equal to the character
|
|
|
|
string pointed to by `s`.
|
|
|
|
|
|
|
|
The length of the string is determined by the first
|
|
|
|
null character using `Traits::length(s)`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
rfind(
|
|
|
|
const CharT* s,
|
|
|
|
size_type pos = npos) const noexcept
|
|
|
|
{
|
|
|
|
return rfind(s, pos, Traits::length(s));
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Finds the last character `c`.
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
rfind(
|
|
|
|
CharT c,
|
|
|
|
size_type pos = npos) const noexcept
|
|
|
|
{
|
|
|
|
return rfind(&c, pos, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Finds the first character equal to any character in the string.
|
|
|
|
|
|
|
|
Finds the first character equal to one of the characters in `t`.
|
|
|
|
|
|
|
|
This function participates in overload resolution if
|
|
|
|
`T` is convertible to `string_view` and `T` is not
|
|
|
|
convertible to `CharT const*`.
|
|
|
|
*/
|
|
|
|
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, CharT const*>::value,
|
|
|
|
size_type>::type
|
|
|
|
#endif
|
|
|
|
find_first_of(
|
|
|
|
const T& t,
|
2019-12-16 13:52:55 -05:00
|
|
|
size_type pos = 0) const noexcept(detail::is_nothrow_convertible<const T&,
|
|
|
|
string_view_type>::value)
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
string_view_type sv = t;
|
|
|
|
return find_first_of(sv.data(), pos, sv.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Finds the first character equal to any character in the string.
|
|
|
|
|
|
|
|
Finds the first character equal to one of the characters in `str`.
|
|
|
|
*/
|
|
|
|
template<std::size_t M>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
find_first_of(
|
|
|
|
const basic_static_string<M, CharT, Traits>& str,
|
|
|
|
size_type pos = 0) const noexcept
|
|
|
|
{
|
|
|
|
return find_first_of(str.data(), pos, str.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Finds the first character equal to any character in the string.
|
|
|
|
|
|
|
|
Finds the first character equal to one of the characters in the range `(s, s + count)`. This range can include null characters.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
find_first_of(
|
|
|
|
const CharT* s,
|
|
|
|
size_type pos,
|
|
|
|
size_type n) const noexcept;
|
|
|
|
|
|
|
|
/** Finds the first character equal to any character in the string.
|
|
|
|
|
|
|
|
Finds the first character equal to one of the characters
|
|
|
|
in character string pointed to by `s`.
|
|
|
|
|
|
|
|
The length of the string is determined by the first
|
|
|
|
null character using `Traits::length(s)`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
find_first_of(
|
|
|
|
const CharT* s,
|
|
|
|
size_type pos = 0) const noexcept
|
|
|
|
{
|
|
|
|
return find_first_of(s, pos, Traits::length(s));
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Finds the first character equal to `c`.
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
find_first_of(
|
|
|
|
CharT c,
|
|
|
|
size_type pos = 0) const noexcept
|
|
|
|
{
|
|
|
|
return find_first_of(&c, pos, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Finds the last character equal to any character in the string.
|
|
|
|
|
|
|
|
Finds the last character equal to one of the characters in `t`.
|
|
|
|
|
|
|
|
This function participates in overload resolution if
|
|
|
|
`T` is convertible to `string_view` and `T` is not
|
|
|
|
convertible to `CharT const*`.
|
|
|
|
*/
|
|
|
|
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, CharT const*>::value,
|
|
|
|
size_type>::type
|
|
|
|
#endif
|
|
|
|
find_last_of(
|
|
|
|
const T& t,
|
2019-12-16 13:52:55 -05:00
|
|
|
size_type pos = npos) const noexcept(detail::is_nothrow_convertible<const T&,
|
|
|
|
string_view_type>::value)
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
string_view_type sv = t;
|
|
|
|
return find_last_of(sv.data(), pos, sv.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Finds the last character equal to any character in the string.
|
|
|
|
|
|
|
|
Finds the last character equal to one of the characters in `str`.
|
|
|
|
*/
|
|
|
|
template<std::size_t M>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
find_last_of(
|
|
|
|
const basic_static_string<M, CharT, Traits>& str,
|
|
|
|
size_type pos = npos) const noexcept
|
|
|
|
{
|
|
|
|
return find_last_of(str.data(), pos, str.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Finds the last character equal to any character in the string.
|
|
|
|
|
|
|
|
Finds the last character equal to one of the characters in the range `(s, s + count)`. This range can include null characters.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
find_last_of(
|
|
|
|
const CharT* s,
|
|
|
|
size_type pos,
|
|
|
|
size_type n) const noexcept;
|
|
|
|
|
|
|
|
/** Finds the last character equal to any character in the string.
|
|
|
|
|
|
|
|
Finds the last character equal to one of the characters
|
|
|
|
in character string pointed to by `s`.
|
|
|
|
|
|
|
|
The length of the string is determined by the first
|
|
|
|
null character using `Traits::length(s)`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
find_last_of(
|
|
|
|
const CharT* s,
|
|
|
|
size_type pos = npos) const noexcept
|
|
|
|
{
|
|
|
|
return find_last_of(s, pos, Traits::length(s));
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Finds the last character equal to `c`.
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
find_last_of(
|
|
|
|
CharT c,
|
|
|
|
size_type pos = npos) const noexcept
|
|
|
|
{
|
|
|
|
return find_last_of(&c, pos, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Finds the first character equal to none the characters in the string.
|
|
|
|
|
|
|
|
Finds the first character equal to none of the characters in `t`.
|
|
|
|
|
|
|
|
This function participates in overload resolution if
|
|
|
|
`T` is convertible to `string_view` and `T` is not
|
|
|
|
convertible to `CharT const*`.
|
|
|
|
*/
|
|
|
|
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, CharT const*>::value,
|
|
|
|
size_type>::type
|
|
|
|
#endif
|
|
|
|
find_first_not_of(
|
|
|
|
const T& t,
|
2019-12-16 13:52:55 -05:00
|
|
|
size_type pos = 0) const noexcept(detail::is_nothrow_convertible<const T&,
|
|
|
|
string_view_type>::value)
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
string_view_type sv = t;
|
|
|
|
return find_first_not_of(sv.data(), pos, sv.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Finds the first character equal to none the characters in the string.
|
|
|
|
|
|
|
|
Finds the first character equal to none of the characters in `str`.
|
|
|
|
*/
|
|
|
|
template<std::size_t M>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
find_first_not_of(
|
|
|
|
const basic_static_string<M, CharT, Traits>& str,
|
|
|
|
size_type pos = 0) const noexcept
|
|
|
|
{
|
|
|
|
return find_first_not_of(str.data(), pos, str.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Finds the first character equal to none the characters in the string.
|
|
|
|
|
|
|
|
Finds the first character equal to none of characters in range `(s, s + count)`. This range can include null characters.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
find_first_not_of(
|
|
|
|
const CharT* s,
|
|
|
|
size_type pos,
|
|
|
|
size_type n) const noexcept;
|
|
|
|
|
|
|
|
/** Finds the first character equal to none the characters in the string.
|
|
|
|
|
|
|
|
Finds the first character equal to none of the characters in
|
|
|
|
character string pointed to by `s`.
|
|
|
|
|
|
|
|
The length of the string is determined by the first
|
|
|
|
null character using `Traits::length(s)`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
find_first_not_of(
|
|
|
|
const CharT* s,
|
|
|
|
size_type pos = 0) const noexcept
|
|
|
|
{
|
|
|
|
return find_first_not_of(s, pos, Traits::length(s));
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Finds the first character not equal to `c`.
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
find_first_not_of(
|
|
|
|
CharT c,
|
|
|
|
size_type pos = 0) const noexcept
|
|
|
|
{
|
|
|
|
return find_first_not_of(&c, pos, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Finds the last character equal to none the characters in the string.
|
|
|
|
|
|
|
|
Finds the last character equal to none of the characters in `t`.
|
|
|
|
|
|
|
|
This function participates in overload resolution if
|
|
|
|
`T` is convertible to `string_view` and `T` is not
|
|
|
|
convertible to `CharT const*`.
|
|
|
|
*/
|
|
|
|
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, CharT const*>::value,
|
|
|
|
size_type>::type
|
|
|
|
#endif
|
|
|
|
find_last_not_of(
|
|
|
|
const T& t,
|
2019-12-16 13:52:55 -05:00
|
|
|
size_type pos = npos) const noexcept(detail::is_nothrow_convertible<const T&,
|
|
|
|
string_view_type>::value)
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
string_view_type sv = t;
|
|
|
|
return find_last_not_of(sv.data(), pos, sv.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Finds the last character equal to none the characters in the string.
|
|
|
|
|
|
|
|
Finds the last character equal to none of the characters in `str`.
|
|
|
|
*/
|
|
|
|
template<size_t M>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
find_last_not_of(
|
|
|
|
const basic_static_string<M, CharT, Traits>& str,
|
|
|
|
size_type pos = npos) const noexcept
|
|
|
|
{
|
|
|
|
return find_last_not_of(str.data(), pos, str.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Finds the last character equal to none the characters in the string.
|
|
|
|
|
|
|
|
Finds the last character equal to none of the characters in range `(s, s + count)`. This range can include null characters.
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
find_last_not_of(
|
|
|
|
const CharT* s,
|
|
|
|
size_type pos,
|
|
|
|
size_type n) const noexcept;
|
|
|
|
|
|
|
|
|
|
|
|
/** Finds the last character equal to none the characters in the string.
|
|
|
|
|
|
|
|
Finds the last character equal to none of the characters in
|
|
|
|
character string pointed to by `s`.
|
|
|
|
|
|
|
|
The length of the string is determined by the first
|
|
|
|
null character using `Traits::length(s)`
|
|
|
|
*/
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
find_last_not_of(
|
|
|
|
const CharT* s,
|
|
|
|
size_type pos = npos) const noexcept
|
|
|
|
{
|
|
|
|
return find_last_not_of(s, pos, Traits::length(s));
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Finds the last character not equal to `c`.
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
size_type
|
|
|
|
find_last_not_of(
|
|
|
|
CharT c,
|
|
|
|
size_type pos = npos) const noexcept
|
|
|
|
{
|
|
|
|
return find_last_not_of(&c, pos, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns whether the string begins with `s`
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
bool
|
|
|
|
starts_with(
|
|
|
|
string_view_type s) const noexcept
|
|
|
|
{
|
|
|
|
const size_type len = s.size();
|
|
|
|
return size() >= len && !Traits::compare(data(), s.data(), len);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns whether the string begins with `c`
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
bool
|
|
|
|
starts_with(
|
|
|
|
CharT c) const noexcept
|
|
|
|
{
|
|
|
|
return !empty() && Traits::eq(front(), c);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns whether the string begins with `s`
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
bool
|
|
|
|
starts_with(
|
|
|
|
const CharT* s) const noexcept
|
|
|
|
{
|
|
|
|
const size_type len = Traits::length(s);
|
|
|
|
return size() >= len && !Traits::compare(data(), s, len);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns whether the string ends with `s`
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
bool
|
|
|
|
ends_with(
|
|
|
|
string_view_type s) const noexcept
|
|
|
|
{
|
|
|
|
const size_type len = s.size();
|
|
|
|
return size() >= len && !Traits::compare(data() + (size() - len), s.data(), len);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns whether the string ends with `c`
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
bool
|
|
|
|
ends_with(
|
|
|
|
CharT c) const noexcept
|
|
|
|
{
|
|
|
|
return !empty() && Traits::eq(back(), c);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns whether the string begins with `s`
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
bool
|
|
|
|
ends_with(
|
|
|
|
const CharT* s) const noexcept
|
|
|
|
{
|
|
|
|
const size_type len = Traits::length(s);
|
|
|
|
return size() >= len && !Traits::compare(data() + (size() - len), s, len);
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
assign_char(CharT ch, std::true_type) noexcept;
|
|
|
|
|
|
|
|
basic_static_string&
|
2019-12-26 17:22:57 -05:00
|
|
|
assign_char(CharT ch, std::false_type) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-30 21:12:20 -05:00
|
|
|
|
|
|
|
// Returns the size of data read from input iterator. Read data begins at data() + size() + 1.
|
|
|
|
template<typename InputIterator>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
std::size_t
|
|
|
|
read_back(
|
|
|
|
InputIterator first,
|
2020-01-01 15:01:39 -05:00
|
|
|
InputIterator last) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
|
|
|
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
basic_static_string&
|
|
|
|
replace_unchecked(
|
|
|
|
size_type pos,
|
|
|
|
size_type n1,
|
|
|
|
const CharT* s,
|
|
|
|
size_type n2) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Non-member functions
|
|
|
|
//
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
template<
|
|
|
|
std::size_t N, std::size_t M,
|
|
|
|
typename CharT, typename Traits>
|
2019-12-16 16:42:53 -05:00
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
inline
|
|
|
|
bool
|
|
|
|
operator==(
|
|
|
|
basic_static_string<N, CharT, Traits> const& lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<M, CharT, Traits> const& rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return lhs.compare(rhs) == 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<
|
|
|
|
std::size_t N, std::size_t M,
|
|
|
|
typename CharT, typename Traits>
|
2019-12-16 16:42:53 -05:00
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
inline
|
|
|
|
bool
|
|
|
|
operator!=(
|
|
|
|
basic_static_string<N, CharT, Traits> const& lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<M, CharT, Traits> const& rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return lhs.compare(rhs) != 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<
|
|
|
|
std::size_t N, std::size_t M,
|
|
|
|
typename CharT, typename Traits>
|
2019-12-16 16:42:53 -05:00
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
inline
|
|
|
|
bool
|
|
|
|
operator<(
|
|
|
|
basic_static_string<N, CharT, Traits> const& lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<M, CharT, Traits> const& rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return lhs.compare(rhs) < 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<
|
|
|
|
std::size_t N, std::size_t M,
|
|
|
|
typename CharT, typename Traits>
|
2019-12-16 16:42:53 -05:00
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
inline
|
|
|
|
bool
|
|
|
|
operator<=(
|
|
|
|
basic_static_string<N, CharT, Traits> const& lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<M, CharT, Traits> const& rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return lhs.compare(rhs) <= 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<
|
|
|
|
std::size_t N, std::size_t M,
|
|
|
|
typename CharT, typename Traits>
|
2019-12-16 16:42:53 -05:00
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
inline
|
|
|
|
bool
|
|
|
|
operator>(
|
|
|
|
basic_static_string<N, CharT, Traits> const& lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<M, CharT, Traits> const& rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return lhs.compare(rhs) > 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<
|
|
|
|
std::size_t N, std::size_t M,
|
|
|
|
typename CharT, typename Traits>
|
2019-12-16 16:42:53 -05:00
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
inline
|
|
|
|
bool
|
|
|
|
operator>=(
|
|
|
|
basic_static_string<N, CharT, Traits> const& lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<M, CharT, Traits> const& rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return lhs.compare(rhs) >= 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<std::size_t N, typename CharT, typename Traits>
|
2019-12-16 16:42:53 -05:00
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
inline
|
|
|
|
bool
|
|
|
|
operator==(
|
|
|
|
CharT const* lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<N, CharT, Traits> const& rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return detail::lexicographical_compare<CharT, Traits>(
|
|
|
|
lhs, Traits::length(lhs),
|
|
|
|
rhs.data(), rhs.size()) == 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<std::size_t N, typename CharT, typename Traits>
|
2019-12-16 16:42:53 -05:00
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
inline
|
|
|
|
bool
|
|
|
|
operator==(
|
|
|
|
basic_static_string<N, CharT, Traits> const& lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT const* rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return detail::lexicographical_compare<CharT, Traits>(
|
|
|
|
lhs.data(), lhs.size(),
|
|
|
|
rhs, Traits::length(rhs)) == 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<std::size_t N, typename CharT, typename Traits>
|
2019-12-16 16:42:53 -05:00
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
inline
|
|
|
|
bool
|
|
|
|
operator!=(
|
|
|
|
CharT const* lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<N, CharT, Traits> const& rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return detail::lexicographical_compare<CharT, Traits>(
|
|
|
|
lhs, Traits::length(lhs),
|
|
|
|
rhs.data(), rhs.size()) != 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<std::size_t N, typename CharT, typename Traits>
|
2019-12-16 16:42:53 -05:00
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
inline
|
|
|
|
bool
|
|
|
|
operator!=(
|
|
|
|
basic_static_string<N, CharT, Traits> const& lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT const* rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return detail::lexicographical_compare<CharT, Traits>(
|
|
|
|
lhs.data(), lhs.size(),
|
|
|
|
rhs, Traits::length(rhs)) != 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<std::size_t N, typename CharT, typename Traits>
|
2019-12-16 16:42:53 -05:00
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
inline
|
|
|
|
bool
|
|
|
|
operator<(
|
|
|
|
CharT const* lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<N, CharT, Traits> const& rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return detail::lexicographical_compare<CharT, Traits>(
|
|
|
|
lhs, Traits::length(lhs),
|
|
|
|
rhs.data(), rhs.size()) < 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<std::size_t N, typename CharT, typename Traits>
|
2019-12-16 16:42:53 -05:00
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
inline
|
|
|
|
bool
|
|
|
|
operator<(
|
|
|
|
basic_static_string<N, CharT, Traits> const& lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT const* rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return detail::lexicographical_compare<CharT, Traits>(
|
|
|
|
lhs.data(), lhs.size(),
|
|
|
|
rhs, Traits::length(rhs)) < 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<std::size_t N, typename CharT, typename Traits>
|
2019-12-16 16:42:53 -05:00
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
inline
|
|
|
|
bool
|
|
|
|
operator<=(
|
|
|
|
CharT const* lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<N, CharT, Traits> const& rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return detail::lexicographical_compare<CharT, Traits>(
|
|
|
|
lhs, Traits::length(lhs),
|
|
|
|
rhs.data(), rhs.size()) <= 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<std::size_t N, typename CharT, typename Traits>
|
2019-12-16 16:42:53 -05:00
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
inline
|
|
|
|
bool
|
|
|
|
operator<=(
|
|
|
|
basic_static_string<N, CharT, Traits> const& lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT const* rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return detail::lexicographical_compare<CharT, Traits>(
|
|
|
|
lhs.data(), lhs.size(),
|
|
|
|
rhs, Traits::length(rhs)) <= 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<std::size_t N, typename CharT, typename Traits>
|
2019-12-16 16:42:53 -05:00
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
inline
|
|
|
|
bool
|
|
|
|
operator>(
|
|
|
|
CharT const* lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<N, CharT, Traits> const& rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return detail::lexicographical_compare<CharT, Traits>(
|
|
|
|
lhs, Traits::length(lhs),
|
|
|
|
rhs.data(), rhs.size()) > 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<std::size_t N, typename CharT, typename Traits>
|
2019-12-16 16:42:53 -05:00
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
inline
|
|
|
|
bool
|
|
|
|
operator>(
|
|
|
|
basic_static_string<N, CharT, Traits> const& lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT const* rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return detail::lexicographical_compare<CharT, Traits>(
|
|
|
|
lhs.data(), lhs.size(),
|
|
|
|
rhs, Traits::length(rhs)) > 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<std::size_t N, typename CharT, typename Traits>
|
2019-12-16 16:42:53 -05:00
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
inline
|
|
|
|
bool
|
|
|
|
operator>=(
|
|
|
|
CharT const* lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<N, CharT, Traits> const& rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return detail::lexicographical_compare<CharT, Traits>(
|
|
|
|
lhs, Traits::length(lhs),
|
|
|
|
rhs.data(), rhs.size()) >= 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<std::size_t N, typename CharT, typename Traits>
|
2019-12-16 16:42:53 -05:00
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
inline
|
|
|
|
bool
|
|
|
|
operator>=(
|
|
|
|
basic_static_string<N, CharT, Traits> const& lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT const* rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
return detail::lexicographical_compare<CharT, Traits>(
|
|
|
|
lhs.data(), lhs.size(),
|
|
|
|
rhs, Traits::length(rhs)) >= 0;
|
|
|
|
}
|
|
|
|
|
2019-12-16 16:42:53 -05:00
|
|
|
template<
|
|
|
|
std::size_t N, std::size_t M,
|
|
|
|
typename CharT, typename Traits>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
inline
|
|
|
|
basic_static_string<N + M, CharT, Traits>
|
|
|
|
operator+(
|
|
|
|
basic_static_string<N, CharT, Traits>const& lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<M, CharT, Traits>const& rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 16:42:53 -05:00
|
|
|
{
|
|
|
|
return basic_static_string<N + M, CharT, Traits>(lhs) += rhs;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<std::size_t N, typename CharT, typename Traits>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
inline
|
|
|
|
basic_static_string<N + 1, CharT, Traits>
|
|
|
|
operator+(
|
|
|
|
basic_static_string<N, CharT, Traits> const& lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
CharT rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 16:42:53 -05:00
|
|
|
{
|
|
|
|
return basic_static_string<N + 1, CharT, Traits>(lhs) += rhs;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<std::size_t N, typename CharT, typename Traits>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
inline
|
|
|
|
basic_static_string<N + 1, CharT, Traits>
|
|
|
|
operator+(
|
|
|
|
CharT lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<N, CharT, Traits> const& rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 16:42:53 -05:00
|
|
|
{
|
|
|
|
return basic_static_string<N + 1, CharT, Traits>(rhs).insert(0, lhs);
|
|
|
|
}
|
|
|
|
|
|
|
|
template<
|
|
|
|
std::size_t N, std::size_t M,
|
|
|
|
typename CharT, typename Traits>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
inline
|
|
|
|
basic_static_string<N + M, CharT, Traits>
|
|
|
|
operator+(
|
|
|
|
basic_static_string<N, CharT, Traits>const& lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
const CharT(&rhs)[M]) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 16:42:53 -05:00
|
|
|
{
|
|
|
|
return basic_static_string<N + M, CharT, Traits>(lhs).append(+rhs, M);
|
|
|
|
}
|
|
|
|
|
|
|
|
template<
|
|
|
|
std::size_t N, std::size_t M,
|
|
|
|
typename CharT, typename Traits>
|
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
|
|
|
inline
|
|
|
|
basic_static_string<N + M, CharT, Traits>
|
|
|
|
operator+(
|
|
|
|
const CharT(&lhs)[N],
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<M, CharT, Traits>const& rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 16:42:53 -05:00
|
|
|
{
|
|
|
|
return basic_static_string<N + M, CharT, Traits>(rhs).insert(0, +rhs, N);
|
|
|
|
}
|
|
|
|
|
2019-12-16 12:23:46 -05:00
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// swap
|
|
|
|
//
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
template<
|
|
|
|
std::size_t N,
|
|
|
|
typename CharT,
|
|
|
|
typename Traits>
|
2019-12-16 16:42:53 -05:00
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
inline
|
|
|
|
void
|
|
|
|
swap(
|
|
|
|
basic_static_string<N, CharT, Traits>& lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<N, CharT, Traits>& rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
lhs.swap(rhs);
|
|
|
|
}
|
|
|
|
|
|
|
|
template<
|
|
|
|
std::size_t N, std::size_t M,
|
|
|
|
typename CharT, typename Traits>
|
2019-12-16 16:42:53 -05:00
|
|
|
BOOST_STATIC_STRING_CPP14_CONSTEXPR
|
2019-12-16 12:23:46 -05:00
|
|
|
inline
|
|
|
|
void
|
|
|
|
swap(
|
|
|
|
basic_static_string<N, CharT, Traits>& lhs,
|
2019-12-26 17:22:57 -05:00
|
|
|
basic_static_string<M, CharT, Traits>& rhs) BOOST_STATIC_STRING_COND_NOEXCEPT
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
lhs.swap(rhs);
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Input/Output
|
|
|
|
//
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
template<std::size_t N, typename CharT, typename Traits>
|
|
|
|
inline
|
|
|
|
std::basic_ostream<CharT, Traits>&
|
|
|
|
operator<<(std::basic_ostream<CharT, Traits>& os,
|
|
|
|
basic_static_string<N, CharT, Traits> const& s)
|
|
|
|
{
|
2019-12-16 18:19:01 -05:00
|
|
|
return os << basic_string_view<CharT, Traits>(s.data(), s.size());
|
2019-12-16 12:23:46 -05:00
|
|
|
}
|
|
|
|
|
2019-12-20 02:34:04 -05:00
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Aliases
|
|
|
|
//
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
template<std::size_t N>
|
|
|
|
using static_string = basic_static_string<N, char>;
|
|
|
|
|
|
|
|
template<std::size_t N>
|
|
|
|
using static_wstring = basic_static_string<N, wchar_t>;
|
|
|
|
|
|
|
|
template<std::size_t N>
|
|
|
|
using static_u16string = basic_static_string<N, char16_t>;
|
|
|
|
|
|
|
|
template<std::size_t N>
|
|
|
|
using static_u32string = basic_static_string<N, char32_t>;
|
|
|
|
|
2019-12-16 12:23:46 -05:00
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Numeric conversions
|
|
|
|
//
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
2019-12-20 02:34:04 -05:00
|
|
|
// string
|
2019-12-16 12:23:46 -05:00
|
|
|
|
2019-12-20 02:34:04 -05:00
|
|
|
static_string<std::numeric_limits<int>::digits10 + 1>
|
|
|
|
inline
|
2019-12-26 17:22:57 -05:00
|
|
|
to_static_string(int value) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
2019-12-20 02:34:04 -05:00
|
|
|
static_string<std::numeric_limits<long>::digits10 + 1>
|
|
|
|
inline
|
2019-12-26 17:22:57 -05:00
|
|
|
to_static_string(long value)BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-20 02:34:04 -05:00
|
|
|
|
|
|
|
static_string<std::numeric_limits<long long>::digits10 + 1>
|
|
|
|
inline
|
2019-12-26 17:22:57 -05:00
|
|
|
to_static_string(long long value)BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-20 02:34:04 -05:00
|
|
|
|
|
|
|
static_string<std::numeric_limits<unsigned int>::digits10 + 1>
|
|
|
|
inline
|
2019-12-26 17:22:57 -05:00
|
|
|
to_static_string(unsigned int value) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-20 02:34:04 -05:00
|
|
|
|
|
|
|
static_string<std::numeric_limits<unsigned long>::digits10 + 1>
|
|
|
|
inline
|
2019-12-26 17:22:57 -05:00
|
|
|
to_static_string(unsigned long value) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-20 02:34:04 -05:00
|
|
|
|
|
|
|
static_string<std::numeric_limits<unsigned long long>::digits10 + 1>
|
|
|
|
inline
|
2019-12-26 17:22:57 -05:00
|
|
|
to_static_string(unsigned long long value) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-20 02:34:04 -05:00
|
|
|
|
|
|
|
static_string<std::numeric_limits<float>::max_digits10 + 1>
|
|
|
|
inline
|
2019-12-26 17:22:57 -05:00
|
|
|
to_static_string(float value) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-20 02:34:04 -05:00
|
|
|
|
|
|
|
static_string<std::numeric_limits<double>::max_digits10 + 1>
|
|
|
|
inline
|
2019-12-26 17:22:57 -05:00
|
|
|
to_static_string(double value) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-20 02:34:04 -05:00
|
|
|
|
|
|
|
static_string<std::numeric_limits<long double>::max_digits10 + 1>
|
|
|
|
inline
|
2019-12-26 17:22:57 -05:00
|
|
|
to_static_string(long double value) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-20 02:34:04 -05:00
|
|
|
|
|
|
|
// wstring
|
|
|
|
|
|
|
|
static_wstring<std::numeric_limits<int>::digits10 + 1>
|
|
|
|
inline
|
2019-12-26 17:22:57 -05:00
|
|
|
to_static_wstring(int value) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-20 02:34:04 -05:00
|
|
|
|
|
|
|
static_wstring<std::numeric_limits<long>::digits10 + 1>
|
|
|
|
inline
|
2019-12-26 17:22:57 -05:00
|
|
|
to_static_wstring(long value) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-20 02:34:04 -05:00
|
|
|
|
|
|
|
static_wstring<std::numeric_limits<long long>::digits10 + 1>
|
|
|
|
inline
|
2019-12-26 17:22:57 -05:00
|
|
|
to_static_wstring(long long value) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-20 02:34:04 -05:00
|
|
|
|
|
|
|
static_wstring<std::numeric_limits<unsigned int>::digits10 + 1>
|
|
|
|
inline
|
2019-12-26 17:22:57 -05:00
|
|
|
to_static_wstring(unsigned int value) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-20 02:34:04 -05:00
|
|
|
|
|
|
|
static_wstring<std::numeric_limits<unsigned long>::digits10 + 1>
|
2019-12-16 12:23:46 -05:00
|
|
|
inline
|
2019-12-26 17:22:57 -05:00
|
|
|
to_static_wstring(unsigned long value) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-20 02:34:04 -05:00
|
|
|
|
|
|
|
static_wstring<std::numeric_limits<unsigned long long>::digits10 + 1>
|
|
|
|
inline
|
2019-12-26 17:22:57 -05:00
|
|
|
to_static_wstring(unsigned long long value) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-20 02:34:04 -05:00
|
|
|
|
|
|
|
static_wstring<std::numeric_limits<float>::max_digits10 + 1>
|
|
|
|
inline
|
2019-12-26 17:22:57 -05:00
|
|
|
to_static_wstring(float value) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-20 02:34:04 -05:00
|
|
|
|
|
|
|
static_wstring<std::numeric_limits<double>::max_digits10 + 1>
|
|
|
|
inline
|
2019-12-26 17:22:57 -05:00
|
|
|
to_static_wstring(double value) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-20 02:34:04 -05:00
|
|
|
|
|
|
|
static_wstring<std::numeric_limits<long double>::max_digits10 + 1>
|
|
|
|
inline
|
2019-12-26 17:22:57 -05:00
|
|
|
to_static_wstring(long double value) BOOST_STATIC_STRING_COND_NOEXCEPT;
|
2019-12-16 12:23:46 -05:00
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Deduction Guides
|
|
|
|
//
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
#ifdef BOOST_STATIC_STRING_USE_DEDUCT
|
|
|
|
template<std::size_t N, typename CharT>
|
|
|
|
basic_static_string(CharT(&)[N]) ->
|
|
|
|
basic_static_string<N, CharT, std::char_traits<CharT>>;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Hashing
|
|
|
|
//
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
#ifndef BOOST_STATIC_STRING_STANDALONE
|
2020-01-15 13:23:44 -05:00
|
|
|
/// hash_value overload for Boost.Container_Hash
|
2019-12-16 12:23:46 -05:00
|
|
|
template <std::size_t N,
|
|
|
|
typename CharT,
|
|
|
|
typename Traits>
|
|
|
|
std::size_t
|
|
|
|
hash_value(
|
|
|
|
const basic_static_string<N, CharT, Traits>& str)
|
|
|
|
{
|
|
|
|
return boost::hash_range(str.begin(), str.end());
|
|
|
|
}
|
|
|
|
#endif
|
2019-12-26 17:22:57 -05:00
|
|
|
|
2019-12-16 12:23:46 -05:00
|
|
|
} // static_string
|
|
|
|
} // boost
|
|
|
|
|
2020-01-15 13:23:44 -05:00
|
|
|
/// std::hash partial specialization for basic_static_string
|
2019-12-16 12:23:46 -05:00
|
|
|
namespace std
|
|
|
|
{
|
|
|
|
template <std::size_t N, typename CharT, typename Traits>
|
2020-01-15 13:23:44 -05:00
|
|
|
struct hash<
|
|
|
|
#if GENERATING_DOCUMENTATION
|
|
|
|
basic_static_string
|
|
|
|
#else
|
|
|
|
boost::static_string::basic_static_string<N, CharT, Traits>
|
|
|
|
#endif
|
|
|
|
>
|
2019-12-16 12:23:46 -05:00
|
|
|
{
|
|
|
|
std::size_t
|
|
|
|
operator()(
|
|
|
|
const boost::static_string::basic_static_string<N, CharT, Traits>& str) const
|
|
|
|
{
|
|
|
|
#ifndef BOOST_STATIC_STRING_STANDALONE
|
|
|
|
return boost::hash_range(str.begin(), str.end());
|
|
|
|
#else
|
|
|
|
using sv = boost::static_string::basic_string_view<CharT, Traits>;
|
|
|
|
return std::hash<sv>()(sv(str.data(), str.size()));
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
};
|
|
|
|
} // std
|
|
|
|
|
|
|
|
#include <boost/static_string/impl/static_string.hpp>
|
|
|
|
#endif
|