28 #ifndef YB_INC_ystdex_functional_hpp_
29 #define YB_INC_ystdex_functional_hpp_ 1
41 template<
typename _tFrom,
typename _tTo,
typename... _tFromParams,
42 typename... _tToParams>
48 template<
typename _tResFrom,
typename _tResTo,
typename... _tFromParams,
49 typename... _tToParams>
60 template<
typename... _tParams>
64 return sizeof...(_tParams);
75 template<
typename _type,
typename... _tParams>
77 get(_type&&, _tParams&&...
args)
80 static_assert(
sizeof...(
args) == _vN,
81 "Wrong variadic arguments number found.");
90 template<
typename _type>
104 template<
size_t _vN,
typename... _tParams>
109 static_assert(_vN <
sizeof...(
args),
110 "Out-of-range index of variadic argument found.");
123 template<
typename _fCallable>
127 template<
typename _fCallable,
typename _type,
typename... _tParams>
142 template<
typename _fCallable,
typename... _tParams>
160 template<
typename _fCallable>
163 template<
typename _tRet,
typename... _tParams>
166 using type = std::tuple<_tParams...>;
169 template<
typename _tRet,
typename... _tParams>
172 using type = std::tuple<_tParams...>;
175 template<
typename _tRet,
typename... _tParams>
178 using type = std::tuple<_tParams...>;
181 template<
typename _tRet,
class _tClass,
typename... _tParams>
184 using type = std::tuple<_tParams...>;
189 template<
typename _tRet,
class _tClass,
typename... _tParams>
192 using type = std::tuple<_tParams...>;
195 template<
typename _tRet,
class _tClass,
typename... _tParams>
198 using type = std::tuple<_tParams...>;
201 template<
typename _tRet,
class _tClass,
typename... _tParams>
204 using type = std::tuple<_tParams...>;
209 template<
typename _tRet,
typename... _tParams>
212 using type = std::tuple<_tParams...>;
227 template<
typename _fCallable>
230 template<
typename _tRet,
typename... _tParams>
236 template<
typename _tRet,
typename... _tParams>
242 template<
typename _tRet,
typename... _tParams>
248 template<
typename _tRet,
class _tClass,
typename... _tParams>
256 template<
typename _tRet,
class _tClass,
typename... _tParams>
262 template<
typename _tRet,
class _tClass,
typename... _tParams>
263 struct return_of<_tRet(_tClass::*)(_tParams...) volatile>
268 template<
typename _tRet,
class _tClass,
typename... _tParams>
269 struct return_of<_tRet(_tClass::*)(_tParams...) const volatile>
276 template<
typename _tRet,
typename... _tParams>
290 template<
size_t _vIdx,
typename _fCallable>
298 template<
size_t _vIdx,
typename _fCallable>
308 template<
typename _fCallable>
310 make_parameter_tuple<_fCallable>::type>::value>
319 template<
typename,
class>
322 template<
typename _tRet,
typename... _tParams,
size_t... _vSeq>
326 template<
typename _fCallable>
337 template<
typename _tRet,
typename... _tParams,
size_t... _vSeq>
353 template<typename _fCallable, size_t _vLen = paramlist_size<_fCallable>::value>
355 make_natural_sequence_t<_vLen>>,
private expand_proxy<_fCallable, _vLen - 1>
362 template<
typename _fCallable>
377 template<
typename _fHandler,
typename _fCallable>
381 static_assert(is_object<_fCallable>::value,
382 "Callable object type is needed.");
387 template<
typename _fCaller,
393 template<
typename... _tParams>
410 template<
typename _fHandler,
typename _fCallable>
411 yconstfn expanded_caller<_fHandler, decay_t<_fCallable>>
424 template<
typename _type>
430 template<
typename _tWrapped>
445 template<
typename _type>
451 template<
typename _type>
472 template<
typename _type>
476 seed ^= std::hash<_type>()(val) + 0x9E3779B9 + (seed << 6) + (seed >> 2);
485 template<
typename _type>
491 template<
typename _type,
typename... _tParams>
504 template<
typename _tIn>
510 for(; first != last; ++
first)
514 template<
typename _tIn>
518 for(; first != last; ++
first)
530 template<
typename...>
533 template<
typename _type>
540 template<
bool,
class,
class>
543 template<
bool _bNoExcept,
typename _type,
size_t... _vSeq>
555 template<
typename... _types>
559 using type = std::tuple<_types...>;
564 static yconstexpr bool is_noexcept_v = noexcept(
577 template<
typename _type1,
typename _type2>
599 template<
typename _type1,
typename _type2>
611 template<
typename _type>
626 template<
bool,
typename _tScalar>
635 template<
typename _tScalar>
652 template<
bool,
typename _tScalar1,
typename _tScalar2>
661 template<
typename _tScalar1,
typename _tScalar2>
676 template<
bool _bIsPositive,
typename _tScalar>
688 template<
bool _bIsPositive,
typename _tScalar1,
typename _tScalar2>
700 template<
typename _type>
718 template<
typename _type>
738 template<
typename _type,
typename _tPointer = _type*,
739 class _fCompare = std::less<_type>>
749 return bool(_x) && bool(_y) && _fCompare()(*_x, *_y);
760 template<
typename _tChar,
class _fCompare = std::less<_tChar>>
770 using traits_type = std::char_traits<_tChar>;
772 return x && y && std::lexicographical_compare(x, x + traits_type
773 ::length(x), y, y + traits_type::length(y), _fCompare());
_tScalar1 & delta_assign(_tScalar1 &_x, _tScalar2 &_y)
编译期选择加法/减法复合赋值运算。
expanded_caller(_fCaller &&f)
std::tuple< _tParams...> type
typename std::tuple_element< _vIdx, _type >::type tuple_element_t
static auto first(const _tIterator &i) -> decltype((i->first))
std::tuple< _tParams...> type
typename remove_reference< _type >::type remove_reference_t
yconstfn const string _tParams && args
const _type * operator()(const _type &_x) const
对指定 const 对象使用 operator& 并返回结果。
bool operator()(const _tChar *x, const _tChar *y) const
比较指定字符串首字符的指针。
typename parameter_of< _vIdx, _fCallable >::type parameter_of_t
typename return_of< _fCallable >::type return_of_t
auto operator()(_tParams &&...args) -> decltype(details::expand_proxy< _fHandler >::call(Caller, std::forward_as_tuple(std::forward< decltype(args)>(args)...)))
void unseq_apply(_fCallable &&f, _tParams &&...args)
无序调用。
#define yforward(_expr)
根据参数类型使用 std::forward 传递对应参数。
void seq_apply(_fCallable &&)
顺序递归调用。
_tScalar & operator()(_tScalar &_x)
tuple_element_t< _vIdx, typename make_parameter_tuple< _fCallable >::type > type
std::tuple< _tParams...> type
expanded_caller< _fHandler, decay_t< _fCallable > > make_expanded(_fCallable &&f)
构造接受冗余参数的可调用对象。
_tScalar & operator()(_tScalar &_x)
_tScalar1 & operator()(_tScalar1 &x, _tScalar2 y) const
#define yunseq
无序列依赖表达式组求值。
_tScalar & xcrease(_tScalar &_x)
编译期选择自增/自减运算。
#define ynothrow
YSLib 无异常抛出保证:若支持 noexcept 关键字, 指定特定的 noexcept 异常规范。
使用 std::hash 和 ystdex::hash_combine_seq 实现的对特定类型的散列。
_type * operator()(_type &_x) const
对指定对象使用 operator& 并返回结果。
std::tuple< _tParams...> type
取 std::reference_wrapper 实例特征。
static auto get(_type &&, _tParams &&...args) -> decltype(variadic_param< _vN-1 >::get(std::forward< decltype(args)>(args)...))
_type & unref(_type &&x)
解除引用包装。
void hash_combine(size_t &seed, const _type &val)
重复计算散列。
#define yconstfn
指定编译时常量函数。
size_t sizeof_params(_tParams &&...)
统计函数参数列表中的参数个数。
enable_if_t<!is_same< _tClass &, remove_rcv_t< _tParam > & >::value, _type > exclude_self_ctor_t
移除选择类类型的特定重载避免构造模板和复制/转移构造函数冲突。
std::tuple< _tParams...> type
#define yconstexpr
指定编译时常量表达式。
bool operator()(const _tPointer &_x, const _tPointer &_y) const
const auto varg(_tParams &&...args) -> decltype(variadic_param< _vN >::get(std::forward< decltype(args)>(args)...))
取指定位置的变长参数。
bool operator()(const _type1 &x, const _type2 &y) const
std::tuple< _tParams...> type
std::tuple< _tParams...> type
#define ynoexcept(...)
YSLib 无异常抛出保证:指定特定的异常规范。
std::tuple< _types...> type
size_t hash_range(_tIn first, _tIn last)
重复对范围计算散列。
size_t operator()(const type &tp) const
static _tRet call(_fCallable &&f, std::tuple< _tParams...> &&args, remove_reference_t< decltype(std::forward< decltype(f)>(f)(std::forward< decltype(std::get< _vSeq >(std::move(args)))>(std::get< _vSeq >(std::move(args)))...))> *={})
typename make_parameter_tuple< _fCallable >::type make_parameter_tuple_t
_tScalar1 & operator()(_tScalar1 &x, _tScalar2 y) const
static size_t call(const _type &tp)
size_t hash_combine_seq(size_t seed, const _type &val)
重复计算序列散列。
bool operator()(const _type &_x, const _type &_y) const
typename make_natural_sequence< _vN >::type make_natural_sequence_t
std::tuple< _tParams...> type