mirror of
https://github.com/bolero-MURAKAMI/Sprout
synced 2025-08-03 12:49:50 +00:00
SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION をデフォルトで有効に変更
sprout/type/string.hpp 追加
This commit is contained in:
parent
86073fea83
commit
231910c863
43 changed files with 4816 additions and 16 deletions
148
sprout/breed/detail/as_expr.hpp
Normal file
148
sprout/breed/detail/as_expr.hpp
Normal file
|
@ -0,0 +1,148 @@
|
|||
#ifndef SPROUT_BREED_DETAIL_AS_EXPR_HPP
|
||||
#define SPROUT_BREED_DETAIL_AS_EXPR_HPP
|
||||
|
||||
#include <type_traits>
|
||||
#include <sprout/config.hpp>
|
||||
#include <sprout/breed/breed_fwd.hpp>
|
||||
#include <sprout/breed/args.hpp>
|
||||
|
||||
namespace sprout {
|
||||
namespace breed {
|
||||
namespace detail {
|
||||
template<typename Generator>
|
||||
struct base_generator {
|
||||
public:
|
||||
typedef Generator type;
|
||||
};
|
||||
template<typename Generator>
|
||||
struct base_generator<sprout::breed::use_basic_expr<Generator> > {
|
||||
public:
|
||||
typedef Generator type;
|
||||
};
|
||||
|
||||
template<typename T, typename Generator, bool WantsBasicExpr>
|
||||
struct as_expr;
|
||||
template<typename T, typename Generator>
|
||||
struct as_expr<T, Generator, false> {
|
||||
public:
|
||||
typedef typename sprout::breed::detail::term_traits<T const&>::value_type value_type;
|
||||
typedef sprout::breed::expr<
|
||||
sprout::breed::tag::terminal,
|
||||
sprout::breed::term<value_type>,
|
||||
0
|
||||
> expr_type;
|
||||
typedef typename Generator::template result<Generator(expr_type)>::type result_type;
|
||||
public:
|
||||
SPROUT_CONSTEXPR result_type operator()(T const& t) const {
|
||||
return Generator()(expr_type::make(t));
|
||||
}
|
||||
};
|
||||
template<typename T, typename Generator>
|
||||
struct as_expr<T, Generator, true> {
|
||||
public:
|
||||
typedef typename sprout::breed::detail::term_traits<T const&>::value_type value_type;
|
||||
typedef sprout::breed::basic_expr<
|
||||
sprout::breed::tag::terminal,
|
||||
sprout::breed::term<value_type>,
|
||||
0
|
||||
> expr_type;
|
||||
typedef typename Generator::template result<Generator(expr_type)>::type result_type;
|
||||
public:
|
||||
SPROUT_CONSTEXPR result_type operator()(T const& t) const {
|
||||
return Generator()(expr_type::make(t));
|
||||
}
|
||||
};
|
||||
template<typename T>
|
||||
struct as_expr<T, sprout::breed::default_generator, false> {
|
||||
public:
|
||||
typedef typename sprout::breed::detail::term_traits<T const&>::value_type value_type;
|
||||
typedef sprout::breed::expr<
|
||||
sprout::breed::tag::terminal,
|
||||
sprout::breed::term<value_type>,
|
||||
0
|
||||
> result_type;
|
||||
public:
|
||||
SPROUT_CONSTEXPR result_type operator()(T const& t) const {
|
||||
return result_type::make(t);
|
||||
}
|
||||
};
|
||||
template<typename T>
|
||||
struct as_expr<T, sprout::breed::default_generator, true> {
|
||||
public:
|
||||
typedef typename sprout::breed::detail::term_traits<T const&>::value_type value_type;
|
||||
typedef sprout::breed::basic_expr<
|
||||
sprout::breed::tag::terminal,
|
||||
sprout::breed::term<value_type>,
|
||||
0
|
||||
> result_type;
|
||||
public:
|
||||
SPROUT_CONSTEXPR result_type operator()(T const& t) const {
|
||||
return result_type::make(t);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T, typename Generator, bool WantsBasicExpr>
|
||||
struct as_child;
|
||||
template<typename T, typename Generator>
|
||||
struct as_child<T, Generator, false> {
|
||||
public:
|
||||
typedef T const& reference;
|
||||
typedef sprout::breed::expr<
|
||||
sprout::breed::tag::terminal,
|
||||
sprout::breed::term<reference>,
|
||||
0
|
||||
> expr_type;
|
||||
typedef typename Generator::template result<Generator(expr_type)>::type result_type;
|
||||
public:
|
||||
SPROUT_CONSTEXPR result_type operator()(T const& t) const {
|
||||
return Generator()(expr_type::make(t));
|
||||
}
|
||||
};
|
||||
template<typename T, typename Generator>
|
||||
struct as_child<T, Generator, true> {
|
||||
public:
|
||||
typedef T const& reference;
|
||||
typedef sprout::breed::basic_expr<
|
||||
sprout::breed::tag::terminal,
|
||||
sprout::breed::term<reference>,
|
||||
0
|
||||
> expr_type;
|
||||
typedef typename Generator::template result<Generator(expr_type)>::type result_type;
|
||||
public:
|
||||
SPROUT_CONSTEXPR result_type operator()(T const& t) const {
|
||||
return Generator()(expr_type::make(t));
|
||||
}
|
||||
};
|
||||
template<typename T>
|
||||
struct as_child<T, sprout::breed::default_generator, false> {
|
||||
public:
|
||||
typedef T const& reference;
|
||||
typedef sprout::breed::expr<
|
||||
sprout::breed::tag::terminal,
|
||||
sprout::breed::term<reference>,
|
||||
0
|
||||
> result_type;
|
||||
public:
|
||||
SPROUT_CONSTEXPR result_type operator()(T const& t) const {
|
||||
return result_type::make(t);
|
||||
}
|
||||
};
|
||||
template<typename T>
|
||||
struct as_child<T, sprout::breed::default_generator, true> {
|
||||
public:
|
||||
typedef T const& reference;
|
||||
typedef sprout::breed::basic_expr<
|
||||
sprout::breed::tag::terminal,
|
||||
sprout::breed::term<reference>,
|
||||
0
|
||||
> result_type;
|
||||
public:
|
||||
SPROUT_CONSTEXPR result_type operator()(T const& t) const {
|
||||
return result_type::make(t);
|
||||
}
|
||||
};
|
||||
} // namespace detail
|
||||
} // namespace breed
|
||||
} // namespace sprout
|
||||
|
||||
#endif // #ifndef SPROUT_BREED_DETAIL_AS_EXPR_HPP
|
226
sprout/breed/detail/deduce_domain.hpp
Normal file
226
sprout/breed/detail/deduce_domain.hpp
Normal file
|
@ -0,0 +1,226 @@
|
|||
#ifndef SPROUT_BREED_DETAIL_DEDUCE_DOMAIN_HPP
|
||||
#define SPROUT_BREED_DETAIL_DEDUCE_DOMAIN_HPP
|
||||
|
||||
#include <type_traits>
|
||||
#include <sprout/config.hpp>
|
||||
#include <sprout/index_tuple.hpp>
|
||||
#include <sprout/utility/pack.hpp>
|
||||
#include <sprout/breed/breed_fwd.hpp>
|
||||
|
||||
//
|
||||
// SPROUT_BREED_ASSERT_VALID_DOMAIN
|
||||
//
|
||||
#ifndef SPROUT_BREED_ASSERT_VALID_DOMAIN
|
||||
# define SPROUT_BREED_ASSERT_VALID_DOMAIN(DOM) static_assert( \
|
||||
!std::is_same<DOM, sprout::breed::detail::not_a_domain>::value, \
|
||||
"!std::is_same<DOM, sprout::breed::detail::not_a_domain>::value" \
|
||||
)
|
||||
#endif
|
||||
|
||||
namespace sprout {
|
||||
namespace breed {
|
||||
namespace detail {
|
||||
template<typename Domain>
|
||||
struct domain_
|
||||
: public domain_<typename Domain::breed_super_domain>
|
||||
{
|
||||
public:
|
||||
typedef Domain type;
|
||||
typedef domain_<typename Domain::breed_super_domain> base;
|
||||
public:
|
||||
using base::deduce_;
|
||||
static SPROUT_CONSTEXPR type deduce_(domain_<Domain> const*);
|
||||
};
|
||||
template<>
|
||||
struct domain_<sprout::breed::detail::not_a_domain> {
|
||||
public:
|
||||
typedef sprout::breed::detail::not_a_domain type;
|
||||
public:
|
||||
static type deduce_(void const*);
|
||||
};
|
||||
|
||||
template<>
|
||||
struct domain_<sprout::breed::default_domain>
|
||||
: public domain_<sprout::breed::detail::not_a_domain>
|
||||
{};
|
||||
|
||||
template<>
|
||||
struct domain_<sprout::breed::basic_default_domain>
|
||||
: public domain_<sprout::breed::detail::not_a_domain>
|
||||
{};
|
||||
|
||||
sprout::breed::detail::sized_type<1>::type default_test(
|
||||
void const*,
|
||||
void const*
|
||||
);
|
||||
sprout::breed::detail::sized_type<2>::type default_test(
|
||||
sprout::breed::detail::domain_<sprout::breed::default_domain> const*,
|
||||
void const*
|
||||
);
|
||||
sprout::breed::detail::sized_type<2>::type default_test(
|
||||
sprout::breed::detail::domain_<sprout::breed::basic_default_domain> const*, void const*
|
||||
);
|
||||
sprout::breed::detail::sized_type<3>::type default_test(
|
||||
void const*,
|
||||
sprout::breed::detail::domain_<sprout::breed::default_domain> const*
|
||||
);
|
||||
sprout::breed::detail::sized_type<3>::type default_test(
|
||||
void const*,
|
||||
sprout::breed::detail::domain_<sprout::breed::basic_default_domain> const*
|
||||
);
|
||||
sprout::breed::detail::sized_type<4>::type default_test(
|
||||
sprout::breed::detail::domain_<sprout::breed::default_domain> const*,
|
||||
sprout::breed::detail::domain_<sprout::breed::default_domain> const*
|
||||
);
|
||||
sprout::breed::detail::sized_type<4>::type default_test(
|
||||
sprout::breed::detail::domain_<sprout::breed::basic_default_domain> const*,
|
||||
sprout::breed::detail::domain_<sprout::breed::default_domain> const*
|
||||
);
|
||||
sprout::breed::detail::sized_type<4>::type default_test(
|
||||
sprout::breed::detail::domain_<sprout::breed::default_domain> const*,
|
||||
sprout::breed::detail::domain_<sprout::breed::basic_default_domain> const*
|
||||
);
|
||||
sprout::breed::detail::sized_type<4>::type default_test(
|
||||
sprout::breed::detail::domain_<sprout::breed::basic_default_domain> const*,
|
||||
sprout::breed::detail::domain_<sprout::breed::basic_default_domain> const*
|
||||
);
|
||||
|
||||
template<typename D0>
|
||||
struct common_domain1 {
|
||||
public:
|
||||
typedef D0 type;
|
||||
};
|
||||
|
||||
template<typename E0>
|
||||
struct deduce_domain1
|
||||
: public sprout::breed::domain_of<E0>
|
||||
{};
|
||||
|
||||
template<
|
||||
typename D0,
|
||||
typename D1,
|
||||
int DefaultCase = sizeof(
|
||||
sprout::breed::detail::default_test(
|
||||
static_cast<sprout::breed::detail::domain_<D0> const*>(0),
|
||||
static_cast<sprout::breed::detail::domain_<D1> const*>(0)
|
||||
)
|
||||
)
|
||||
>
|
||||
struct common_domain2 {
|
||||
public:
|
||||
typedef decltype(sprout::breed::detail::domain_<D0>::deduce_(
|
||||
static_cast<sprout::breed::detail::domain_<D1> const*>(0)
|
||||
)) type;
|
||||
};
|
||||
template<typename D0, typename D1>
|
||||
struct common_domain2<D0, D1, 2> {
|
||||
public:
|
||||
typedef D1 type;
|
||||
};
|
||||
template<typename D0, typename D1>
|
||||
struct common_domain2<D0, D1, 3> {
|
||||
public:
|
||||
typedef D0 type;
|
||||
};
|
||||
template<typename D0>
|
||||
struct common_domain2<D0, sprout::breed::default_domain, 4> {
|
||||
public:
|
||||
typedef D0 type;
|
||||
};
|
||||
template<typename D0>
|
||||
struct common_domain2<D0, sprout::breed::basic_default_domain, 4> {
|
||||
public:
|
||||
typedef D0 type;
|
||||
};
|
||||
template<typename D1>
|
||||
struct common_domain2<sprout::breed::default_domain, D1, 4> {
|
||||
public:
|
||||
typedef D1 type;
|
||||
};
|
||||
template<typename D1>
|
||||
struct common_domain2<sprout::breed::basic_default_domain, D1, 4> {
|
||||
public:
|
||||
typedef D1 type;
|
||||
};
|
||||
template<>
|
||||
struct common_domain2<sprout::breed::default_domain, sprout::breed::default_domain, 4> {
|
||||
public:
|
||||
typedef sprout::breed::default_domain type;
|
||||
};
|
||||
template<>
|
||||
struct common_domain2<sprout::breed::basic_default_domain, sprout::breed::default_domain, 4> {
|
||||
public:
|
||||
typedef sprout::breed::default_domain type;
|
||||
};
|
||||
template<>
|
||||
struct common_domain2<sprout::breed::default_domain, sprout::breed::basic_default_domain, 4> {
|
||||
public:
|
||||
typedef sprout::breed::default_domain type;
|
||||
};
|
||||
template<>
|
||||
struct common_domain2<sprout::breed::basic_default_domain, sprout::breed::basic_default_domain, 4> {
|
||||
public:
|
||||
typedef sprout::breed::basic_default_domain type;
|
||||
};
|
||||
|
||||
template<typename E0, typename E1>
|
||||
struct deduce_domain2
|
||||
: public common_domain2<
|
||||
typename sprout::breed::domain_of<E0>::type,
|
||||
typename sprout::breed::domain_of<E1>::type
|
||||
>
|
||||
{};
|
||||
|
||||
template<typename... Args>
|
||||
struct common_domain {
|
||||
private:
|
||||
template<typename Common, typename Head, typename... Tail>
|
||||
struct common_impl {
|
||||
public:
|
||||
typedef typename common_impl<
|
||||
typename sprout::breed::detail::common_domain2<Common, Head>::type,
|
||||
Tail...
|
||||
>::type type;
|
||||
};
|
||||
template<typename Common, typename Head>
|
||||
struct common_impl<Common, Head> {
|
||||
public:
|
||||
typedef typename sprout::breed::detail::common_domain2<Common, Head>::type type;
|
||||
};
|
||||
public:
|
||||
template<typename Head, typename... Tail>
|
||||
struct common
|
||||
: public common_impl<Head, Tail...>
|
||||
{};
|
||||
template<typename Head>
|
||||
struct common<Head>
|
||||
: public sprout::breed::detail::common_domain1<Head>
|
||||
{};
|
||||
public:
|
||||
typedef typename common<Args...>::type type;
|
||||
SPROUT_BREED_ASSERT_VALID_DOMAIN(type);
|
||||
};
|
||||
|
||||
template<typename IndexTuple, typename... Args>
|
||||
struct deduce_domain_impl;
|
||||
template<typename... Args, std::ptrdiff_t... Indexes>
|
||||
struct deduce_domain_impl<sprout::index_tuple<Indexes...>, Args...>
|
||||
: public sprout::breed::detail::common_domain<
|
||||
typename sprout::breed::domain_of<
|
||||
typename sprout::tppack_at<Indexes, Args...>::type
|
||||
>::type...
|
||||
>
|
||||
{};
|
||||
|
||||
template<typename... Args>
|
||||
struct deduce_domain
|
||||
: public sprout::breed::detail::deduce_domain_impl<
|
||||
typename sprout::index_range<0, sizeof...(Args)>::type,
|
||||
Args...
|
||||
>
|
||||
{};
|
||||
} // namespace detail
|
||||
} // namespace breed
|
||||
} // namespace sprout
|
||||
|
||||
#endif // #ifndef SPROUT_BREED_DETAIL_DEDUCE_DOMAIN_HPP
|
18
sprout/breed/detail/std_result_of.hpp
Normal file
18
sprout/breed/detail/std_result_of.hpp
Normal file
|
@ -0,0 +1,18 @@
|
|||
#ifndef SPROUT_BREED_DETAIL_STD_RESULT_OF_HPP
|
||||
#define SPROUT_BREED_DETAIL_STD_RESULT_OF_HPP
|
||||
|
||||
#include <type_traits>
|
||||
#include <sprout/config.hpp>
|
||||
|
||||
namespace sprout {
|
||||
namespace breed {
|
||||
namespace detail {
|
||||
template<typename F>
|
||||
struct std_result_of
|
||||
: public std::result_of<F>
|
||||
{};
|
||||
} // namespace detail
|
||||
} // namespace breed
|
||||
} // namespace sprout
|
||||
|
||||
#endif // #ifndef SPROUT_BREED_DETAIL_STD_RESULT_OF_HPP
|
25
sprout/breed/detail/template_arity.hpp
Normal file
25
sprout/breed/detail/template_arity.hpp
Normal file
|
@ -0,0 +1,25 @@
|
|||
#ifndef SPROUT_BREED_DETAIL_TEMPLATE_ARITY_HPP
|
||||
#define SPROUT_BREED_DETAIL_TEMPLATE_ARITY_HPP
|
||||
|
||||
#include <type_traits>
|
||||
#include <sprout/config.hpp>
|
||||
|
||||
namespace sprout {
|
||||
namespace breed {
|
||||
namespace detail {
|
||||
template<typename F>
|
||||
struct template_arity_impl;
|
||||
template<template<typename...> class F, typename... Args>
|
||||
struct template_arity_impl<F<Args...> >
|
||||
: public std::integral_constant<int, sizeof...(Args)>
|
||||
{};
|
||||
|
||||
template<typename F>
|
||||
struct template_arity
|
||||
: public sprout::breed::detail::template_arity_impl<F>
|
||||
{};
|
||||
} // namespace detail
|
||||
} // namespace breed
|
||||
} // namespace sprout
|
||||
|
||||
#endif // #ifndef SPROUT_BREED_DETAIL_TEMPLATE_ARITY_HPP
|
Loading…
Add table
Add a link
Reference in a new issue