diff --git a/include/boost/container/string.hpp b/include/boost/container/string.hpp index 7399223..65e8859 100644 --- a/include/boost/container/string.hpp +++ b/include/boost/container/string.hpp @@ -93,11 +93,11 @@ class basic_string_base : members_() { init(); } - basic_string_base(const allocator_type& a) + explicit basic_string_base(const allocator_type& a) : members_(a) { init(); } - basic_string_base(BOOST_RV_REF(allocator_type) a) + explicit basic_string_base(BOOST_RV_REF(allocator_type) a) : members_(boost::move(a)) { this->init(); } @@ -108,6 +108,13 @@ class basic_string_base this->allocate_initial_block(n); } + explicit basic_string_base(size_type n) + : members_() + { + this->init(); + this->allocate_initial_block(n); + } + ~basic_string_base() { if(!this->is_short()){ @@ -647,11 +654,10 @@ class basic_string } } - //! Effects: Constructs a basic_string taking the allocator as parameter, + //! Effects: Constructs a basic_string with a default-constructed allocator, //! and is initialized by a specific number of characters of the s string. - basic_string(const basic_string& s, size_type pos, size_type n = npos, - const allocator_type& a = allocator_type()) - : base_t(a) + basic_string(const basic_string& s, size_type pos, size_type n = npos) + : base_t() { this->priv_terminate_string(); if (pos > s.size()) @@ -662,45 +668,105 @@ class basic_string } //! Effects: Constructs a basic_string taking the allocator as parameter, - //! and is initialized by a specific number of characters of the s c-string. - basic_string(const CharT* s, size_type n, const allocator_type& a = allocator_type()) + //! and is initialized by a specific number of characters of the s string. + basic_string(const basic_string& s, size_type pos, size_type n, const allocator_type& a) : base_t(a) + { + this->priv_terminate_string(); + if (pos > s.size()) + throw_out_of_range("basic_string::basic_string out of range position"); + else + this->assign + (s.begin() + pos, s.begin() + pos + container_detail::min_value(n, s.size() - pos)); + } + + //! Effects: Constructs a basic_string taking a default-constructed allocator, + //! and is initialized by a specific number of characters of the s c-string. + basic_string(const CharT* s, size_type n) + : base_t() { this->priv_terminate_string(); this->assign(s, s + n); } //! Effects: Constructs a basic_string taking the allocator as parameter, - //! and is initialized by the null-terminated s c-string. - basic_string(const CharT* s, const allocator_type& a = allocator_type()) + //! and is initialized by a specific number of characters of the s c-string. + basic_string(const CharT* s, size_type n, const allocator_type& a) : base_t(a) + { + this->priv_terminate_string(); + this->assign(s, s + n); + } + + //! Effects: Constructs a basic_string with a default-constructed allocator, + //! and is initialized by the null-terminated s c-string. + basic_string(const CharT* s) + : base_t() { this->priv_terminate_string(); this->assign(s, s + Traits::length(s)); } //! Effects: Constructs a basic_string taking the allocator as parameter, - //! and is initialized by n copies of c. - basic_string(size_type n, CharT c, const allocator_type& a = allocator_type()) + //! and is initialized by the null-terminated s c-string. + basic_string(const CharT* s, const allocator_type& a) : base_t(a) + { + this->priv_terminate_string(); + this->assign(s, s + Traits::length(s)); + } + + + //! Effects: Constructs a basic_string with a default-constructed allocator, + //! and is initialized by n copies of c. + basic_string(size_type n, CharT c) + : base_t() { this->priv_terminate_string(); this->assign(n, c); } //! Effects: Constructs a basic_string taking the allocator as parameter, + //! and is initialized by n copies of c. + basic_string(size_type n, CharT c, const allocator_type& a) + : base_t(a) + { + this->priv_terminate_string(); + this->assign(n, c); + } + + //! Effects: Constructs a basic_string with a default-constructed allocator, //! and is initialized by n default-initialized characters. - basic_string(size_type n, default_init_t, const allocator_type& a = allocator_type()) - : base_t(a, n + 1) + basic_string(size_type n, default_init_t) + : base_t(n + 1) { this->priv_size(n); this->priv_terminate_string(); } //! Effects: Constructs a basic_string taking the allocator as parameter, + //! and is initialized by n default-initialized characters. + basic_string(size_type n, default_init_t, const allocator_type& a) + : base_t(a, n + 1) + { + this->priv_size(n); + this->priv_terminate_string(); + } + + //! Effects: Constructs a basic_string with a default-constructed allocator, //! and a range of iterators. template - basic_string(InputIterator f, InputIterator l, const allocator_type& a = allocator_type()) + basic_string(InputIterator f, InputIterator l) + : base_t() + { + this->priv_terminate_string(); + this->assign(f, l); + } + + //! Effects: Constructs a basic_string taking the allocator as parameter, + //! and a range of iterators. + template + basic_string(InputIterator f, InputIterator l, const allocator_type& a) : base_t(a) { this->priv_terminate_string();