diff --git a/sprout/functional/hash/hash.hpp b/sprout/functional/hash/hash.hpp index 804ac9de..8fbc194d 100644 --- a/sprout/functional/hash/hash.hpp +++ b/sprout/functional/hash/hash.hpp @@ -26,9 +26,9 @@ namespace sprout { inline SPROUT_CONSTEXPR std::size_t hash_value(unsigned long v); inline SPROUT_CONSTEXPR std::size_t hash_value(long long v); inline SPROUT_CONSTEXPR std::size_t hash_value(unsigned long long v); - //SPROUT_CONSTEXPR std::size_t inline hash_value(float v); - //SPROUT_CONSTEXPR std::size_t inline hash_value(double v); - //SPROUT_CONSTEXPR std::size_t inline hash_value(long double v); + //inline SPROUT_CONSTEXPR std::size_t hash_value(float v); + //inline SPROUT_CONSTEXPR std::size_t hash_value(double v); + //inline SPROUT_CONSTEXPR std::size_t hash_value(long double v); template SPROUT_CONSTEXPR std::size_t hash_value(T*); template diff --git a/sprout/functional/hash/string.hpp b/sprout/functional/hash/string.hpp index eff4f892..9557e27e 100644 --- a/sprout/functional/hash/string.hpp +++ b/sprout/functional/hash/string.hpp @@ -1,17 +1,9 @@ #ifndef SPROUT_FUNCTIONAL_HASH_STRING_HPP #define SPROUT_FUNCTIONAL_HASH_STRING_HPP -#include #include #include -#include - -namespace sprout { - template - SPROUT_CONSTEXPR std::size_t hash_value(sprout::basic_string const& v) { - return sprout::hash_range(v.begin(), v.end()); - } -} // namespace sprout +#include #endif // #ifndef SPROUT_FUNCTIONAL_HASH_STRING_HPP diff --git a/sprout/integer/integer_digits.hpp b/sprout/integer/integer_digits.hpp index e23b8349..3e711da4 100644 --- a/sprout/integer/integer_digits.hpp +++ b/sprout/integer/integer_digits.hpp @@ -8,9 +8,6 @@ namespace sprout { namespace detail { - // - // integer_digits_impl - // template struct integer_digits_impl : public std::integral_constant< @@ -24,7 +21,7 @@ namespace sprout { // // integer_digits // - template + template struct integer_digits; template diff --git a/sprout/string.hpp b/sprout/string.hpp index 87958d13..31ce6ae1 100644 --- a/sprout/string.hpp +++ b/sprout/string.hpp @@ -1,1071 +1,18 @@ #ifndef SPROUT_STRING_HPP #define SPROUT_STRING_HPP -#include -#include -#include -#include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT -#if SPROUT_USE_INDEX_ITERATOR_IMPLEMENTATION -# include -# include -#endif - -namespace sprout { - // - // char_traits - // - template - class char_traits { - private: - typedef std::char_traits impl_type; - public: - typedef typename impl_type::char_type char_type; - typedef typename impl_type::int_type int_type; - typedef typename impl_type::off_type off_type; - typedef typename impl_type::pos_type pos_type; - typedef typename impl_type::state_type state_type; - public: - static void assign(char_type& c1, char_type const& c2) SPROUT_NOEXCEPT { - impl_type::assign(c1, c2); - } - static SPROUT_CONSTEXPR bool eq(char_type c1, char_type c2) SPROUT_NOEXCEPT { - return impl_type::eq(c1, c2); - } - static SPROUT_CONSTEXPR bool lt(char_type c1, char_type c2) SPROUT_NOEXCEPT { - return impl_type::lt(c1, c2); - } - static SPROUT_CONSTEXPR int compare(char_type const* s1, char_type const* s2, std::size_t n) { - return !n ? 0 - : lt(*s1, *s2) ? -1 - : lt(*s2, *s1) ? 1 - : compare(s1 + 1, s2 + 1, n - 1) - ; - } - static SPROUT_CONSTEXPR std::size_t length(char_type const* s) { - return !*s ? 0 - : 1 + length(s + 1) - ; - } - static SPROUT_CONSTEXPR char_type const* find(char_type const* s, std::size_t n, char_type const& a) { - return !n ? nullptr - : eq(*s, a) ? s - : find(s + 1, n - 1, a) - ; - } - static char_type* move(char_type* s1, char_type const* s2, std::size_t n) { - return impl_type::move(s1, s2, n); - } - static char_type* copy(char_type* s1, char_type const* s2, std::size_t n) { - return impl_type::copy(s1, s2, n); - } - static char_type* assign(char_type* s, std::size_t n, char_type a) { - return impl_type::assign(s, n, a); - } - static SPROUT_CONSTEXPR int_type not_eof(int_type c) SPROUT_NOEXCEPT { - return impl_type::not_eof(c); - } - static SPROUT_CONSTEXPR char_type to_char_type(int_type c) SPROUT_NOEXCEPT { - return impl_type::to_char_type(c); - } - static SPROUT_CONSTEXPR int_type to_int_type(char_type c) SPROUT_NOEXCEPT { - return impl_type::to_int_type(c); - } - static SPROUT_CONSTEXPR bool eq_int_type(int_type c1, int_type c2) SPROUT_NOEXCEPT { - return impl_type::eq_int_type(c1, c2); - } - static SPROUT_CONSTEXPR int_type eof() SPROUT_NOEXCEPT { - return impl_type::eof(); - } -#if SPROUT_USE_INDEX_ITERATOR_IMPLEMENTATION - template - static SPROUT_CONSTEXPR int compare(char_type const* s1, ConstIterator s2, std::size_t n) { - return !n ? 0 - : lt(*s1, *s2) ? -1 - : lt(*s2, *s1) ? 1 - : compare(s1 + 1, s2 + 1, n - 1) - ; - } - template - static SPROUT_CONSTEXPR int compare(ConstIterator s1, char_type const* s2, std::size_t n) { - return !n ? 0 - : lt(*s1, *s2) ? -1 - : lt(*s2, *s1) ? 1 - : compare(s1 + 1, s2 + 1, n - 1) - ; - } - template - static SPROUT_CONSTEXPR int compare(ConstIterator1 s1, ConstIterator2 s2, std::size_t n) { - return !n ? 0 - : lt(*s1, *s2) ? -1 - : lt(*s2, *s1) ? 1 - : compare(s1 + 1, s2 + 1, n - 1) - ; - } - template - static SPROUT_CONSTEXPR std::size_t length(ConstIterator s) { - return !*s ? 0 - : 1 + length(s + 1) - ; - } - template - static SPROUT_CONSTEXPR ConstIterator find(ConstIterator s, std::size_t n, char_type const& a) { - return !n ? nullptr - : eq(*s, a) ? s - : find(s + 1, n - 1, a) - ; - } - template - static Iterator move(Iterator s1, ConstIterator s2, std::size_t n) { - std::copy_backward(s2, s2 + n, s1); - return s1; - } - template - static Iterator copy(Iterator s1, ConstIterator s2, std::size_t n) { - std::copy(s2, s2 + n, s1); - return s1; - } - template - static Iterator assign(Iterator s, std::size_t n, char_type a) { - std::fill(s, s + n, a); - return s; - } -#endif - }; - - // - // basic_string - // - template > - class basic_string { - public: - typedef T value_type; -#if SPROUT_USE_INDEX_ITERATOR_IMPLEMENTATION - typedef sprout::index_iterator iterator; - typedef sprout::index_iterator const_iterator; -#else - typedef T* iterator; - typedef T const* const_iterator; -#endif - typedef T& reference; - typedef T const& const_reference; - typedef std::size_t size_type; - typedef std::ptrdiff_t difference_type; - typedef T* pointer; - typedef T const* const_pointer; - typedef sprout::reverse_iterator reverse_iterator; - typedef sprout::reverse_iterator const_reverse_iterator; - typedef Traits traits_type; - public: - SPROUT_STATIC_CONSTEXPR size_type npos = -1; - SPROUT_STATIC_CONSTEXPR size_type static_size = N; - private: - static SPROUT_CONSTEXPR int compare_impl_2(int compared, size_type n1, size_type n2) { - return compared != 0 ? compared - : n1 < n2 ? -1 - : n2 < n1 ? 1 - : 0 - ; - } - static SPROUT_CONSTEXPR int compare_impl_1(value_type const* dest, size_type pos1, size_type n1, value_type const* s, size_type n2) { - return compare_impl_2( - traits_type::compare(dest + pos1, s, NS_SSCRISK_CEL_OR_SPROUT::min(n1, n2)), - n1, - n2 - ); - } - template - static SPROUT_CONSTEXPR basic_string from_c_str_impl( - value_type const* s, - size_type n, - sprout::index_tuple - ) - { - return sprout::basic_string{{(Indexes < n ? s[Indexes] : T())...}, n}; - } -#if SPROUT_USE_INDEX_ITERATOR_IMPLEMENTATION - template - static SPROUT_CONSTEXPR typename std::enable_if< - sprout::is_index_iterator::value, - int - >::type compare_impl_1(value_type const* dest, size_type pos1, size_type n1, ConstIterator s, size_type n2) { - return compare_impl_2( - traits_type::compare(dest + pos1, s, NS_SSCRISK_CEL_OR_SPROUT::min(n1, n2)), - n1, - n2 - ); - } - static SPROUT_CONSTEXPR int compare_impl_1(const_iterator dest, size_type pos1, size_type n1, value_type const* s, size_type n2) { - return compare_impl_2( - traits_type::compare(dest + pos1, s, NS_SSCRISK_CEL_OR_SPROUT::min(n1, n2)), - n1, - n2 - ); - } - template - static SPROUT_CONSTEXPR typename std::enable_if< - sprout::is_index_iterator::value, - int - >::type compare_impl_1(const_iterator dest, size_type pos1, size_type n1, ConstIterator s, size_type n2) { - return compare_impl_2( - traits_type::compare(dest + pos1, s, NS_SSCRISK_CEL_OR_SPROUT::min(n1, n2)), - n1, - n2 - ); - } -#endif - template - static SPROUT_CONSTEXPR basic_string implicit_conversion_impl( - T const(& elems)[M], - size_type len, - sprout::index_tuple - ) - { - return sprout::basic_string{{(Indexes < M - 1 ? elems[Indexes] : T())...}, len}; - } - public: - static SPROUT_CONSTEXPR basic_string from_c_str(value_type const* s, size_type n) { - return !(N < n) - ? from_c_str_impl(s, n, typename sprout::index_range<0, N>::type()) - : throw std::out_of_range("basic_string<>: index out of range") - ; - } - static SPROUT_CONSTEXPR basic_string from_c_str(value_type const* s) { - return from_c_str(s, traits_type::length(s)); - } - public: - value_type elems[static_size + 1]; - size_type len; - public: - // construct/copy/destroy: - template - basic_string& operator=(basic_string const& rhs) { - return assign(rhs); - } - basic_string& operator=(value_type const* rhs) { - return assign(rhs); - } - basic_string& operator=(value_type rhs) { - return assign(1, rhs); - } - // iterators: -#if SPROUT_USE_INDEX_ITERATOR_IMPLEMENTATION - iterator begin() SPROUT_NOEXCEPT { - return iterator(*this, 0); - } - SPROUT_CONSTEXPR const_iterator begin() const SPROUT_NOEXCEPT { - return const_iterator(*this, 0); - } - iterator end() SPROUT_NOEXCEPT { - return iterator(*this, size()); - } - SPROUT_CONSTEXPR const_iterator end() const SPROUT_NOEXCEPT { - return const_iterator(*this, size()); - } -#else - iterator begin() SPROUT_NOEXCEPT { - return &elems[0]; - } - SPROUT_CONSTEXPR const_iterator begin() const SPROUT_NOEXCEPT { - return &elems[0]; - } - iterator end() SPROUT_NOEXCEPT { - return &elems[0] + size(); - } - SPROUT_CONSTEXPR const_iterator end() const SPROUT_NOEXCEPT { - return &elems[0] + size(); - } -#endif - reverse_iterator rbegin() SPROUT_NOEXCEPT { - return const_reverse_iterator(end()); - } - SPROUT_CONSTEXPR const_reverse_iterator rbegin() const SPROUT_NOEXCEPT { - return const_reverse_iterator(end()); - } - reverse_iterator rend() SPROUT_NOEXCEPT { - return const_reverse_iterator(begin()); - } - SPROUT_CONSTEXPR const_reverse_iterator rend() const SPROUT_NOEXCEPT { - return const_reverse_iterator(begin()); - } -#if SPROUT_USE_INDEX_ITERATOR_IMPLEMENTATION - SPROUT_CONSTEXPR const_iterator cbegin() const SPROUT_NOEXCEPT { - return const_iterator(*this, 0); - } - SPROUT_CONSTEXPR const_iterator cend() const SPROUT_NOEXCEPT { - return const_iterator(*this, size()); - } -#else - SPROUT_CONSTEXPR const_iterator cbegin() const SPROUT_NOEXCEPT { - return &elems[0]; - } - SPROUT_CONSTEXPR const_iterator cend() const SPROUT_NOEXCEPT { - return &elems[0] + size(); - } -#endif - SPROUT_CONSTEXPR const_reverse_iterator crbegin() const SPROUT_NOEXCEPT { - return const_reverse_iterator(end()); - } - SPROUT_CONSTEXPR const_reverse_iterator crend() const SPROUT_NOEXCEPT { - return const_reverse_iterator(begin()); - } - // capacity: - SPROUT_CONSTEXPR size_type size() const SPROUT_NOEXCEPT { - return len; - } - SPROUT_CONSTEXPR size_type length() const SPROUT_NOEXCEPT { - return size(); - } - SPROUT_CONSTEXPR size_type max_size() const SPROUT_NOEXCEPT { - return static_size; - } - void resize(size_type n, value_type c) { - maxcheck(n); - if (n > size()) { - traits_type::assign(end(), n - size(), c); - } - traits_type::assign(begin() + n, max_size() - n, value_type()); - len = n; - } - void resize(size_type n) { - resize(n, value_type()); - } - void clear() { - traits_type::assign(begin(), max_size(), value_type()); - len = 0; - } - SPROUT_CONSTEXPR bool empty() const SPROUT_NOEXCEPT { - return size() == 0; - } - // element access: - reference operator[](size_type i) { - return elems[i]; - } - SPROUT_CONSTEXPR const_reference operator[](size_type i) const { - return elems[i]; - } - reference at(size_type i) { - return i < size() - ? elems[i] - : (throw std::out_of_range("basic_string<>: index out of range"), elems[i]) - ; - } - SPROUT_CONSTEXPR const_reference at(size_type i) const { - return i < size() - ? elems[i] - : (throw std::out_of_range("basic_string<>: index out of range"), elems[i]) - ; - } - reference front() { - return elems[0]; - } - SPROUT_CONSTEXPR const_reference front() const { - return elems[0]; - } - reference back() { - return elems[size() - 1]; - } - SPROUT_CONSTEXPR const_reference back() const { - return elems[size() - 1]; - } - // modifiers: - template - basic_string& assign(basic_string const& str) { - return assign(str.begin(), str.size()); - } - template - basic_string& assign(basic_string const& str, size_type pos, size_type n) { - if (str.size() < pos + n) { - throw std::out_of_range("basic_string<>: index out of range"); - } - return assign(str.begin() + pos, n); - } - basic_string& assign(value_type const* s, size_type n) { - maxcheck(n); - for (size_type i = 0; i < n; ++i) { - traits_type::assign(elems[i], s[i]); - } - for (size_type i = n; i < max_size(); ++i) { - traits_type::assign(elems[i], value_type()); - } - len = n; - return *this; - } - basic_string& assign(value_type const* s) { - return assign(s, traits_type::length(s)); - } - basic_string& assign(size_type n, value_type c) { - maxcheck(n); - traits_type::assign(begin(), n, c); - traits_type::assign(begin() + n, max_size() - n, value_type()); - len = n; - return *this; - } - template - basic_string& assign(Iterator first, Iterator last) { - size_type n = 0; - for (; n < max_size() || first != last; ++n, ++first) { - traits_type::assign(elems[n], *first); - } - for (size_type i = n; i < max_size(); ++i) { - traits_type::assign(elems[i], value_type()); - } - len = n; - return *this; - } - void swap(basic_string& other) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(std::swap(std::declval(), std::declval()))) { - std::swap_ranges(other.begin(), other.begin() + other.max_size(), begin()); - { - using std::swap; - swap(len, other.len); - } - } - // string operations: - SPROUT_CONSTEXPR const_pointer c_str() const SPROUT_NOEXCEPT { - return &elems[0]; - } - pointer data() SPROUT_NOEXCEPT { - return &elems[0]; - } - SPROUT_CONSTEXPR const_pointer data() const SPROUT_NOEXCEPT { - return &elems[0]; - } - SPROUT_CONSTEXPR basic_string substr(size_type pos = 0, size_type n = npos) const { - return !(size() < pos) - ? n == npos - ? substr(pos, size() - pos) - : from_c_str(c_str() + pos, n) - : throw std::out_of_range("basic_string<>: index out of range") - ; - } - template - SPROUT_CONSTEXPR int compare(basic_string const& str) const { - return compare(0, size(), str.begin(), str.size()); - } - SPROUT_CONSTEXPR int compare(value_type const* s) const { - return compare(0, size(), s, traits_type::length(s)); - } - template - SPROUT_CONSTEXPR int compare(size_type pos1, size_type n1, basic_string const& str) const { - return compare(pos1, n1, str, 0, npos); - } - SPROUT_CONSTEXPR int compare(size_type pos1, size_type n1, value_type const* s) const { - return compare(pos1, n1, s, traits_type::length(s)); - } - template - SPROUT_CONSTEXPR int compare(size_type pos1, size_type n1, basic_string const& str, size_type pos2, size_type n2) const { - return !(str.size() < pos2) - ? compare(pos1, n1, str.begin() + pos2, NS_SSCRISK_CEL_OR_SPROUT::min(n2, str.size() - pos2)) - : throw std::out_of_range("basic_string<>: index out of range") - ; - } - SPROUT_CONSTEXPR int compare(size_type pos1, size_type n1, value_type const* s, size_type n2) const { - return !(size() < pos1) - ? compare_impl_1(begin(), pos1, NS_SSCRISK_CEL_OR_SPROUT::min(n1, size() - pos1), s, n2) - : throw std::out_of_range("basic_string<>: index out of range") - ; - } - // others: - template N)>::type> - SPROUT_CONSTEXPR operator basic_string() const { - return implicit_conversion_impl( - elems, - len, - typename sprout::index_range<0, N2>::type() - ); - } - pointer c_array() SPROUT_NOEXCEPT { - return &elems[0]; - } - void rangecheck(size_type i) const { - if (i >= size()) { - throw std::out_of_range("basic_string<>: index out of range"); - } - } - void maxcheck(size_type n) const { - if (n > max_size()) { - throw std::out_of_range("basic_string<>: index out of range"); - } - } -#if SPROUT_USE_INDEX_ITERATOR_IMPLEMENTATION - template - typename std::enable_if< - sprout::is_index_iterator::value, - basic_string& - >::type assign(ConstIterator s, size_type n) { - maxcheck(n); - for (size_type i = 0; i < n; ++i) { - traits_type::assign(elems[i], s[i]); - } - for (size_type i = n; i < max_size(); ++i) { - traits_type::assign(elems[i], value_type()); - } - len = n; - return *this; - } - template - typename std::enable_if< - sprout::is_index_iterator::value, - basic_string& - >::type assign(ConstIterator s) { - return assign(s, traits_type::length(s)); - } - template - typename std::enable_if< - sprout::is_index_iterator::value, - basic_string& - >::type operator=(ConstIterator rhs) { - return assign(rhs); - } - template - SPROUT_CONSTEXPR typename std::enable_if< - sprout::is_index_iterator::value, - int - >::type compare(ConstIterator s) const { - return compare(0, size(), s, traits_type::length(s)); - } - template - SPROUT_CONSTEXPR typename std::enable_if< - sprout::is_index_iterator::value, - int - >::type compare(size_type pos1, size_type n1, ConstIterator s) const { - return compare(pos1, n1, s, traits_type::length(s)); - } - template - SPROUT_CONSTEXPR typename std::enable_if< - sprout::is_index_iterator::value, - int - >::type compare(size_type pos1, size_type n1, ConstIterator s, size_type n2) const { - return !(size() < pos1) - ? compare_impl_1(begin(), pos1, NS_SSCRISK_CEL_OR_SPROUT::min(n1, size() - pos1), s, n2) - : throw std::out_of_range("basic_string<>: index out of range") - ; - } -#endif - }; - template - SPROUT_CONSTEXPR typename sprout::basic_string::size_type sprout::basic_string::npos; - template - SPROUT_CONSTEXPR typename sprout::basic_string::size_type sprout::basic_string::static_size; - - // - // operator== - // operator!= - // operator< - // operator> - // operator<= - // operator>= - // - template - inline SPROUT_CONSTEXPR bool operator==(sprout::basic_string const& lhs, sprout::basic_string const& rhs) { - return lhs.compare(rhs) == 0; - } - template - inline SPROUT_CONSTEXPR bool operator==(sprout::basic_string const& lhs, T const* rhs) { - return lhs.compare(rhs) == 0; - } - template - inline SPROUT_CONSTEXPR bool operator==(T const* lhs, sprout::basic_string const& rhs) { - return 0 == rhs.compare(lhs); - } - template - inline SPROUT_CONSTEXPR bool operator!=(sprout::basic_string const& lhs, sprout::basic_string const& rhs) { - return !(lhs == rhs); - } - template - inline SPROUT_CONSTEXPR bool operator!=(sprout::basic_string const& lhs, T const* rhs) { - return !(lhs == rhs); - } - template - inline SPROUT_CONSTEXPR bool operator!=(T const* lhs, sprout::basic_string const& rhs) { - return !(lhs == rhs); - } - template - inline SPROUT_CONSTEXPR bool operator<(sprout::basic_string const& lhs, sprout::basic_string const& rhs) { - return lhs.compare(rhs) < 0; - } - template - inline SPROUT_CONSTEXPR bool operator<(sprout::basic_string const& lhs, T const* rhs) { - return lhs.compare(rhs) < 0; - } - template - inline SPROUT_CONSTEXPR bool operator<(T const* lhs, sprout::basic_string const& rhs) { - return 0 < rhs.compare(lhs); - } - template - inline SPROUT_CONSTEXPR bool operator>(sprout::basic_string const& lhs, sprout::basic_string const& rhs) { - return rhs < lhs; - } - template - inline SPROUT_CONSTEXPR bool operator>(sprout::basic_string const& lhs, T const* rhs) { - return rhs < lhs; - } - template - inline SPROUT_CONSTEXPR bool operator>(T const* lhs, sprout::basic_string const& rhs) { - return rhs < lhs; - } - template - inline SPROUT_CONSTEXPR bool operator<=(sprout::basic_string const& lhs, sprout::basic_string const& rhs) { - return !(rhs < lhs); - } - template - inline SPROUT_CONSTEXPR bool operator<=(sprout::basic_string const& lhs, T const* rhs) { - return !(rhs < lhs); - } - template - inline SPROUT_CONSTEXPR bool operator<=(T const* lhs, sprout::basic_string const& rhs) { - return !(rhs < lhs); - } - template - inline SPROUT_CONSTEXPR bool operator>=(sprout::basic_string const& lhs, sprout::basic_string const& rhs) { - return !(lhs < rhs); - } - template - inline SPROUT_CONSTEXPR bool operator>=(sprout::basic_string const& lhs, T const* rhs) { - return !(lhs < rhs); - } - template - inline SPROUT_CONSTEXPR bool operator>=(T const* lhs, sprout::basic_string const& rhs) { - return !(lhs < rhs); - } - - // - // swap - // - template - inline void swap( - sprout::basic_string& lhs, - sprout::basic_string& rhs - ) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(lhs.swap(rhs))) - { - lhs.swap(rhs); - } - - // - // operator>> - // operator<< - // - template - inline std::basic_istream& operator>>(std::basic_istream& lhs, sprout::basic_string& rhs) { - typedef T elem_type; - typedef StreamTraits traits_type; - typedef std::basic_istream istream_type; - typedef sprout::basic_string string_type; - typedef std::ctype ctype_type; - typedef typename string_type::size_type size_type; - std::ios_base::iostate state = std::ios_base::goodbit; - bool changed = false; - size_type current = 0; - if (typename istream_type::sentry(lhs)) { - ctype_type const& ctype_fac = std::use_facet(lhs.getloc()); - try { - size_type remain = 0 < lhs.width() && static_cast(lhs.width()) < rhs.max_size() - ? static_cast(lhs.width()) - : rhs.max_size() - ; - typename traits_type::int_type meta = lhs.rdbuf()->sgetc(); - for (; remain; --remain, meta = lhs.rdbuf()->snextc()) - if (traits_type::eq_int_type(traits_type::eof(), meta)) { - state |= std::ios_base::eofbit; - break; - } else if (ctype_fac.is(ctype_type::space, traits_type::to_char_type(meta))) { - break; - } else { - rhs[current] = traits_type::to_char_type(meta); - changed = true; - ++current; - } - } catch (...) { - state |= std::ios_base::badbit; - } - } - lhs.width(0); - if (!changed) { - state |= std::ios_base::failbit; - } - lhs.setstate(state); - rhs.len = current; - for (; current != rhs.max_size(); ++current) { - rhs[current] = T(); - } - return lhs; - } - template - inline std::basic_ostream& operator<<(std::basic_ostream& lhs, sprout::basic_string const& rhs) { - return lhs << rhs.c_str(); - } - - namespace detail { - template - struct make_construct_impl; - - template - struct make_construct_impl > { - private: - typedef sprout::basic_string copied_type; - private: - template - static SPROUT_CONSTEXPR copied_type make_impl(typename copied_type::size_type size) { - return copied_type{{}, size}; - } - template - static SPROUT_CONSTEXPR typename std::enable_if< - S == sizeof...(Tail), - copied_type - >::type make_impl(typename copied_type::size_type size, Head&& head, Tail&&... tail) { - return copied_type{{sprout::forward(tail)..., sprout::forward(head)}, size}; - } - template - static SPROUT_CONSTEXPR typename std::enable_if< - S != sizeof...(Tail), - copied_type - >::type make_impl(typename copied_type::size_type size, Head&& head, Tail&&... tail) { - return make_impl(size, sprout::forward(tail)..., S >= size ? T() : sprout::forward(head)); - } - public: - static SPROUT_CONSTEXPR typename copied_type::size_type length() { - return 0; - } - template - static SPROUT_CONSTEXPR typename copied_type::size_type length(T const& head, Tail&&... tail) { - return !head ? 0 : 1 + length(sprout::forward(tail)...); - } - template - static SPROUT_CONSTEXPR copied_type make(typename copied_type::size_type size, Args&&... args) { - return make_impl<0>(size, sprout::forward(args)...); - } - }; - } // namespace detail - - // - // container_construct_traits - // - template - struct container_construct_traits > { - public: - typedef sprout::basic_string copied_type; - public: - template - static SPROUT_CONSTEXPR copied_type deep_copy(Cont&& cont) { - return sprout::forward(cont); - } - template - static SPROUT_CONSTEXPR copied_type make(Args&&... args) { - typedef sprout::detail::make_construct_impl impl_type; - return impl_type::make(impl_type::length(sprout::forward(args)...), sprout::forward(args)...); - } - template - static SPROUT_CONSTEXPR copied_type remake( - Cont&& cont, - typename sprout::container_traits >::difference_type size, - Args&&... args - ) - { - typedef sprout::detail::make_construct_impl impl_type; - return impl_type::make(size, sprout::forward(args)...); - } - }; - - // - // container_transform_traits - // - template - struct container_transform_traits > { - public: - template >::size_type Size> - struct rebind_size { - public: - typedef sprout::basic_string type; - }; - }; - - // - // to_string - // - namespace detail { - template - inline SPROUT_CONSTEXPR sprout::basic_string to_string_impl_1( - T const(& arr)[N], - typename sprout::basic_string::size_type n, - sprout::index_tuple - ) - { - return sprout::basic_string{{(Indexes < n ? arr[Indexes] : T())...}, n}; - } - template - inline SPROUT_CONSTEXPR sprout::basic_string to_string_impl( - T const(& arr)[N], - sprout::index_tuple - ) - { - return to_string_impl_1(arr, sprout::char_traits::length(arr), sprout::index_tuple()); - } - } // namespace detail - template - inline SPROUT_CONSTEXPR sprout::basic_string to_string(T const(& arr)[N]) { - return sprout::detail::to_string_impl(arr, typename sprout::index_range<0, N - 1>::type()); - } - - // - // string_from_c_str - // - template - inline SPROUT_CONSTEXPR sprout::basic_string string_from_c_str(T const* s, std::size_t n) { - return sprout::basic_string::from_c_str(s, n); - } - template - inline SPROUT_CONSTEXPR sprout::basic_string string_from_c_str(T const* s) { - return sprout::basic_string::from_c_str(s); - } - - // - // make_string - // - namespace detail { - template - inline SPROUT_CONSTEXPR sprout::basic_string make_string_impl_1( - sprout::array const& arr, - std::size_t n, - sprout::index_tuple - ) - { - return sprout::basic_string{{(Indexes < n ? arr[Indexes] : T())...}, n}; - } - template - inline SPROUT_CONSTEXPR sprout::basic_string make_string_impl( - sprout::array const& arr, - sprout::index_tuple - ) - { - return sprout::detail::make_string_impl_1( - arr, - sprout::char_traits::length(arr.begin()), - sprout::index_tuple() - ); - } - } // namespace detail - template - inline SPROUT_CONSTEXPR sprout::basic_string::type, 1 + sizeof...(Types)> - make_string(T&& t, Types&&... args) { - return sprout::detail::make_string_impl( - sprout::make_array::type>( - sprout::forward(t), - sprout::forward(args)..., - typename std::decay::type() - ), - typename sprout::index_range<0, 1 + sizeof...(Types)>::type() - ); - } - - // - // make_string_as - // - template - inline SPROUT_CONSTEXPR sprout::basic_string::type, 0> - make_string_as() { - return sprout::basic_string::type, 0>{}; - } - template - inline SPROUT_CONSTEXPR sprout::basic_string::type, sizeof...(Types)> - make_string_as(Types&&... args) { - return sprout::detail::make_string_impl( - sprout::make_array::type>( - sprout::forward(args)..., - typename std::decay::type() - ), - typename sprout::index_range<0, 1 + sizeof...(Types)>::type() - ); - } - - // - // operator+ - // - template - inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::push_back, T>::type operator+( - sprout::basic_string const& lhs, - T const& rhs - ) - { - return sprout::fixed::push_back(lhs, rhs); - } - template - inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::push_front, T>::type operator+( - T const& lhs, - sprout::basic_string const& rhs - ) - { - return sprout::fixed::push_front(rhs, lhs); - } - template - inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::append_back< - sprout::basic_string, - sprout::basic_string - >::type operator+( - sprout::basic_string const& lhs, - T const (& rhs)[N2] - ) - { - return sprout::fixed::append_back(lhs, sprout::to_string(rhs)); - } - template - inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::append_front< - sprout::basic_string, - sprout::basic_string - >::type operator+( - T const (& lhs)[N2], - sprout::basic_string const& rhs - ) - { - return sprout::fixed::append_front(rhs, sprout::to_string(lhs)); - } - template - inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::append_back< - sprout::basic_string, - sprout::basic_string - >::type operator+( - sprout::basic_string const& lhs, - sprout::basic_string const& rhs - ) - { - return sprout::fixed::append_back(lhs, rhs); - } - - // - // string_t - // - template - struct string_t { - public: - typedef sprout::basic_string type; - }; - // - // wstring_t - // - template - struct wstring_t { - public: - typedef sprout::basic_string type; - }; - // - // u16string_t - // - template - struct u16string_t { - public: - typedef sprout::basic_string type; - }; - // - // u32string_t - // - template - struct u32string_t { - public: - typedef sprout::basic_string type; - }; - - // - // is_basic_string - // - template - struct is_basic_string - : public std::false_type - {}; - template - struct is_basic_string - : public sprout::is_basic_string - {}; - template - struct is_basic_string - : public sprout::is_basic_string - {}; - template - struct is_basic_string > - : public std::true_type - {}; - - // - // is_string_of - // - template - struct is_string_of - : public std::false_type - {}; - template - struct is_string_of - : public sprout::is_string_of - {}; - template - struct is_string_of - : public sprout::is_string_of - {}; - template - struct is_string_of, Elem> - : public std::true_type - {}; - - // - // is_string - // - template - struct is_string - : public sprout::is_string_of - {}; - // - // is_wstring - // - template - struct is_wstring - : public sprout::is_string_of - {}; - // - // is_u16string - // - template - struct is_u16string - : public sprout::is_string_of - {}; - // - // is_u32string - // - template - struct is_u32string - : public sprout::is_string_of - {}; -} // namespace sprout - -namespace std { - // - // tuple_size - // - template - struct tuple_size > - : public std::integral_constant - {}; - - // - // tuple_element - // - template - struct tuple_element > { - public: - static_assert(I < N, "tuple_element<>: index out of range"); - typedef T type; - }; -} // namespace std - +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #endif // #ifndef SPROUT_STRING_HPP diff --git a/sprout/string/alias.hpp b/sprout/string/alias.hpp index b80d3a82..d9fd74e4 100644 --- a/sprout/string/alias.hpp +++ b/sprout/string/alias.hpp @@ -2,13 +2,14 @@ #define SPROUT_STRING_ALIAS_HPP #include -#include #if SPROUT_USE_TEMPLATE_ALIASES - -#include +# include +# include +#endif // #if SPROUT_USE_TEMPLATE_ALIASES namespace sprout { +#if SPROUT_USE_TEMPLATE_ALIASES // // string // @@ -29,8 +30,7 @@ namespace sprout { // template using u32string = sprout::basic_string; +#endif // #if SPROUT_USE_TEMPLATE_ALIASES } // namespace sprout -#endif // #if SPROUT_USE_TEMPLATE_ALIASES - #endif // #ifndef SPROUT_STRING_ALIAS_HPP diff --git a/sprout/string/char_traits.hpp b/sprout/string/char_traits.hpp new file mode 100644 index 00000000..40fb91f5 --- /dev/null +++ b/sprout/string/char_traits.hpp @@ -0,0 +1,132 @@ +#ifndef SPROUT_STRING_CHAR_TRAITS_HPP +#define SPROUT_STRING_CHAR_TRAITS_HPP + +#include +#include +#include +#include + +namespace sprout { + // + // char_traits + // + template + class char_traits { + private: + typedef std::char_traits impl_type; + public: + typedef typename impl_type::char_type char_type; + typedef typename impl_type::int_type int_type; + typedef typename impl_type::off_type off_type; + typedef typename impl_type::pos_type pos_type; + typedef typename impl_type::state_type state_type; + public: + static void assign(char_type& c1, char_type const& c2) SPROUT_NOEXCEPT { + impl_type::assign(c1, c2); + } + static SPROUT_CONSTEXPR bool eq(char_type c1, char_type c2) SPROUT_NOEXCEPT { + return impl_type::eq(c1, c2); + } + static SPROUT_CONSTEXPR bool lt(char_type c1, char_type c2) SPROUT_NOEXCEPT { + return impl_type::lt(c1, c2); + } + static SPROUT_CONSTEXPR int compare(char_type const* s1, char_type const* s2, std::size_t n) { + return !n ? 0 + : lt(*s1, *s2) ? -1 + : lt(*s2, *s1) ? 1 + : compare(s1 + 1, s2 + 1, n - 1) + ; + } + static SPROUT_CONSTEXPR std::size_t length(char_type const* s) { + return !*s ? 0 + : 1 + length(s + 1) + ; + } + static SPROUT_CONSTEXPR char_type const* find(char_type const* s, std::size_t n, char_type const& a) { + return !n ? nullptr + : eq(*s, a) ? s + : find(s + 1, n - 1, a) + ; + } + static char_type* move(char_type* s1, char_type const* s2, std::size_t n) { + return impl_type::move(s1, s2, n); + } + static char_type* copy(char_type* s1, char_type const* s2, std::size_t n) { + return impl_type::copy(s1, s2, n); + } + static char_type* assign(char_type* s, std::size_t n, char_type a) { + return impl_type::assign(s, n, a); + } + static SPROUT_CONSTEXPR int_type not_eof(int_type c) SPROUT_NOEXCEPT { + return impl_type::not_eof(c); + } + static SPROUT_CONSTEXPR char_type to_char_type(int_type c) SPROUT_NOEXCEPT { + return impl_type::to_char_type(c); + } + static SPROUT_CONSTEXPR int_type to_int_type(char_type c) SPROUT_NOEXCEPT { + return impl_type::to_int_type(c); + } + static SPROUT_CONSTEXPR bool eq_int_type(int_type c1, int_type c2) SPROUT_NOEXCEPT { + return impl_type::eq_int_type(c1, c2); + } + static SPROUT_CONSTEXPR int_type eof() SPROUT_NOEXCEPT { + return impl_type::eof(); + } +#if SPROUT_USE_INDEX_ITERATOR_IMPLEMENTATION + template + static SPROUT_CONSTEXPR int compare(char_type const* s1, ConstIterator s2, std::size_t n) { + return !n ? 0 + : lt(*s1, *s2) ? -1 + : lt(*s2, *s1) ? 1 + : compare(s1 + 1, s2 + 1, n - 1) + ; + } + template + static SPROUT_CONSTEXPR int compare(ConstIterator s1, char_type const* s2, std::size_t n) { + return !n ? 0 + : lt(*s1, *s2) ? -1 + : lt(*s2, *s1) ? 1 + : compare(s1 + 1, s2 + 1, n - 1) + ; + } + template + static SPROUT_CONSTEXPR int compare(ConstIterator1 s1, ConstIterator2 s2, std::size_t n) { + return !n ? 0 + : lt(*s1, *s2) ? -1 + : lt(*s2, *s1) ? 1 + : compare(s1 + 1, s2 + 1, n - 1) + ; + } + template + static SPROUT_CONSTEXPR std::size_t length(ConstIterator s) { + return !*s ? 0 + : 1 + length(s + 1) + ; + } + template + static SPROUT_CONSTEXPR ConstIterator find(ConstIterator s, std::size_t n, char_type const& a) { + return !n ? nullptr + : eq(*s, a) ? s + : find(s + 1, n - 1, a) + ; + } + template + static Iterator move(Iterator s1, ConstIterator s2, std::size_t n) { + std::copy_backward(s2, s2 + n, s1); + return s1; + } + template + static Iterator copy(Iterator s1, ConstIterator s2, std::size_t n) { + std::copy(s2, s2 + n, s1); + return s1; + } + template + static Iterator assign(Iterator s, std::size_t n, char_type a) { + std::fill(s, s + n, a); + return s; + } +#endif + }; +} // namespace sprout + +#endif // #ifndef SPROUT_STRING_CHAR_TRAITS_HPP diff --git a/sprout/string/comparison.hpp b/sprout/string/comparison.hpp new file mode 100644 index 00000000..bbef6f16 --- /dev/null +++ b/sprout/string/comparison.hpp @@ -0,0 +1,91 @@ +#ifndef SPROUT_STRING_COMPARISON_HPP +#define SPROUT_STRING_COMPARISON_HPP + +#include +#include +#include + +namespace sprout { + // + // operator== + // operator!= + // operator< + // operator> + // operator<= + // operator>= + // + template + inline SPROUT_CONSTEXPR bool operator==(sprout::basic_string const& lhs, sprout::basic_string const& rhs) { + return lhs.compare(rhs) == 0; + } + template + inline SPROUT_CONSTEXPR bool operator==(sprout::basic_string const& lhs, T const* rhs) { + return lhs.compare(rhs) == 0; + } + template + inline SPROUT_CONSTEXPR bool operator==(T const* lhs, sprout::basic_string const& rhs) { + return 0 == rhs.compare(lhs); + } + template + inline SPROUT_CONSTEXPR bool operator!=(sprout::basic_string const& lhs, sprout::basic_string const& rhs) { + return !(lhs == rhs); + } + template + inline SPROUT_CONSTEXPR bool operator!=(sprout::basic_string const& lhs, T const* rhs) { + return !(lhs == rhs); + } + template + inline SPROUT_CONSTEXPR bool operator!=(T const* lhs, sprout::basic_string const& rhs) { + return !(lhs == rhs); + } + template + inline SPROUT_CONSTEXPR bool operator<(sprout::basic_string const& lhs, sprout::basic_string const& rhs) { + return lhs.compare(rhs) < 0; + } + template + inline SPROUT_CONSTEXPR bool operator<(sprout::basic_string const& lhs, T const* rhs) { + return lhs.compare(rhs) < 0; + } + template + inline SPROUT_CONSTEXPR bool operator<(T const* lhs, sprout::basic_string const& rhs) { + return 0 < rhs.compare(lhs); + } + template + inline SPROUT_CONSTEXPR bool operator>(sprout::basic_string const& lhs, sprout::basic_string const& rhs) { + return rhs < lhs; + } + template + inline SPROUT_CONSTEXPR bool operator>(sprout::basic_string const& lhs, T const* rhs) { + return rhs < lhs; + } + template + inline SPROUT_CONSTEXPR bool operator>(T const* lhs, sprout::basic_string const& rhs) { + return rhs < lhs; + } + template + inline SPROUT_CONSTEXPR bool operator<=(sprout::basic_string const& lhs, sprout::basic_string const& rhs) { + return !(rhs < lhs); + } + template + inline SPROUT_CONSTEXPR bool operator<=(sprout::basic_string const& lhs, T const* rhs) { + return !(rhs < lhs); + } + template + inline SPROUT_CONSTEXPR bool operator<=(T const* lhs, sprout::basic_string const& rhs) { + return !(rhs < lhs); + } + template + inline SPROUT_CONSTEXPR bool operator>=(sprout::basic_string const& lhs, sprout::basic_string const& rhs) { + return !(lhs < rhs); + } + template + inline SPROUT_CONSTEXPR bool operator>=(sprout::basic_string const& lhs, T const* rhs) { + return !(lhs < rhs); + } + template + inline SPROUT_CONSTEXPR bool operator>=(T const* lhs, sprout::basic_string const& rhs) { + return !(lhs < rhs); + } +} // namespace sprout + +#endif // #ifndef SPROUT_STRING_COMPARISON_HPP diff --git a/sprout/string/concat.hpp b/sprout/string/concat.hpp new file mode 100644 index 00000000..bfeec563 --- /dev/null +++ b/sprout/string/concat.hpp @@ -0,0 +1,68 @@ +#ifndef SPROUT_STRING_CONCAT_HPP +#define SPROUT_STRING_CONCAT_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sprout { + // + // operator+ + // + template + inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::push_back, T>::type operator+( + sprout::basic_string const& lhs, + T const& rhs + ) + { + return sprout::fixed::push_back(lhs, rhs); + } + template + inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::push_front, T>::type operator+( + T const& lhs, + sprout::basic_string const& rhs + ) + { + return sprout::fixed::push_front(rhs, lhs); + } + template + inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::append_back< + sprout::basic_string, + sprout::basic_string + >::type operator+( + sprout::basic_string const& lhs, + T const (& rhs)[N2] + ) + { + return sprout::fixed::append_back(lhs, sprout::to_string(rhs)); + } + template + inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::append_front< + sprout::basic_string, + sprout::basic_string + >::type operator+( + T const (& lhs)[N2], + sprout::basic_string const& rhs + ) + { + return sprout::fixed::append_front(rhs, sprout::to_string(lhs)); + } + template + inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::append_back< + sprout::basic_string, + sprout::basic_string + >::type operator+( + sprout::basic_string const& lhs, + sprout::basic_string const& rhs + ) + { + return sprout::fixed::append_back(lhs, rhs); + } +} // namespace sprout + +#endif // #ifndef SPROUT_STRING_CONCAT_HPP diff --git a/sprout/string/container.hpp b/sprout/string/container.hpp new file mode 100644 index 00000000..b443153d --- /dev/null +++ b/sprout/string/container.hpp @@ -0,0 +1,54 @@ +#ifndef SPROUT_STRING_CONTAINER_HPP +#define SPROUT_STRING_CONTAINER_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + // + // container_construct_traits + // + template + struct container_construct_traits > { + public: + typedef sprout::basic_string copied_type; + public: + template + static SPROUT_CONSTEXPR copied_type deep_copy(Cont&& cont) { + return sprout::forward(cont); + } + template + static SPROUT_CONSTEXPR copied_type make(Args&&... args) { + typedef sprout::detail::make_construct_impl impl_type; + return impl_type::make(impl_type::length(sprout::forward(args)...), sprout::forward(args)...); + } + template + static SPROUT_CONSTEXPR copied_type remake( + Cont&& cont, + typename sprout::container_traits >::difference_type size, + Args&&... args + ) + { + typedef sprout::detail::make_construct_impl impl_type; + return impl_type::make(size, sprout::forward(args)...); + } + }; + + // + // container_transform_traits + // + template + struct container_transform_traits > { + public: + template >::size_type Size> + struct rebind_size { + public: + typedef sprout::basic_string type; + }; + }; +} // namespace sprout + +#endif // #ifndef SPROUT_STRING_CONTAINER_HPP diff --git a/sprout/string/hash.hpp b/sprout/string/hash.hpp new file mode 100644 index 00000000..4d61a5e1 --- /dev/null +++ b/sprout/string/hash.hpp @@ -0,0 +1,18 @@ +#ifndef SPROUT_STRING_HASH_HPP +#define SPROUT_STRING_HASH_HPP + +#include +#include +#include + +namespace sprout { + // + // hash_value + // + template + SPROUT_CONSTEXPR std::size_t hash_value(sprout::basic_string const& v) { + return sprout::hash_range(v.begin(), v.end()); + } +} // namespace sprout + +#endif // #ifndef SPROUT_STRING_HASH_HPP diff --git a/sprout/string/io.hpp b/sprout/string/io.hpp new file mode 100644 index 00000000..7ae1a389 --- /dev/null +++ b/sprout/string/io.hpp @@ -0,0 +1,65 @@ +#ifndef SPROUT_STRING_IO_HPP +#define SPROUT_STRING_IO_HPP + +#include +#include +#include +#include + +namespace sprout { + // + // operator>> + // operator<< + // + template + inline std::basic_istream& operator>>(std::basic_istream& lhs, sprout::basic_string& rhs) { + typedef T elem_type; + typedef StreamTraits traits_type; + typedef std::basic_istream istream_type; + typedef sprout::basic_string string_type; + typedef std::ctype ctype_type; + typedef typename string_type::size_type size_type; + std::ios_base::iostate state = std::ios_base::goodbit; + bool changed = false; + size_type current = 0; + if (typename istream_type::sentry(lhs)) { + ctype_type const& ctype_fac = std::use_facet(lhs.getloc()); + try { + size_type remain = 0 < lhs.width() && static_cast(lhs.width()) < rhs.max_size() + ? static_cast(lhs.width()) + : rhs.max_size() + ; + typename traits_type::int_type meta = lhs.rdbuf()->sgetc(); + for (; remain; --remain, meta = lhs.rdbuf()->snextc()) + if (traits_type::eq_int_type(traits_type::eof(), meta)) { + state |= std::ios_base::eofbit; + break; + } else if (ctype_fac.is(ctype_type::space, traits_type::to_char_type(meta))) { + break; + } else { + rhs[current] = traits_type::to_char_type(meta); + changed = true; + ++current; + } + } catch (...) { + state |= std::ios_base::badbit; + } + } + lhs.width(0); + if (!changed) { + state |= std::ios_base::failbit; + } + lhs.setstate(state); + rhs.len = current; + for (; current != rhs.max_size(); ++current) { + rhs[current] = T(); + } + return lhs; + } + template + inline std::basic_ostream& operator<<(std::basic_ostream& lhs, sprout::basic_string const& rhs) { + return lhs << rhs.c_str(); + } +} // namespace sprout + +#endif // #ifndef SPROUT_STRING_IO_HPP diff --git a/sprout/string/make_string.hpp b/sprout/string/make_string.hpp new file mode 100644 index 00000000..1bb49c57 --- /dev/null +++ b/sprout/string/make_string.hpp @@ -0,0 +1,74 @@ +#ifndef SPROUT_STRING_MAKE_STRING_HPP +#define SPROUT_STRING_MAKE_STRING_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sprout { + // + // make_string + // + namespace detail { + template + inline SPROUT_CONSTEXPR sprout::basic_string make_string_impl_1( + sprout::array const& arr, + std::size_t n, + sprout::index_tuple + ) + { + return sprout::basic_string{{(Indexes < n ? arr[Indexes] : T())...}, n}; + } + template + inline SPROUT_CONSTEXPR sprout::basic_string make_string_impl( + sprout::array const& arr, + sprout::index_tuple + ) + { + return sprout::detail::make_string_impl_1( + arr, + sprout::char_traits::length(arr.begin()), + sprout::index_tuple() + ); + } + } // namespace detail + template + inline SPROUT_CONSTEXPR sprout::basic_string::type, 1 + sizeof...(Types)> + make_string(T&& t, Types&&... args) { + return sprout::detail::make_string_impl( + sprout::make_array::type>( + sprout::forward(t), + sprout::forward(args)..., + typename std::decay::type() + ), + typename sprout::index_range<0, 1 + sizeof...(Types)>::type() + ); + } + + // + // make_string_as + // + template + inline SPROUT_CONSTEXPR sprout::basic_string::type, 0> + make_string_as() { + return sprout::basic_string::type, 0>{}; + } + template + inline SPROUT_CONSTEXPR sprout::basic_string::type, sizeof...(Types)> + make_string_as(Types&&... args) { + return sprout::detail::make_string_impl( + sprout::make_array::type>( + sprout::forward(args)..., + typename std::decay::type() + ), + typename sprout::index_range<0, 1 + sizeof...(Types)>::type() + ); + } +} // namespace sprout + +#endif // #ifndef SPROUT_STRING_MAKE_STRING_HPP diff --git a/sprout/string/string.hpp b/sprout/string/string.hpp new file mode 100644 index 00000000..4df033e6 --- /dev/null +++ b/sprout/string/string.hpp @@ -0,0 +1,529 @@ +#ifndef SPROUT_STRING_STRING_HPP +#define SPROUT_STRING_STRING_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT +#if SPROUT_USE_INDEX_ITERATOR_IMPLEMENTATION +# include +#endif + +namespace sprout { + // + // basic_string + // + template > + class basic_string { + public: + typedef T value_type; +#if SPROUT_USE_INDEX_ITERATOR_IMPLEMENTATION + typedef sprout::index_iterator iterator; + typedef sprout::index_iterator const_iterator; +#else + typedef T* iterator; + typedef T const* const_iterator; +#endif + typedef T& reference; + typedef T const& const_reference; + typedef std::size_t size_type; + typedef std::ptrdiff_t difference_type; + typedef T* pointer; + typedef T const* const_pointer; + typedef sprout::reverse_iterator reverse_iterator; + typedef sprout::reverse_iterator const_reverse_iterator; + typedef Traits traits_type; + public: + SPROUT_STATIC_CONSTEXPR size_type npos = -1; + SPROUT_STATIC_CONSTEXPR size_type static_size = N; + private: + static SPROUT_CONSTEXPR int compare_impl_2(int compared, size_type n1, size_type n2) { + return compared != 0 ? compared + : n1 < n2 ? -1 + : n2 < n1 ? 1 + : 0 + ; + } + static SPROUT_CONSTEXPR int compare_impl_1(value_type const* dest, size_type pos1, size_type n1, value_type const* s, size_type n2) { + return compare_impl_2( + traits_type::compare(dest + pos1, s, NS_SSCRISK_CEL_OR_SPROUT::min(n1, n2)), + n1, + n2 + ); + } + template + static SPROUT_CONSTEXPR basic_string from_c_str_impl( + value_type const* s, + size_type n, + sprout::index_tuple + ) + { + return sprout::basic_string{{(Indexes < n ? s[Indexes] : T())...}, n}; + } +#if SPROUT_USE_INDEX_ITERATOR_IMPLEMENTATION + template + static SPROUT_CONSTEXPR typename std::enable_if< + sprout::is_index_iterator::value, + int + >::type compare_impl_1(value_type const* dest, size_type pos1, size_type n1, ConstIterator s, size_type n2) { + return compare_impl_2( + traits_type::compare(dest + pos1, s, NS_SSCRISK_CEL_OR_SPROUT::min(n1, n2)), + n1, + n2 + ); + } + static SPROUT_CONSTEXPR int compare_impl_1(const_iterator dest, size_type pos1, size_type n1, value_type const* s, size_type n2) { + return compare_impl_2( + traits_type::compare(dest + pos1, s, NS_SSCRISK_CEL_OR_SPROUT::min(n1, n2)), + n1, + n2 + ); + } + template + static SPROUT_CONSTEXPR typename std::enable_if< + sprout::is_index_iterator::value, + int + >::type compare_impl_1(const_iterator dest, size_type pos1, size_type n1, ConstIterator s, size_type n2) { + return compare_impl_2( + traits_type::compare(dest + pos1, s, NS_SSCRISK_CEL_OR_SPROUT::min(n1, n2)), + n1, + n2 + ); + } +#endif + template + static SPROUT_CONSTEXPR basic_string implicit_conversion_impl( + T const(& elems)[M], + size_type len, + sprout::index_tuple + ) + { + return sprout::basic_string{{(Indexes < M - 1 ? elems[Indexes] : T())...}, len}; + } + public: + static SPROUT_CONSTEXPR basic_string from_c_str(value_type const* s, size_type n) { + return !(N < n) + ? from_c_str_impl(s, n, typename sprout::index_range<0, N>::type()) + : throw std::out_of_range("basic_string<>: index out of range") + ; + } + static SPROUT_CONSTEXPR basic_string from_c_str(value_type const* s) { + return from_c_str(s, traits_type::length(s)); + } + public: + value_type elems[static_size + 1]; + size_type len; + public: + // construct/copy/destroy: + template + basic_string& operator=(basic_string const& rhs) { + return assign(rhs); + } + basic_string& operator=(value_type const* rhs) { + return assign(rhs); + } + basic_string& operator=(value_type rhs) { + return assign(1, rhs); + } + // iterators: +#if SPROUT_USE_INDEX_ITERATOR_IMPLEMENTATION + iterator begin() SPROUT_NOEXCEPT { + return iterator(*this, 0); + } + SPROUT_CONSTEXPR const_iterator begin() const SPROUT_NOEXCEPT { + return const_iterator(*this, 0); + } + iterator end() SPROUT_NOEXCEPT { + return iterator(*this, size()); + } + SPROUT_CONSTEXPR const_iterator end() const SPROUT_NOEXCEPT { + return const_iterator(*this, size()); + } +#else + iterator begin() SPROUT_NOEXCEPT { + return &elems[0]; + } + SPROUT_CONSTEXPR const_iterator begin() const SPROUT_NOEXCEPT { + return &elems[0]; + } + iterator end() SPROUT_NOEXCEPT { + return &elems[0] + size(); + } + SPROUT_CONSTEXPR const_iterator end() const SPROUT_NOEXCEPT { + return &elems[0] + size(); + } +#endif + reverse_iterator rbegin() SPROUT_NOEXCEPT { + return const_reverse_iterator(end()); + } + SPROUT_CONSTEXPR const_reverse_iterator rbegin() const SPROUT_NOEXCEPT { + return const_reverse_iterator(end()); + } + reverse_iterator rend() SPROUT_NOEXCEPT { + return const_reverse_iterator(begin()); + } + SPROUT_CONSTEXPR const_reverse_iterator rend() const SPROUT_NOEXCEPT { + return const_reverse_iterator(begin()); + } +#if SPROUT_USE_INDEX_ITERATOR_IMPLEMENTATION + SPROUT_CONSTEXPR const_iterator cbegin() const SPROUT_NOEXCEPT { + return const_iterator(*this, 0); + } + SPROUT_CONSTEXPR const_iterator cend() const SPROUT_NOEXCEPT { + return const_iterator(*this, size()); + } +#else + SPROUT_CONSTEXPR const_iterator cbegin() const SPROUT_NOEXCEPT { + return &elems[0]; + } + SPROUT_CONSTEXPR const_iterator cend() const SPROUT_NOEXCEPT { + return &elems[0] + size(); + } +#endif + SPROUT_CONSTEXPR const_reverse_iterator crbegin() const SPROUT_NOEXCEPT { + return const_reverse_iterator(end()); + } + SPROUT_CONSTEXPR const_reverse_iterator crend() const SPROUT_NOEXCEPT { + return const_reverse_iterator(begin()); + } + // capacity: + SPROUT_CONSTEXPR size_type size() const SPROUT_NOEXCEPT { + return len; + } + SPROUT_CONSTEXPR size_type length() const SPROUT_NOEXCEPT { + return size(); + } + SPROUT_CONSTEXPR size_type max_size() const SPROUT_NOEXCEPT { + return static_size; + } + void resize(size_type n, value_type c) { + maxcheck(n); + if (n > size()) { + traits_type::assign(end(), n - size(), c); + } + traits_type::assign(begin() + n, max_size() - n, value_type()); + len = n; + } + void resize(size_type n) { + resize(n, value_type()); + } + void clear() { + traits_type::assign(begin(), max_size(), value_type()); + len = 0; + } + SPROUT_CONSTEXPR bool empty() const SPROUT_NOEXCEPT { + return size() == 0; + } + // element access: + reference operator[](size_type i) { + return elems[i]; + } + SPROUT_CONSTEXPR const_reference operator[](size_type i) const { + return elems[i]; + } + reference at(size_type i) { + return i < size() + ? elems[i] + : (throw std::out_of_range("basic_string<>: index out of range"), elems[i]) + ; + } + SPROUT_CONSTEXPR const_reference at(size_type i) const { + return i < size() + ? elems[i] + : (throw std::out_of_range("basic_string<>: index out of range"), elems[i]) + ; + } + reference front() { + return elems[0]; + } + SPROUT_CONSTEXPR const_reference front() const { + return elems[0]; + } + reference back() { + return elems[size() - 1]; + } + SPROUT_CONSTEXPR const_reference back() const { + return elems[size() - 1]; + } + // modifiers: + template + basic_string& assign(basic_string const& str) { + return assign(str.begin(), str.size()); + } + template + basic_string& assign(basic_string const& str, size_type pos, size_type n) { + if (str.size() < pos + n) { + throw std::out_of_range("basic_string<>: index out of range"); + } + return assign(str.begin() + pos, n); + } + basic_string& assign(value_type const* s, size_type n) { + maxcheck(n); + for (size_type i = 0; i < n; ++i) { + traits_type::assign(elems[i], s[i]); + } + for (size_type i = n; i < max_size(); ++i) { + traits_type::assign(elems[i], value_type()); + } + len = n; + return *this; + } + basic_string& assign(value_type const* s) { + return assign(s, traits_type::length(s)); + } + basic_string& assign(size_type n, value_type c) { + maxcheck(n); + traits_type::assign(begin(), n, c); + traits_type::assign(begin() + n, max_size() - n, value_type()); + len = n; + return *this; + } + template + basic_string& assign(Iterator first, Iterator last) { + size_type n = 0; + for (; n < max_size() || first != last; ++n, ++first) { + traits_type::assign(elems[n], *first); + } + for (size_type i = n; i < max_size(); ++i) { + traits_type::assign(elems[i], value_type()); + } + len = n; + return *this; + } + void swap(basic_string& other) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(std::swap(std::declval(), std::declval()))) { + std::swap_ranges(other.begin(), other.begin() + other.max_size(), begin()); + { + using std::swap; + swap(len, other.len); + } + } + // string operations: + SPROUT_CONSTEXPR const_pointer c_str() const SPROUT_NOEXCEPT { + return &elems[0]; + } + pointer data() SPROUT_NOEXCEPT { + return &elems[0]; + } + SPROUT_CONSTEXPR const_pointer data() const SPROUT_NOEXCEPT { + return &elems[0]; + } + SPROUT_CONSTEXPR basic_string substr(size_type pos = 0, size_type n = npos) const { + return !(size() < pos) + ? n == npos + ? substr(pos, size() - pos) + : from_c_str(c_str() + pos, n) + : throw std::out_of_range("basic_string<>: index out of range") + ; + } + template + SPROUT_CONSTEXPR int compare(basic_string const& str) const { + return compare(0, size(), str.begin(), str.size()); + } + SPROUT_CONSTEXPR int compare(value_type const* s) const { + return compare(0, size(), s, traits_type::length(s)); + } + template + SPROUT_CONSTEXPR int compare(size_type pos1, size_type n1, basic_string const& str) const { + return compare(pos1, n1, str, 0, npos); + } + SPROUT_CONSTEXPR int compare(size_type pos1, size_type n1, value_type const* s) const { + return compare(pos1, n1, s, traits_type::length(s)); + } + template + SPROUT_CONSTEXPR int compare(size_type pos1, size_type n1, basic_string const& str, size_type pos2, size_type n2) const { + return !(str.size() < pos2) + ? compare(pos1, n1, str.begin() + pos2, NS_SSCRISK_CEL_OR_SPROUT::min(n2, str.size() - pos2)) + : throw std::out_of_range("basic_string<>: index out of range") + ; + } + SPROUT_CONSTEXPR int compare(size_type pos1, size_type n1, value_type const* s, size_type n2) const { + return !(size() < pos1) + ? compare_impl_1(begin(), pos1, NS_SSCRISK_CEL_OR_SPROUT::min(n1, size() - pos1), s, n2) + : throw std::out_of_range("basic_string<>: index out of range") + ; + } + // others: + template N)>::type> + SPROUT_CONSTEXPR operator basic_string() const { + return implicit_conversion_impl( + elems, + len, + typename sprout::index_range<0, N2>::type() + ); + } + pointer c_array() SPROUT_NOEXCEPT { + return &elems[0]; + } + void rangecheck(size_type i) const { + if (i >= size()) { + throw std::out_of_range("basic_string<>: index out of range"); + } + } + void maxcheck(size_type n) const { + if (n > max_size()) { + throw std::out_of_range("basic_string<>: index out of range"); + } + } +#if SPROUT_USE_INDEX_ITERATOR_IMPLEMENTATION + template + typename std::enable_if< + sprout::is_index_iterator::value, + basic_string& + >::type assign(ConstIterator s, size_type n) { + maxcheck(n); + for (size_type i = 0; i < n; ++i) { + traits_type::assign(elems[i], s[i]); + } + for (size_type i = n; i < max_size(); ++i) { + traits_type::assign(elems[i], value_type()); + } + len = n; + return *this; + } + template + typename std::enable_if< + sprout::is_index_iterator::value, + basic_string& + >::type assign(ConstIterator s) { + return assign(s, traits_type::length(s)); + } + template + typename std::enable_if< + sprout::is_index_iterator::value, + basic_string& + >::type operator=(ConstIterator rhs) { + return assign(rhs); + } + template + SPROUT_CONSTEXPR typename std::enable_if< + sprout::is_index_iterator::value, + int + >::type compare(ConstIterator s) const { + return compare(0, size(), s, traits_type::length(s)); + } + template + SPROUT_CONSTEXPR typename std::enable_if< + sprout::is_index_iterator::value, + int + >::type compare(size_type pos1, size_type n1, ConstIterator s) const { + return compare(pos1, n1, s, traits_type::length(s)); + } + template + SPROUT_CONSTEXPR typename std::enable_if< + sprout::is_index_iterator::value, + int + >::type compare(size_type pos1, size_type n1, ConstIterator s, size_type n2) const { + return !(size() < pos1) + ? compare_impl_1(begin(), pos1, NS_SSCRISK_CEL_OR_SPROUT::min(n1, size() - pos1), s, n2) + : throw std::out_of_range("basic_string<>: index out of range") + ; + } +#endif + }; + template + SPROUT_CONSTEXPR typename sprout::basic_string::size_type sprout::basic_string::npos; + template + SPROUT_CONSTEXPR typename sprout::basic_string::size_type sprout::basic_string::static_size; + + // + // swap + // + template + inline void swap( + sprout::basic_string& lhs, + sprout::basic_string& rhs + ) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(lhs.swap(rhs))) + { + lhs.swap(rhs); + } + + namespace detail { + template + struct make_construct_impl; + + template + struct make_construct_impl > { + private: + typedef sprout::basic_string copied_type; + private: + template + static SPROUT_CONSTEXPR copied_type make_impl(typename copied_type::size_type size) { + return copied_type{{}, size}; + } + template + static SPROUT_CONSTEXPR typename std::enable_if< + S == sizeof...(Tail), + copied_type + >::type make_impl(typename copied_type::size_type size, Head&& head, Tail&&... tail) { + return copied_type{{sprout::forward(tail)..., sprout::forward(head)}, size}; + } + template + static SPROUT_CONSTEXPR typename std::enable_if< + S != sizeof...(Tail), + copied_type + >::type make_impl(typename copied_type::size_type size, Head&& head, Tail&&... tail) { + return make_impl(size, sprout::forward(tail)..., S >= size ? T() : sprout::forward(head)); + } + public: + static SPROUT_CONSTEXPR typename copied_type::size_type length() { + return 0; + } + template + static SPROUT_CONSTEXPR typename copied_type::size_type length(T const& head, Tail&&... tail) { + return !head ? 0 : 1 + length(sprout::forward(tail)...); + } + template + static SPROUT_CONSTEXPR copied_type make(typename copied_type::size_type size, Args&&... args) { + return make_impl<0>(size, sprout::forward(args)...); + } + }; + } // namespace detail + + // + // to_string + // + namespace detail { + template + inline SPROUT_CONSTEXPR sprout::basic_string to_string_impl_1( + T const(& arr)[N], + typename sprout::basic_string::size_type n, + sprout::index_tuple + ) + { + return sprout::basic_string{{(Indexes < n ? arr[Indexes] : T())...}, n}; + } + template + inline SPROUT_CONSTEXPR sprout::basic_string to_string_impl( + T const(& arr)[N], + sprout::index_tuple + ) + { + return to_string_impl_1(arr, sprout::char_traits::length(arr), sprout::index_tuple()); + } + } // namespace detail + template + inline SPROUT_CONSTEXPR sprout::basic_string to_string(T const(& arr)[N]) { + return sprout::detail::to_string_impl(arr, typename sprout::index_range<0, N - 1>::type()); + } + + // + // string_from_c_str + // + template + inline SPROUT_CONSTEXPR sprout::basic_string string_from_c_str(T const* s, std::size_t n) { + return sprout::basic_string::from_c_str(s, n); + } + template + inline SPROUT_CONSTEXPR sprout::basic_string string_from_c_str(T const* s) { + return sprout::basic_string::from_c_str(s); + } +} // namespace sprout + +#endif // #ifndef SPROUT_STRING_STRING_HPP diff --git a/sprout/string/to_string.hpp b/sprout/string/to_string.hpp new file mode 100644 index 00000000..61cdace5 --- /dev/null +++ b/sprout/string/to_string.hpp @@ -0,0 +1,296 @@ +#ifndef SPROUT_STRING_TO_STRING_HPP +#define SPROUT_STRING_TO_STRING_HPP + +#include +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace detail { + template< + typename Elem, + std::size_t Base, + typename IntType, + typename sprout::enabler_if<(Base < 10)>::type = sprout::enabler + > + inline SPROUT_CONSTEXPR Elem int_to_char(IntType val){ + return val >= 0 && val < 10 ? static_cast('0') + val + : throw std::invalid_argument("value out of bounds") + ; + } + template< + typename Elem, + std::size_t Base, + typename IntType, + typename sprout::enabler_if<(Base >= 10 && Base < 36)>::type = sprout::enabler + > + inline SPROUT_CONSTEXPR Elem int_to_char(IntType val){ + return val >= 0 && val < 10 ? static_cast('0') + val + : val >= 10 && val < 36 ? static_cast('a') + (val - 10) + : throw std::invalid_argument("value out of bounds") + ; + } + + template< + typename Elem, + std::size_t Base, + typename IntType, + typename... Args, + typename sprout::enabler_if<(sizeof...(Args) == sprout::integer_digits::value - 1)>::type = sprout::enabler + > + inline SPROUT_CONSTEXPR sprout::basic_string::value> + int_to_string_impl_1(IntType val, bool negative, Args... args) { + return negative ? sprout::make_string_as(static_cast('-'), args...) + : sprout::make_string_as(args...) + ; + } + template< + typename Elem, + std::size_t Base, + typename IntType, + typename... Args, + typename sprout::enabler_if<(sizeof...(Args) < sprout::integer_digits::value - 1)>::type = sprout::enabler + > + inline SPROUT_CONSTEXPR sprout::basic_string::value> + int_to_string_impl_1(IntType val, bool negative, Args... args) { + return val == 0 + ? (negative ? sprout::make_string_as(static_cast('-'), args...) + : sprout::make_string_as(args...) + ) + : sprout::detail::int_to_string_impl_1( + val / Base, + negative, + sprout::detail::int_to_char(val % Base), + args... + ) + ; + } + template + inline SPROUT_CONSTEXPR sprout::basic_string::value> + int_to_string_impl(IntType val) { + return val == 0 ? sprout::make_string_as(static_cast('0')) + : val < 0 ? sprout::detail::int_to_string_impl_1(-val, true) + : sprout::detail::int_to_string_impl_1(val, false) + ; + } + + template< + typename Elem, + std::size_t Base, + typename UIntType, + typename... Args, + typename sprout::enabler_if<(sizeof...(Args) == sprout::integer_digits::value)>::type = sprout::enabler + > + inline SPROUT_CONSTEXPR sprout::basic_string::value> + uint_to_string_impl_1(UIntType val, Args... args) { + return sprout::make_string_as(args...); + } + template< + typename Elem, + std::size_t Base, + typename UIntType, + typename... Args, + typename sprout::enabler_if<(sizeof...(Args) < sprout::integer_digits::value)>::type = sprout::enabler + > + inline SPROUT_CONSTEXPR sprout::basic_string::value> + uint_to_string_impl_1(UIntType val, Args... args) { + return val == 0 + ? sprout::make_string_as(args...) + : sprout::detail::uint_to_string_impl_1( + val / Base, + sprout::detail::int_to_char(val % Base), + args... + ) + ; + } + template + inline SPROUT_CONSTEXPR sprout::basic_string::value> + uint_to_string_impl(UIntType val) { + return val == 0 ? sprout::make_string_as(static_cast('0')) + : sprout::detail::uint_to_string_impl_1(val) + ; + } + + template< + typename Elem, + std::size_t Base, + typename IntType, + typename sprout::enabler_if::value>::type = sprout::enabler + > + inline SPROUT_CONSTEXPR sprout::basic_string::value> + int_to_string(IntType val) { + return sprout::detail::int_to_string_impl(val); + } + template< + typename Elem, + std::size_t Base, + typename IntType, + typename sprout::enabler_if::value>::type = sprout::enabler + > + inline SPROUT_CONSTEXPR sprout::basic_string::value> + int_to_string(IntType val) { + return sprout::detail::uint_to_string_impl(val); + } + } // namespace detail + + // + // int_to_string + // + template< + typename Elem, + std::size_t Base, + typename IntType, + typename sprout::enabler_if::value>::type = sprout::enabler + > + inline SPROUT_CONSTEXPR sprout::basic_string::value> + int_to_string(IntType val) { + return sprout::detail::int_to_string(val); + } + + // + // to_string_of + // + template::value>::type = sprout::enabler> + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_string_of(IntType val) { + return sprout::int_to_string(val); + } + + // + // to_string + // + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_string(int val) { + return sprout::to_string_of(val); + } + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_string(unsigned val) { + return sprout::to_string_of(val); + } + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_string(long val) { + return sprout::to_string_of(val); + } + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_string(unsigned long val) { + return sprout::to_string_of(val); + } + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_string(long long val) { + return sprout::to_string_of(val); + } + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_string(unsigned long long val) { + return sprout::to_string_of(val); + } + template::value>::type = sprout::enabler> + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_string(IntType val) { + return sprout::to_string_of(val); + } + + // + // to_wstring + // + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_wstring(int val) { + return sprout::to_string_of(val); + } + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_wstring(unsigned val) { + return sprout::to_string_of(val); + } + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_wstring(long val) { + return sprout::to_string_of(val); + } + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_wstring(unsigned long val) { + return sprout::to_string_of(val); + } + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_wstring(long long val) { + return sprout::to_string_of(val); + } + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_wstring(unsigned long long val) { + return sprout::to_string_of(val); + } + template::value>::type = sprout::enabler> + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_wstring(IntType val) { + return sprout::to_string_of(val); + } + + // + // to_u16string + // + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_u16string(int val) { + return sprout::to_string_of(val); + } + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_u16string(unsigned val) { + return sprout::to_string_of(val); + } + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_u16string(long val) { + return sprout::to_string_of(val); + } + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_u16string(unsigned long val) { + return sprout::to_string_of(val); + } + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_u16string(long long val) { + return sprout::to_string_of(val); + } + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_u16string(unsigned long long val) { + return sprout::to_string_of(val); + } + template::value>::type = sprout::enabler> + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_u16string(IntType val) { + return sprout::to_string_of(val); + } + + // + // to_u32string + // + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_u32string(int val) { + return sprout::to_string_of(val); + } + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_u32string(unsigned val) { + return sprout::to_string_of(val); + } + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_u32string(long val) { + return sprout::to_string_of(val); + } + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_u32string(unsigned long val) { + return sprout::to_string_of(val); + } + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_u32string(long long val) { + return sprout::to_string_of(val); + } + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_u32string(unsigned long long val) { + return sprout::to_string_of(val); + } + template::value>::type = sprout::enabler> + inline SPROUT_CONSTEXPR sprout::basic_string::value> + to_u32string(IntType val) { + return sprout::to_string_of(val); + } +} // namespace sprout + +#endif // #ifndef SPROUT_STRING_TO_STRING_HPP diff --git a/sprout/string/tuple.hpp b/sprout/string/tuple.hpp new file mode 100644 index 00000000..e139f671 --- /dev/null +++ b/sprout/string/tuple.hpp @@ -0,0 +1,29 @@ +#ifndef SPROUT_STRING_TUPLE_HPP +#define SPROUT_STRING_TUPLE_HPP + +#include +#include +#include +#include + +namespace std { + // + // tuple_size + // + template + struct tuple_size > + : public std::integral_constant + {}; + + // + // tuple_element + // + template + struct tuple_element > { + public: + static_assert(I < N, "tuple_element<>: index out of range"); + typedef T type; + }; +} // namespace std + +#endif // #ifndef SPROUT_STRING_TUPLE_HPP diff --git a/sprout/string/type_traits.hpp b/sprout/string/type_traits.hpp new file mode 100644 index 00000000..599d3888 --- /dev/null +++ b/sprout/string/type_traits.hpp @@ -0,0 +1,113 @@ +#ifndef SPROUT_STRING_TYPE_TRAITS_HPP +#define SPROUT_STRING_TYPE_TRAITS_HPP + +#include +#include +#include +#include + +namespace sprout { + // + // string_t + // + template + struct string_t { + public: + typedef sprout::basic_string type; + }; + // + // wstring_t + // + template + struct wstring_t { + public: + typedef sprout::basic_string type; + }; + // + // u16string_t + // + template + struct u16string_t { + public: + typedef sprout::basic_string type; + }; + // + // u32string_t + // + template + struct u32string_t { + public: + typedef sprout::basic_string type; + }; + + // + // is_basic_string + // + template + struct is_basic_string + : public std::false_type + {}; + template + struct is_basic_string + : public sprout::is_basic_string + {}; + template + struct is_basic_string + : public sprout::is_basic_string + {}; + template + struct is_basic_string > + : public std::true_type + {}; + + // + // is_string_of + // + template + struct is_string_of + : public std::false_type + {}; + template + struct is_string_of + : public sprout::is_string_of + {}; + template + struct is_string_of + : public sprout::is_string_of + {}; + template + struct is_string_of, Elem> + : public std::true_type + {}; + + // + // is_string + // + template + struct is_string + : public sprout::is_string_of + {}; + // + // is_wstring + // + template + struct is_wstring + : public sprout::is_string_of + {}; + // + // is_u16string + // + template + struct is_u16string + : public sprout::is_string_of + {}; + // + // is_u32string + // + template + struct is_u32string + : public sprout::is_string_of + {}; +} // namespace sprout + +#endif // #ifndef SPROUT_STRING_TYPE_TRAITS_HPP