diff --git a/sprout/string/char_traits.hpp b/sprout/string/char_traits.hpp index ec0d5365..18da0e67 100644 --- a/sprout/string/char_traits.hpp +++ b/sprout/string/char_traits.hpp @@ -17,6 +17,9 @@ #include #include #include +#include +#include +#include #include #include @@ -71,8 +74,8 @@ namespace sprout { ; } public: - static void assign(char_type& c1, char_type const& c2) SPROUT_NOEXCEPT { - impl_type::assign(c1, c2); + static SPROUT_CXX14_CONSTEXPR void assign(char_type& c1, char_type const& c2) SPROUT_NOEXCEPT { + c1 = c2; } #ifdef SPROUT_NO_CXX11_CHAR_TRAITS static SPROUT_CONSTEXPR bool eq(char_type c1, char_type c2) SPROUT_NOEXCEPT { @@ -110,14 +113,17 @@ namespace sprout { s + n ); } - static char_type* move(char_type* s1, char_type const* s2, std::size_t n) { - return impl_type::move(s1, s2, n); + static SPROUT_CXX14_CONSTEXPR char_type* move(char_type* s1, char_type const* s2, std::size_t n) { + sprout::copy_backward(s2, s2 + n, s1); + return s1; } - static char_type* copy(char_type* s1, char_type const* s2, std::size_t n) { - return impl_type::copy(s1, s2, n); + static SPROUT_CXX14_CONSTEXPR char_type* copy(char_type* s1, char_type const* s2, std::size_t n) { + sprout::copy(s2, s2 + n, s1); + return s1; } - static char_type* assign(char_type* s, std::size_t n, char_type a) { - return impl_type::assign(s, n, a); + static SPROUT_CXX14_CONSTEXPR char_type* assign(char_type* s, std::size_t n, char_type a) { + sprout::fill(s, s + n, a); + return s; } #ifdef SPROUT_NO_CXX11_CHAR_TRAITS static SPROUT_CONSTEXPR int_type not_eof(int_type c) SPROUT_NOEXCEPT { @@ -193,18 +199,18 @@ namespace sprout { ); } template - static OutputIterator move(OutputIterator s1, ConstInputIterator s2, std::size_t n) { - std::copy_backward(s2, s2 + n, s1); + static SPROUT_CXX14_CONSTEXPR OutputIterator move(OutputIterator s1, ConstInputIterator s2, std::size_t n) { + sprout::copy_backward(s2, s2 + n, s1); return s1; } template - static OutputIterator copy(OutputIterator s1, ConstInputIterator s2, std::size_t n) { - std::copy(s2, s2 + n, s1); + static SPROUT_CXX14_CONSTEXPR OutputIterator copy(OutputIterator s1, ConstInputIterator s2, std::size_t n) { + sprout::copy(s2, s2 + n, s1); return s1; } template - static OutputIterator assign(OutputIterator s, std::size_t n, char_type a) { - std::fill(s, s + n, a); + static SPROUT_CXX14_CONSTEXPR OutputIterator assign(OutputIterator s, std::size_t n, char_type a) { + sprout::fill(s, s + n, a); return s; } #endif diff --git a/sprout/string/string.hpp b/sprout/string/string.hpp index 55f8382a..2ca187ef 100644 --- a/sprout/string/string.hpp +++ b/sprout/string/string.hpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -281,14 +282,12 @@ namespace sprout { sprout::detail::string_raw_construct_t(), n, sprout::forward(args)... ) {} - void - maxcheck(size_type n) const { + SPROUT_CXX14_CONSTEXPR void maxcheck(size_type n) const { if (n > static_size) { throw std::out_of_range("basic_string<>: index out of range"); } } - void - lengthcheck(size_type n) const { + SPROUT_CXX14_CONSTEXPR void lengthcheck(size_type n) const { if (n > static_size) { throw std::length_error("basic_string<>: length error"); } @@ -371,26 +370,26 @@ namespace sprout { ) {} - basic_string& + SPROUT_CXX14_CONSTEXPR basic_string& operator=(basic_string const& rhs) { return assign(rhs); } template::type> - basic_string& + SPROUT_CXX14_CONSTEXPR basic_string& operator=(basic_string const& rhs) { return assign(rhs); } - basic_string& + SPROUT_CXX14_CONSTEXPR basic_string& operator=(value_type const* rhs) { return assign(rhs); } - basic_string& + SPROUT_CXX14_CONSTEXPR basic_string& operator=(value_type rhs) { return assign(1, rhs); } // iterators: #if SPROUT_USE_INDEX_ITERATOR_IMPLEMENTATION - iterator + SPROUT_CXX14_CONSTEXPR iterator begin() SPROUT_NOEXCEPT { return iterator(*this, 0); } @@ -398,7 +397,7 @@ namespace sprout { begin() const SPROUT_NOEXCEPT { return const_iterator(*this, 0); } - iterator + SPROUT_CXX14_CONSTEXPR iterator end() SPROUT_NOEXCEPT { return iterator(*this, size()); } @@ -407,7 +406,7 @@ namespace sprout { return const_iterator(*this, size()); } #else - iterator + SPROUT_CXX14_CONSTEXPR iterator begin() SPROUT_NOEXCEPT { return data(); } @@ -415,8 +414,8 @@ namespace sprout { begin() const SPROUT_NOEXCEPT { return data(); } - iterator end() - SPROUT_NOEXCEPT { + SPROUT_CXX14_CONSTEXPR iterator + end() SPROUT_NOEXCEPT { return data() + size(); } SPROUT_CONSTEXPR const_iterator @@ -424,7 +423,7 @@ namespace sprout { return data() + size(); } #endif - reverse_iterator + SPROUT_CXX14_CONSTEXPR reverse_iterator rbegin() SPROUT_NOEXCEPT { return const_reverse_iterator(end()); } @@ -432,7 +431,7 @@ namespace sprout { rbegin() const SPROUT_NOEXCEPT { return const_reverse_iterator(end()); } - reverse_iterator + SPROUT_CXX14_CONSTEXPR reverse_iterator rend() SPROUT_NOEXCEPT { return const_reverse_iterator(begin()); } @@ -480,7 +479,7 @@ namespace sprout { max_size() const SPROUT_NOEXCEPT { return static_size; } - void + SPROUT_CXX14_CONSTEXPR void resize(size_type n, value_type c) { lengthcheck(n); if (n > size()) { @@ -489,11 +488,11 @@ namespace sprout { traits_type::assign(begin() + n, static_size - n, value_type()); len = n; } - void + SPROUT_CXX14_CONSTEXPR void resize(size_type n) { resize(n, value_type()); } - void + SPROUT_CXX14_CONSTEXPR void clear() SPROUT_NOEXCEPT { traits_type::assign(begin(), static_size, value_type()); len = 0; @@ -503,7 +502,7 @@ namespace sprout { return size() == 0; } // element access: - reference + SPROUT_CXX14_CONSTEXPR reference operator[](size_type i) { return elems[i]; } @@ -511,7 +510,7 @@ namespace sprout { operator[](size_type i) const { return elems[i]; } - reference + SPROUT_CXX14_CONSTEXPR reference at(size_type i) { return i < size() ? elems[i] : (throw std::out_of_range("basic_string<>: index out of range"), elems[i]) @@ -523,7 +522,7 @@ namespace sprout { : (throw std::out_of_range("basic_string<>: index out of range"), elems[i]) ; } - reference + SPROUT_CXX14_CONSTEXPR reference front() { return elems[0]; } @@ -531,7 +530,7 @@ namespace sprout { front() const { return elems[0]; } - reference + SPROUT_CXX14_CONSTEXPR reference back() { return elems[size() - 1]; } @@ -541,19 +540,19 @@ namespace sprout { } // modifiers: template - basic_string& + SPROUT_CXX14_CONSTEXPR basic_string& assign(basic_string const& str) { return assign(str, 0, npos); } template - basic_string& + SPROUT_CXX14_CONSTEXPR basic_string& assign(basic_string const& str, size_type pos, size_type n) { if (str.size() < pos) { throw std::out_of_range("basic_string<>: index out of range"); } return assign(str.begin() + pos, NS_SSCRISK_CEL_OR_SPROUT::min(n, str.size() - pos)); } - basic_string& + SPROUT_CXX14_CONSTEXPR basic_string& assign(value_type const* s, size_type n) { lengthcheck(n); for (size_type i = 0; i < n; ++i) { @@ -565,11 +564,11 @@ namespace sprout { len = n; return *this; } - basic_string& + SPROUT_CXX14_CONSTEXPR basic_string& assign(value_type const* s) { return assign(s, traits_type::length(s)); } - basic_string& + SPROUT_CXX14_CONSTEXPR basic_string& assign(size_type n, value_type c) { maxcheck(n); traits_type::assign(begin(), n, c); @@ -578,7 +577,7 @@ namespace sprout { return *this; } template - basic_string& + SPROUT_CXX14_CONSTEXPR basic_string& assign(InputIterator first, InputIterator last) { size_type n = 0; for (; n < static_size || first != last; ++n, ++first) { @@ -590,11 +589,11 @@ namespace sprout { len = n; return *this; } - void + SPROUT_CXX14_CONSTEXPR void swap(basic_string& other) - SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(std::swap(std::declval(), std::declval()))) + SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(sprout::swap(std::declval(), std::declval()))) { - std::swap_ranges(other.begin(), other.begin() + other.max_size(), begin()); + sprout::swap_ranges(other.begin(), other.begin() + other.max_size(), begin()); sprout::swap(len, other.len); } // string operations: @@ -602,7 +601,7 @@ namespace sprout { c_str() const SPROUT_NOEXCEPT { return data(); } - pointer + SPROUT_CXX14_CONSTEXPR pointer data() SPROUT_NOEXCEPT { return &elems[0]; } @@ -610,7 +609,7 @@ namespace sprout { data() const SPROUT_NOEXCEPT { return &elems[0]; } - pointer + SPROUT_CXX14_CONSTEXPR pointer c_array() SPROUT_NOEXCEPT { return &elems[0]; } @@ -765,7 +764,7 @@ namespace sprout { return std::basic_string(data(), size()); } - void + SPROUT_CXX14_CONSTEXPR void rangecheck(size_type i) const { if (i >= size()) { throw std::out_of_range("basic_string<>: index out of range"); @@ -775,7 +774,7 @@ namespace sprout { #if SPROUT_USE_INDEX_ITERATOR_IMPLEMENTATION // construct/copy/destroy (for string iterator): template - typename std::enable_if< + SPROUT_CXX14_CONSTEXPR typename std::enable_if< is_string_iterator::value, basic_string& >::type @@ -785,7 +784,7 @@ namespace sprout { // modifiers (for string iterator): template - typename std::enable_if< + SPROUT_CXX14_CONSTEXPR typename std::enable_if< is_string_iterator::value, basic_string& >::type @@ -801,7 +800,7 @@ namespace sprout { return *this; } template - typename std::enable_if< + SPROUT_CXX14_CONSTEXPR typename std::enable_if< is_string_iterator::value, basic_string& >::type @@ -944,7 +943,7 @@ namespace sprout { // swap // template - inline void + inline SPROUT_CXX14_CONSTEXPR void swap(sprout::basic_string& lhs, sprout::basic_string& rhs) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(lhs.swap(rhs))) {