Merge to master for 1.62.0 release

This commit is contained in:
Marshall Clow
2016-08-17 13:02:13 -07:00
3 changed files with 52 additions and 33 deletions

View File

@ -47,11 +47,11 @@
// {} // {}
// This macro should only persist within this file. // This macro should only persist within this file.
#define BOOST_PRIVATE_CTR_DEF( z, n, data ) \ #define BOOST_PRIVATE_CTR_DEF( z, n, data ) \
template < BOOST_PP_ENUM_PARAMS(n, typename T) > \ template < BOOST_PP_ENUM_PARAMS(n, typename T) > \
explicit base_from_member( BOOST_PP_ENUM_BINARY_PARAMS(n, T, x) ) \ base_from_member( BOOST_PP_ENUM_BINARY_PARAMS(n, T, x) ) \
: member( BOOST_PP_ENUM_PARAMS(n, x) ) \ : member( BOOST_PP_ENUM_PARAMS(n, x) ) \
{} \ {} \
/**/ /**/
@ -142,7 +142,8 @@ protected:
: member() : member()
{} {}
BOOST_PP_REPEAT_FROM_TO( 1, BOOST_PP_INC(BOOST_BASE_FROM_MEMBER_MAX_ARITY), template < typename T0 > explicit base_from_member( T0 x0 ) : member( x0 ) {}
BOOST_PP_REPEAT_FROM_TO( 2, BOOST_PP_INC(BOOST_BASE_FROM_MEMBER_MAX_ARITY),
BOOST_PRIVATE_CTR_DEF, _ ) BOOST_PRIVATE_CTR_DEF, _ )
#endif #endif

View File

