string 更新

This commit is contained in:
bolero-MURAKAMI 2011-09-26 10:53:29 +09:00
parent 3f8d532b79
commit 5b1f363589
2 changed files with 81 additions and 12 deletions

View file

@ -400,14 +400,38 @@ namespace sprout {
}; };
}; };
namespace detail {
// //
// make_clone_functor // make_clone_functor_impl
// //
template<typename Container>
struct make_clone_functor_impl;
template<typename T, std::size_t N, typename Traits> template<typename T, std::size_t N, typename Traits>
struct make_clone_functor<sprout::basic_string<T, N, Traits> > { struct make_clone_functor_impl<sprout::basic_string<T, N, Traits> > {
private: private:
typedef typename sprout::fixed_container_traits<sprout::basic_string<T, N, Traits> >::clone_type clone_type; typedef sprout::basic_string<T, N, Traits> container_type;
typedef typename sprout::fixed_container_traits<container_type>::clone_type clone_type;
private: private:
template<std::size_t S>
static SPROUT_CONSTEXPR clone_type make_impl(typename clone_type::size_type size) {
return clone_type{{}, size};
}
template<std::size_t S, typename... Args>
static SPROUT_CONSTEXPR typename std::enable_if<
S != sizeof...(Args),
clone_type
>::type make_impl(typename clone_type::size_type size, T const& head, Args const&... tail) {
return make_impl<S + 1>(size, tail..., S < size ? head : T());
}
template<std::size_t S, typename... Args>
static SPROUT_CONSTEXPR typename std::enable_if<
S == sizeof...(Args),
clone_type
>::type make_impl(typename clone_type::size_type size, T const& head, Args const&... tail) {
return clone_type{{tail..., head}, size};
}
public:
static SPROUT_CONSTEXPR typename clone_type::size_type length() { static SPROUT_CONSTEXPR typename clone_type::size_type length() {
return 0; return 0;
} }
@ -415,10 +439,54 @@ namespace sprout {
static SPROUT_CONSTEXPR typename clone_type::size_type length(T const& head, Tail const&... tail) { static SPROUT_CONSTEXPR typename clone_type::size_type length(T const& head, Tail const&... tail) {
return !head ? 0 : 1 + length(tail...); return !head ? 0 : 1 + length(tail...);
} }
template<typename... Args>
static SPROUT_CONSTEXPR clone_type make(typename clone_type::size_type size, Args const&... args) {
return make_impl<0>(size, args...);
}
};
} // namespace detail
//
// make_clone_functor
//
template<typename T, std::size_t N, typename Traits>
struct make_clone_functor<sprout::basic_string<T, N, Traits> > {
private:
typedef sprout::basic_string<T, N, Traits> container_type;
typedef sprout::detail::make_clone_functor_impl<container_type> impl_type;
public: public:
template<typename... Args> template<typename... Args>
SPROUT_CONSTEXPR clone_type operator()(Args const&... args) const { SPROUT_CONSTEXPR typename sprout::fixed_container_traits<container_type>::clone_type operator()(Args const&... args) const {
return clone_type{{args...}, length(args...)}; return impl_type::make(impl_type::length(args...), args...);
}
};
//
// remake_clone_functor
//
template<typename T, std::size_t N, typename Traits>
struct remake_clone_functor<sprout::basic_string<T, N, Traits> > {
private:
typedef sprout::basic_string<T, N, Traits> container_type;
typedef sprout::detail::make_clone_functor_impl<container_type> impl_type;
public:
template<typename Other, typename... Args>
SPROUT_CONSTEXPR typename sprout::fixed_container_traits<container_type>::clone_type operator()(
Other& other,
typename sprout::fixed_container_traits<container_type>::difference_type size,
Args const&... args
) const
{
return impl_type::make(size, args...);
}
template<typename Other, typename... Args>
SPROUT_CONSTEXPR typename sprout::fixed_container_traits<container_type>::clone_type operator()(
Other const& other,
typename sprout::fixed_container_traits<container_type>::difference_type size,
Args const&... args
) const
{
return impl_type::make(size, args...);
} }
}; };

View file

@ -399,7 +399,7 @@ namespace sprout {
// swap // swap
// //
template<typename Container> template<typename Container>
SPROUT_CONSTEXPR inline void swap(sprout::sub_array<Container>& lhs, sprout::sub_array<Container>& rhs) { inline void swap(sprout::sub_array<Container>& lhs, sprout::sub_array<Container>& rhs) {
lhs.swap(rhs); lhs.swap(rhs);
} }
@ -934,3 +934,4 @@ namespace std {
} // namespace std } // namespace std
#endif // #ifndef SPROUT_SUB_ARRAY_HPP #endif // #ifndef SPROUT_SUB_ARRAY_HPP