diff --git a/sprout/detail/digits_to_int.hpp b/sprout/detail/digits_to_int.hpp new file mode 100644 index 00000000..d7ff55ed --- /dev/null +++ b/sprout/detail/digits_to_int.hpp @@ -0,0 +1,22 @@ +#ifndef SPROUT_DETAIL_DIGITS_TO_INT_HPP +#define SPROUT_DETAIL_DIGITS_TO_INT_HPP + +#include +#include + +namespace sprout { + namespace detail { + template + struct digits_to_int; + template + struct digits_to_int + : public std::integral_constant + {}; + template + struct digits_to_int + : public std::integral_constant::value> + {}; + } // namespace detail +} // namespace sprout + +#endif // #ifndef SPROUT_DETAIL_DIGITS_TO_INT_HPP diff --git a/sprout/functional/bind.hpp b/sprout/functional/bind.hpp index 022187b2..90dee84f 100644 --- a/sprout/functional/bind.hpp +++ b/sprout/functional/bind.hpp @@ -3,5 +3,7 @@ #include #include +#include +#include #endif // #ifndef SPROUT_FUNCTIONAL_BIND_HPP diff --git a/sprout/functional/bind/bind.hpp b/sprout/functional/bind/bind.hpp index cf620dd5..f1152a47 100644 --- a/sprout/functional/bind/bind.hpp +++ b/sprout/functional/bind/bind.hpp @@ -15,10 +15,14 @@ #include #include #include +#include namespace sprout { // 20.8.9 bind + // + // is_bind_expression + // template struct is_bind_expression : public std::false_type @@ -36,99 +40,6 @@ namespace sprout { : public sprout::is_bind_expression {}; - template - struct is_placeholder - : public std::integral_constant - {}; - template - struct is_placeholder - : public sprout::is_placeholder - {}; - template - struct is_placeholder - : public sprout::is_placeholder - {}; - template - struct is_placeholder - : public sprout::is_placeholder - {}; - - // - // placeholder - // - template - struct placeholder {}; - - namespace placeholders { - namespace { - SPROUT_STATIC_CONSTEXPR sprout::placeholder<1> _1 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<2> _2 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<3> _3 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<4> _4 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<5> _5 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<6> _6 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<7> _7 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<8> _8 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<9> _9 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<10> _10 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<11> _11 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<12> _12 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<13> _13 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<14> _14 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<15> _15 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<16> _16 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<17> _17 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<18> _18 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<19> _19 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<20> _20 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<21> _21 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<22> _22 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<23> _23 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<24> _24 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<25> _25 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<26> _26 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<27> _27 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<28> _28 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<29> _29 = {}; - SPROUT_STATIC_CONSTEXPR sprout::placeholder<30> _30 = {}; - } // anonymous-namespace - } // namespace placeholders - using sprout::placeholders::_1; - using sprout::placeholders::_2; - using sprout::placeholders::_3; - using sprout::placeholders::_4; - using sprout::placeholders::_5; - using sprout::placeholders::_6; - using sprout::placeholders::_7; - using sprout::placeholders::_8; - using sprout::placeholders::_9; - using sprout::placeholders::_10; - using sprout::placeholders::_11; - using sprout::placeholders::_12; - using sprout::placeholders::_13; - using sprout::placeholders::_14; - using sprout::placeholders::_15; - using sprout::placeholders::_16; - using sprout::placeholders::_17; - using sprout::placeholders::_18; - using sprout::placeholders::_19; - using sprout::placeholders::_20; - using sprout::placeholders::_21; - using sprout::placeholders::_2; - using sprout::placeholders::_23; - using sprout::placeholders::_24; - using sprout::placeholders::_25; - using sprout::placeholders::_26; - using sprout::placeholders::_27; - using sprout::placeholders::_28; - using sprout::placeholders::_29; - using sprout::placeholders::_30; - - template - struct is_placeholder > - : public std::integral_constant - {}; - namespace detail { struct no_tuple_element; @@ -509,6 +420,9 @@ namespace sprout { } }; + // + // is_bind_expression + // template struct is_bind_expression > : public std::true_type diff --git a/sprout/functional/bind/placeholder.hpp b/sprout/functional/bind/placeholder.hpp new file mode 100644 index 00000000..541ac947 --- /dev/null +++ b/sprout/functional/bind/placeholder.hpp @@ -0,0 +1,104 @@ +#ifndef SPROUT_FUNCTIONAL_BIND_PLACEHOLDER_HPP +#define SPROUT_FUNCTIONAL_BIND_PLACEHOLDER_HPP + +#include +#include + +namespace sprout { + // + // placeholder + // + template + struct placeholder {}; + + namespace placeholders { + namespace { + SPROUT_STATIC_CONSTEXPR sprout::placeholder<1> _1 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<2> _2 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<3> _3 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<4> _4 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<5> _5 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<6> _6 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<7> _7 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<8> _8 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<9> _9 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<10> _10 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<11> _11 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<12> _12 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<13> _13 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<14> _14 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<15> _15 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<16> _16 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<17> _17 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<18> _18 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<19> _19 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<20> _20 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<21> _21 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<22> _22 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<23> _23 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<24> _24 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<25> _25 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<26> _26 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<27> _27 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<28> _28 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<29> _29 = {}; + SPROUT_STATIC_CONSTEXPR sprout::placeholder<30> _30 = {}; + } // anonymous-namespace + } // namespace placeholders + using sprout::placeholders::_1; + using sprout::placeholders::_2; + using sprout::placeholders::_3; + using sprout::placeholders::_4; + using sprout::placeholders::_5; + using sprout::placeholders::_6; + using sprout::placeholders::_7; + using sprout::placeholders::_8; + using sprout::placeholders::_9; + using sprout::placeholders::_10; + using sprout::placeholders::_11; + using sprout::placeholders::_12; + using sprout::placeholders::_13; + using sprout::placeholders::_14; + using sprout::placeholders::_15; + using sprout::placeholders::_16; + using sprout::placeholders::_17; + using sprout::placeholders::_18; + using sprout::placeholders::_19; + using sprout::placeholders::_20; + using sprout::placeholders::_21; + using sprout::placeholders::_2; + using sprout::placeholders::_23; + using sprout::placeholders::_24; + using sprout::placeholders::_25; + using sprout::placeholders::_26; + using sprout::placeholders::_27; + using sprout::placeholders::_28; + using sprout::placeholders::_29; + using sprout::placeholders::_30; + + // + // is_placeholder + // + template + struct is_placeholder + : public std::integral_constant + {}; + template + struct is_placeholder + : public sprout::is_placeholder + {}; + template + struct is_placeholder + : public sprout::is_placeholder + {}; + template + struct is_placeholder + : public sprout::is_placeholder + {}; + template + struct is_placeholder > + : public std::integral_constant + {}; +} // namespace sprout + +#endif // #ifndef SPROUT_FUNCTIONAL_BIND_PLACEHOLDER_HPP diff --git a/sprout/functional/bind/udl.hpp b/sprout/functional/bind/udl.hpp new file mode 100644 index 00000000..558461bf --- /dev/null +++ b/sprout/functional/bind/udl.hpp @@ -0,0 +1,48 @@ +#ifndef SPROUT_FUNCTIONAL_BIND_UDL_HPP +#define SPROUT_FUNCTIONAL_BIND_UDL_HPP + +#include +#include + +#if SPROUT_USE_USER_DEFINED_LITERALS + +#include +#include + +namespace sprout { + // + // placeholders_result + // + template + struct placeholders_result + : public sprout::identity< + sprout::placeholder::value> + > + {}; + + namespace placeholders { + namespace udl { + // + // _ + // + template + SPROUT_CONSTEXPR typename sprout::placeholders_result::type + operator"" _() { + typedef typename sprout::placeholders_result::type type; + return type(); + } + } // namespace udl + } // namespace placeholders + + namespace udl { + namespace placeholders { + using sprout::placeholders::udl::operator"" _; + } // namespace placeholders + + using sprout::placeholders::udl::operator"" _; + } // namespace udl +} // namespace sprout + +#endif // #if SPROUT_USE_USER_DEFINED_LITERALS + +#endif // #ifndef SPROUT_FUNCTIONAL_BIND_UDL_HPP diff --git a/sprout/functional/ref.hpp b/sprout/functional/ref.hpp index bd231c67..e779d0ab 100644 --- a/sprout/functional/ref.hpp +++ b/sprout/functional/ref.hpp @@ -161,7 +161,7 @@ namespace sprout { // invocation template SPROUT_CONSTEXPR typename std::result_of::type - operator() (Args&&... args) const { + operator()(Args&&... args) const { return (*t_)(sprout::forward(args)...); } }; @@ -285,7 +285,7 @@ namespace sprout { // unwrap_ref // template - inline typename sprout::unwrap_reference::type& + inline SPROUT_CONSTEXPR typename sprout::unwrap_reference::type& unwrap_ref(T& t) { return t; } diff --git a/sprout/index_tuple/udl.hpp b/sprout/index_tuple/udl.hpp index aafdc9db..0855236e 100644 --- a/sprout/index_tuple/udl.hpp +++ b/sprout/index_tuple/udl.hpp @@ -6,33 +6,18 @@ #if SPROUT_USE_USER_DEFINED_LITERALS -#include #include +#include namespace sprout { - namespace detail { - template - struct digits_to_int; - template - struct digits_to_int - : public std::integral_constant - {}; - template - struct digits_to_int - : public std::integral_constant::value> - {}; - } // namespace detail - // // indexes_result + // uindexes_result // template struct indexes_result : public sprout::make_index_tuple::value> {}; - // - // uindexes_result - // template struct uindexes_result : public sprout::make_uindex_tuple::value> @@ -42,16 +27,13 @@ namespace sprout { namespace indexes { // // _indexes + // _uindexes // template SPROUT_CONSTEXPR typename sprout::indexes_result::type operator"" _indexes() { return sprout::indexes_result::make(); } - - // - // _uindexes - // template SPROUT_CONSTEXPR typename sprout::uindexes_result::type operator"" _uindexes() {