@ -57,26 +57,37 @@ namespace boost {
static BOOST_CONSTEXPR_OR_CONST size_type npos = size_type(-1); static BOOST_CONSTEXPR_OR_CONST size_type npos = size_type(-1);
// construct/copy // construct/copy
BOOST_CONSTEXPR basic_string_ref () BOOST_CONSTEXPR basic_string_ref () BOOST_NOEXCEPT
: ptr_(NULL), len_(0) {} : ptr_(NULL), len_(0) {}
BOOST_CONSTEXPR basic_string_ref (const basic_string_ref &rhs) // by defaulting these functions, basic_string_ref becomes
// trivially copy/move constructible.
BOOST_CONSTEXPR basic_string_ref (const basic_string_ref &rhs) BOOST_NOEXCEPT
#ifndef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
= default;
#else
: ptr_(rhs.ptr_), len_(rhs.len_) {} : ptr_(rhs.ptr_), len_(rhs.len_) {}
#endif
basic_string_ref& operator=(const basic_string_ref &rhs) { basic_string_ref& operator=(const basic_string_ref &rhs) BOOST_NOEXCEPT
#ifndef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
= default;
#else
{
ptr_ = rhs.ptr_; ptr_ = rhs.ptr_;
len_ = rhs.len_; len_ = rhs.len_;
return *this; return *this;
} }
#endif
basic_string_ref(const charT* str) basic_string_ref(const charT* str) BOOST_NOEXCEPT
: ptr_(str), len_(traits::length(str)) {} : ptr_(str), len_(traits::length(str)) {}
template<typename Allocator> template<typename Allocator>
basic_string_ref(const std::basic_string<charT, traits, Allocator>& str) basic_string_ref(const std::basic_string<charT, traits, Allocator>& str)
: ptr_(str.data()), len_(str.length()) {} : ptr_(str.data()), len_(str.length()) {}
BOOST_CONSTEXPR basic_string_ref(const charT* str, size_type len) BOOST_CONSTEXPR basic_string_ref(const charT* str, size_type len) BOOST_NOEXCEPT
: ptr_(str), len_(len) {} : ptr_(str), len_(len) {}
#ifndef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS #ifndef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
@ -174,13 +185,13 @@ namespace boost {
size_type rfind(basic_string_ref s) const { size_type rfind(basic_string_ref s) const {
const_reverse_iterator iter = std::search ( this->crbegin (), this->crend (), const_reverse_iterator iter = std::search ( this->crbegin (), this->crend (),
s.crbegin (), s.crend (), traits::eq ); s.crbegin (), s.crend (), traits::eq );
return iter == this->crend () ? npos : reverse_distance ( this->crbegin (), iter ); return iter == this->crend () ? npos : (std::distance(iter, this->crend()) - s.size());
} }
size_type rfind(charT c) const { size_type rfind(charT c) const {
const_reverse_iterator iter = std::find_if ( this->crbegin (), this->crend (), const_reverse_iterator iter = std::find_if ( this->crbegin (), this->crend (),
detail::string_ref_traits_eq<charT, traits> ( c )); detail::string_ref_traits_eq<charT, traits> ( c ));
return iter == this->crend () ? npos : reverse_distance ( this->crbegin (), iter ); return iter == this->crend () ? npos : (this->size() - 1 - std::distance(this->crbegin(), iter));
} }
size_type find_first_of(charT c) const { return find (c); } size_type find_first_of(charT c) const { return find (c); }
@ -195,7 +206,7 @@ namespace boost {
size_type find_last_of(basic_string_ref s) const { size_type find_last_of(basic_string_ref s) const {
const_reverse_iterator iter = std::find_first_of const_reverse_iterator iter = std::find_first_of
( this->crbegin (), this->crend (), s.cbegin (), s.cend (), traits::eq ); ( this->crbegin (), this->crend (), s.cbegin (), s.cend (), traits::eq );
return iter == this->crend () ? npos : reverse_distance ( this->crbegin (), iter); return iter == this->crend () ? npos : (this->size() - 1 - std::distance(this->crbegin(), iter));
} }
size_type find_first_not_of(basic_string_ref s) const { size_type find_first_not_of(basic_string_ref s) const {
@ -212,21 +223,17 @@ namespace boost {
size_type find_last_not_of(basic_string_ref s) const { size_type find_last_not_of(basic_string_ref s) const {
const_reverse_iterator iter = find_not_of ( this->crbegin (), this->crend (), s ); const_reverse_iterator iter = find_not_of ( this->crbegin (), this->crend (), s );
return iter == this->crend () ? npos : reverse_distance ( this->crbegin (), iter ); return iter == this->crend () ? npos : (this->size() - 1 - std::distance(this->crbegin(), iter));
} }
size_type find_last_not_of(charT c) const { size_type find_last_not_of(charT c) const {
for ( const_reverse_iterator iter = this->crbegin (); iter != this->crend (); ++iter ) for ( const_reverse_iterator iter = this->crbegin (); iter != this->crend (); ++iter )
if ( !traits::eq ( c, *iter )) if ( !traits::eq ( c, *iter ))
return reverse_distance ( this->crbegin (), iter ); return this->size() - 1 - std::distance(this->crbegin(), iter);
return npos; return npos;
} }
private: private:
template <typename r_iter>
size_type reverse_distance ( r_iter first, r_iter last ) const {
return len_ - 1 - std::distance ( first, last );
}
template <typename Iterator> template <typename Iterator>
Iterator find_not_of ( Iterator first, Iterator last, basic_string_ref s ) const { Iterator find_not_of ( Iterator first, Iterator last, basic_string_ref s ) const {
@ -405,7 +412,7 @@ namespace boost {
namespace detail { namespace detail {
template<class charT, class traits> template<class charT, class traits>
inline void insert_fill_chars(std::basic_ostream<charT, traits>& os, std::size_t n) { inline void sr_insert_fill_chars(std::basic_ostream<charT, traits>& os, std::size_t n) {
enum { chunk_size = 8 }; enum { chunk_size = 8 };
charT fill_chars[chunk_size]; charT fill_chars[chunk_size];
std::fill_n(fill_chars, static_cast< std::size_t >(chunk_size), os.fill()); std::fill_n(fill_chars, static_cast< std::size_t >(chunk_size), os.fill());
@ -416,19 +423,19 @@ namespace boost {
} }
template<class charT, class traits> template<class charT, class traits>
void insert_aligned(std::basic_ostream<charT, traits>& os, const basic_string_ref<charT,traits>& str) { void sr_insert_aligned(std::basic_ostream<charT, traits>& os, const basic_string_ref<charT,traits>& str) {
const std::size_t size = str.size(); const std::size_t size = str.size();
const std::size_t alignment_size = static_cast< std::size_t >(os.width()) - size; const std::size_t alignment_size = static_cast< std::size_t >(os.width()) - size;
const bool align_left = (os.flags() & std::basic_ostream<charT, traits>::adjustfield) == std::basic_ostream<charT, traits>::left; const bool align_left = (os.flags() & std::basic_ostream<charT, traits>::adjustfield) == std::basic_ostream<charT, traits>::left;
if (!align_left) { if (!align_left) {
detail::insert_fill_chars(os, alignment_size); detail::sr_insert_fill_chars(os, alignment_size);
if (os.good()) if (os.good())
os.write(str.data(), size); os.write(str.data(), size);
} }
else { else {
os.write(str.data(), size); os.write(str.data(), size);
if (os.good()) if (os.good())
detail::insert_fill_chars(os, alignment_size); detail::sr_insert_fill_chars(os, alignment_size);
} }
} }
@ -444,7 +451,7 @@ namespace boost {
if (w <= size) if (w <= size)
os.write(str.data(), size); os.write(str.data(), size);
else else
detail::insert_aligned(os, str); detail::sr_insert_aligned(os, str);
os.width(0); os.width(0);
} }
return os; return os;

View File

@ -65,14 +65,25 @@ namespace boost {
BOOST_CONSTEXPR basic_string_view() BOOST_NOEXCEPT BOOST_CONSTEXPR basic_string_view() BOOST_NOEXCEPT
: ptr_(NULL), len_(0) {} : ptr_(NULL), len_(0) {}
// by defaulting these functions, basic_string_ref becomes
// trivially copy/move constructible.
BOOST_CONSTEXPR basic_string_view(const basic_string_view &rhs) BOOST_NOEXCEPT BOOST_CONSTEXPR basic_string_view(const basic_string_view &rhs) BOOST_NOEXCEPT
#ifndef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
= default;
#else
: ptr_(rhs.ptr_), len_(rhs.len_) {} : ptr_(rhs.ptr_), len_(rhs.len_) {}
#endif
basic_string_view& operator=(const basic_string_view &rhs) BOOST_NOEXCEPT { basic_string_view& operator=(const basic_string_view &rhs) BOOST_NOEXCEPT
#ifndef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
= default;
#else
{
ptr_ = rhs.ptr_; ptr_ = rhs.ptr_;
len_ = rhs.len_; len_ = rhs.len_;
return *this; return *this;
} }
#endif
template<typename Allocator> template<typename Allocator>
basic_string_view(const std::basic_string<charT, traits, basic_string_view(const std::basic_string<charT, traits,
@ -244,7 +255,7 @@ namespace boost {
pos = len_ - s.len_; pos = len_ - s.len_;
if (s.len_ == 0u) // an empty string is always found if (s.len_ == 0u) // an empty string is always found
return pos; return pos;
for (const charT* cur = ptr_ + pos;; --cur) { for (const charT* cur = ptr_ + pos; ; --cur) {
if (traits::compare(cur, s.ptr_, s.len_) == 0) if (traits::compare(cur, s.ptr_, s.len_) == 0)
return cur - ptr_; return cur - ptr_;
if (cur == ptr_) if (cur == ptr_)
@ -311,7 +322,7 @@ namespace boost {
// find_last_not_of // find_last_not_of
BOOST_CXX14_CONSTEXPR size_type find_last_not_of(basic_string_view s, size_type pos = npos) const BOOST_NOEXCEPT { BOOST_CXX14_CONSTEXPR size_type find_last_not_of(basic_string_view s, size_type pos = npos) const BOOST_NOEXCEPT {
if (pos >= len_) if (pos >= len_)
pos = len_ - 1;; pos = len_ - 1;
if (s.len_ == 0u) if (s.len_ == 0u)
return pos; return pos;
pos = len_ - (pos+1); pos = len_ - (pos+1);
@ -538,7 +549,7 @@ namespace boost {
namespace detail { namespace detail {
template<class charT, class traits> template<class charT, class traits>
inline void insert_fill_chars(std::basic_ostream<charT, traits>& os, std::size_t n) { inline void sv_insert_fill_chars(std::basic_ostream<charT, traits>& os, std::size_t n) {
enum { chunk_size = 8 }; enum { chunk_size = 8 };
charT fill_chars[chunk_size]; charT fill_chars[chunk_size];
std::fill_n(fill_chars, static_cast< std::size_t >(chunk_size), os.fill()); std::fill_n(fill_chars, static_cast< std::size_t >(chunk_size), os.fill());
@ -549,19 +560,19 @@ namespace boost {
} }
template<class charT, class traits> template<class charT, class traits>
void insert_aligned(std::basic_ostream<charT, traits>& os, const basic_string_view<charT,traits>& str) { void sv_insert_aligned(std::basic_ostream<charT, traits>& os, const basic_string_view<charT,traits>& str) {
const std::size_t size = str.size(); const std::size_t size = str.size();
const std::size_t alignment_size = static_cast< std::size_t >(os.width()) - size; const std::size_t alignment_size = static_cast< std::size_t >(os.width()) - size;
const bool align_left = (os.flags() & std::basic_ostream<charT, traits>::adjustfield) == std::basic_ostream<charT, traits>::left; const bool align_left = (os.flags() & std::basic_ostream<charT, traits>::adjustfield) == std::basic_ostream<charT, traits>::left;
if (!align_left) { if (!align_left) {
detail::insert_fill_chars(os, alignment_size); detail::sv_insert_fill_chars(os, alignment_size);
if (os.good()) if (os.good())
os.write(str.data(), size); os.write(str.data(), size);
} }
else { else {
os.write(str.data(), size); os.write(str.data(), size);
if (os.good()) if (os.good())
detail::insert_fill_chars(os, alignment_size); detail::sv_insert_fill_chars(os, alignment_size);
} }
} }
@ -578,7 +589,7 @@ namespace boost {
if (w <= size) if (w <= size)
os.write(str.data(), size); os.write(str.data(), size);
else else
detail::insert_aligned(os, str); detail::sv_insert_aligned(os, str);
os.width(0); os.width(0);
} }
return os; return os;