mirror of
https://github.com/bolero-MURAKAMI/Sprout.git
synced 2024-12-23 21:25:49 +00:00
add _ placeholder User-defined literals
This commit is contained in:
parent
50f2ba6e31
commit
2f86a59273
7 changed files with 188 additions and 116 deletions
22
sprout/detail/digits_to_int.hpp
Normal file
22
sprout/detail/digits_to_int.hpp
Normal file
|
@ -0,0 +1,22 @@
|
|||
#ifndef SPROUT_DETAIL_DIGITS_TO_INT_HPP
|
||||
#define SPROUT_DETAIL_DIGITS_TO_INT_HPP
|
||||
|
||||
#include <type_traits>
|
||||
#include <sprout/config.hpp>
|
||||
|
||||
namespace sprout {
|
||||
namespace detail {
|
||||
template<typename IntType, char... Chars>
|
||||
struct digits_to_int;
|
||||
template<typename IntType, char C>
|
||||
struct digits_to_int<IntType, C>
|
||||
: public std::integral_constant<IntType, IntType(C - 48)>
|
||||
{};
|
||||
template<typename IntType, char Head, char... Tail>
|
||||
struct digits_to_int<IntType, Head, Tail...>
|
||||
: public std::integral_constant<IntType, 10 * IntType(Head - 48) + sprout::detail::digits_to_int<IntType, Tail...>::value>
|
||||
{};
|
||||
} // namespace detail
|
||||
} // namespace sprout
|
||||
|
||||
#endif // #ifndef SPROUT_DETAIL_DIGITS_TO_INT_HPP
|
|
@ -3,5 +3,7 @@
|
|||
|
||||
#include <sprout/config.hpp>
|
||||
#include <sprout/functional/bind/bind.hpp>
|
||||
#include <sprout/functional/bind/placeholder.hpp>
|
||||
#include <sprout/functional/bind/udl.hpp>
|
||||
|
||||
#endif // #ifndef SPROUT_FUNCTIONAL_BIND_HPP
|
||||
|
|
|
@ -15,10 +15,14 @@
|
|||
#include <sprout/functional/ref.hpp>
|
||||
#include <sprout/functional/mem_fn.hpp>
|
||||
#include <sprout/functional/type_traits/weak_result_type.hpp>
|
||||
#include <sprout/functional/bind/placeholder.hpp>
|
||||
|
||||
namespace sprout {
|
||||
// 20.8.9 bind
|
||||
|
||||
//
|
||||
// is_bind_expression
|
||||
//
|
||||
template<typename T>
|
||||
struct is_bind_expression
|
||||
: public std::false_type
|
||||
|
@ -36,99 +40,6 @@ namespace sprout {
|
|||
: public sprout::is_bind_expression<T>
|
||||
{};
|
||||
|
||||
template<typename T>
|
||||
struct is_placeholder
|
||||
: public std::integral_constant<int, 0>
|
||||
{};
|
||||
template<typename T>
|
||||
struct is_placeholder<T const>
|
||||
: public sprout::is_placeholder<T>
|
||||
{};
|
||||
template<typename T>
|
||||
struct is_placeholder<T volatile>
|
||||
: public sprout::is_placeholder<T>
|
||||
{};
|
||||
template<typename T>
|
||||
struct is_placeholder<T const volatile>
|
||||
: public sprout::is_placeholder<T>
|
||||
{};
|
||||
|
||||
//
|
||||
// placeholder
|
||||
//
|
||||
template<int N>
|
||||
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<int N>
|
||||
struct is_placeholder<sprout::placeholder<N> >
|
||||
: public std::integral_constant<int, N>
|
||||
{};
|
||||
|
||||
namespace detail {
|
||||
struct no_tuple_element;
|
||||
|
||||
|
@ -509,6 +420,9 @@ namespace sprout {
|
|||
}
|
||||
};
|
||||
|
||||
//
|
||||
// is_bind_expression
|
||||
//
|
||||
template<typename Signature>
|
||||
struct is_bind_expression<sprout::binder<Signature> >
|
||||
: public std::true_type
|
||||
|
|
104
sprout/functional/bind/placeholder.hpp
Normal file
104
sprout/functional/bind/placeholder.hpp
Normal file
|
@ -0,0 +1,104 @@
|
|||
#ifndef SPROUT_FUNCTIONAL_BIND_PLACEHOLDER_HPP
|
||||
#define SPROUT_FUNCTIONAL_BIND_PLACEHOLDER_HPP
|
||||
|
||||
#include <type_traits>
|
||||
#include <sprout/config.hpp>
|
||||
|
||||
namespace sprout {
|
||||
//
|
||||
// placeholder
|
||||
//
|
||||
template<int N>
|
||||
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<typename T>
|
||||
struct is_placeholder
|
||||
: public std::integral_constant<int, 0>
|
||||
{};
|
||||
template<typename T>
|
||||
struct is_placeholder<T const>
|
||||
: public sprout::is_placeholder<T>
|
||||
{};
|
||||
template<typename T>
|
||||
struct is_placeholder<T volatile>
|
||||
: public sprout::is_placeholder<T>
|
||||
{};
|
||||
template<typename T>
|
||||
struct is_placeholder<T const volatile>
|
||||
: public sprout::is_placeholder<T>
|
||||
{};
|
||||
template<int N>
|
||||
struct is_placeholder<sprout::placeholder<N> >
|
||||
: public std::integral_constant<int, N>
|
||||
{};
|
||||
} // namespace sprout
|
||||
|
||||
#endif // #ifndef SPROUT_FUNCTIONAL_BIND_PLACEHOLDER_HPP
|
48
sprout/functional/bind/udl.hpp
Normal file
48
sprout/functional/bind/udl.hpp
Normal file
|
@ -0,0 +1,48 @@
|
|||
#ifndef SPROUT_FUNCTIONAL_BIND_UDL_HPP
|
||||
#define SPROUT_FUNCTIONAL_BIND_UDL_HPP
|
||||
|
||||
#include <sprout/config.hpp>
|
||||
#include <sprout/functional/bind/placeholder.hpp>
|
||||
|
||||
#if SPROUT_USE_USER_DEFINED_LITERALS
|
||||
|
||||
#include <sprout/type_traits/identity.hpp>
|
||||
#include <sprout/detail/digits_to_int.hpp>
|
||||
|
||||
namespace sprout {
|
||||
//
|
||||
// placeholders_result
|
||||
//
|
||||
template<char... Chars>
|
||||
struct placeholders_result
|
||||
: public sprout::identity<
|
||||
sprout::placeholder<sprout::detail::digits_to_int<int, Chars...>::value>
|
||||
>
|
||||
{};
|
||||
|
||||
namespace placeholders {
|
||||
namespace udl {
|
||||
//
|
||||
// _
|
||||
//
|
||||
template<char... Chars>
|
||||
SPROUT_CONSTEXPR typename sprout::placeholders_result<Chars...>::type
|
||||
operator"" _() {
|
||||
typedef typename sprout::placeholders_result<Chars...>::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
|
|
@ -161,7 +161,7 @@ namespace sprout {
|
|||
// invocation
|
||||
template<typename... Args>
|
||||
SPROUT_CONSTEXPR typename std::result_of<T& (Args&&...)>::type
|
||||
operator() (Args&&... args) const {
|
||||
operator()(Args&&... args) const {
|
||||
return (*t_)(sprout::forward<Args>(args)...);
|
||||
}
|
||||
};
|
||||
|
@ -285,7 +285,7 @@ namespace sprout {
|
|||
// unwrap_ref
|
||||
//
|
||||
template<typename T>
|
||||
inline typename sprout::unwrap_reference<T>::type&
|
||||
inline SPROUT_CONSTEXPR typename sprout::unwrap_reference<T>::type&
|
||||
unwrap_ref(T& t) {
|
||||
return t;
|
||||
}
|
||||
|
|
|
@ -6,33 +6,18 @@
|
|||
|
||||
#if SPROUT_USE_USER_DEFINED_LITERALS
|
||||
|
||||
#include <type_traits>
|
||||
#include <sprout/index_tuple/make_index_tuple.hpp>
|
||||
#include <sprout/detail/digits_to_int.hpp>
|
||||
|
||||
namespace sprout {
|
||||
namespace detail {
|
||||
template<typename IntType, char... Chars>
|
||||
struct digits_to_int;
|
||||
template<typename IntType, char C>
|
||||
struct digits_to_int<IntType, C>
|
||||
: public std::integral_constant<IntType, IntType(C - 48)>
|
||||
{};
|
||||
template<typename IntType, char Head, char... Tail>
|
||||
struct digits_to_int<IntType, Head, Tail...>
|
||||
: public std::integral_constant<IntType, 10 * IntType(Head - 48) + sprout::detail::digits_to_int<IntType, Tail...>::value>
|
||||
{};
|
||||
} // namespace detail
|
||||
|
||||
//
|
||||
// indexes_result
|
||||
// uindexes_result
|
||||
//
|
||||
template<char... Chars>
|
||||
struct indexes_result
|
||||
: public sprout::make_index_tuple<sprout::detail::digits_to_int<sprout::index_t, Chars...>::value>
|
||||
{};
|
||||
//
|
||||
// uindexes_result
|
||||
//
|
||||
template<char... Chars>
|
||||
struct uindexes_result
|
||||
: public sprout::make_uindex_tuple<sprout::detail::digits_to_int<sprout::uindex_t, Chars...>::value>
|
||||
|
@ -42,16 +27,13 @@ namespace sprout {
|
|||
namespace indexes {
|
||||
//
|
||||
// _indexes
|
||||
// _uindexes
|
||||
//
|
||||
template<char... Chars>
|
||||
SPROUT_CONSTEXPR typename sprout::indexes_result<Chars...>::type
|
||||
operator"" _indexes() {
|
||||
return sprout::indexes_result<Chars...>::make();
|
||||
}
|
||||
|
||||
//
|
||||
// _uindexes
|
||||
//
|
||||
template<char... Chars>
|
||||
SPROUT_CONSTEXPR typename sprout::uindexes_result<Chars...>::type
|
||||
operator"" _uindexes() {
|
||||
|
|
Loading…
Reference in a new issue