20#ifndef CONDITIONAL_FORWARD_HPP_
21#define CONDITIONAL_FORWARD_HPP_
29template<
typename T1,
typename T2>
30using fwd_type =
typename std::conditional<std::is_lvalue_reference<T1>::value,
31 T2,
typename std::remove_reference<T2>::type&&>::type;
33template<
typename T1,
typename T2>
34fwd_type<T1, T2> conditional_forward(T2&& value) {
35 return std::forward<fwd_type<T1, T2>>(std::forward<T2>(value));
40template<
typename Container>
41auto forward_begin(Container&& c) ->
typename std::enable_if<
42 std::is_lvalue_reference<Container>::value ||
43 std::is_same<typename std::remove_reference<Container>::type::const_iterator,
decltype(c.begin())>::value,
50template<
typename Container>
51auto forward_begin(Container&& c) ->
typename std::enable_if<
52 !std::is_lvalue_reference<Container>::value &&
53 !std::is_same<typename std::remove_reference<Container>::type::const_iterator,
decltype(c.begin())>::value,
54 decltype(std::make_move_iterator(c.begin()))
57 return std::make_move_iterator(c.begin());
60template<
typename Container>
61auto forward_end(Container&& c) ->
typename std::enable_if<
62 std::is_lvalue_reference<Container>::value ||
63 std::is_same<typename std::remove_reference<Container>::type::const_iterator,
decltype(c.begin())>::value,
70template<
typename Container>
71auto forward_end(Container&& c) ->
typename std::enable_if<
72 !std::is_lvalue_reference<Container>::value &&
73 !std::is_same<typename std::remove_reference<Container>::type::const_iterator,
decltype(c.begin())>::value,
74 decltype(std::make_move_iterator(c.end()))
77 return std::make_move_iterator(c.end());
DataSketches namespace.
Definition binomial_bounds.hpp:38