Added implementation of std::experimental::make_array
This commit is contained in:
parent
4e9a588c66
commit
4614939183
|
@ -358,6 +358,7 @@ target_link_libraries(rhubarb-time
|
||||||
|
|
||||||
# ... rhubarb-tools
|
# ... rhubarb-tools
|
||||||
add_library(rhubarb-tools
|
add_library(rhubarb-tools
|
||||||
|
src/tools/array.h
|
||||||
src/tools/EnumConverter.h
|
src/tools/EnumConverter.h
|
||||||
src/tools/exceptions.cpp
|
src/tools/exceptions.cpp
|
||||||
src/tools/exceptions.h
|
src/tools/exceptions.h
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
|
||||||
|
// This file contains an implementation of std::experimental::make_array.
|
||||||
|
|
||||||
|
namespace details {
|
||||||
|
template<class B>
|
||||||
|
struct negation : std::integral_constant<bool, !B::value> {};
|
||||||
|
|
||||||
|
template<class> struct is_ref_wrapper : std::false_type {};
|
||||||
|
template<class T> struct is_ref_wrapper<std::reference_wrapper<T>> : std::true_type {};
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
using not_ref_wrapper = negation<is_ref_wrapper<std::decay_t<T>>>;
|
||||||
|
|
||||||
|
template<class...> struct conjunction : std::true_type { };
|
||||||
|
template<class B1> struct conjunction<B1> : B1 { };
|
||||||
|
template<class B1, class... Bn>
|
||||||
|
struct conjunction<B1, Bn...>
|
||||||
|
: std::conditional_t<bool(B1::value), conjunction<Bn...>, B1> {};
|
||||||
|
|
||||||
|
template<class... B>
|
||||||
|
constexpr bool conjunction_v = conjunction<B...>::value;
|
||||||
|
|
||||||
|
template <class D, class...> struct return_type_helper { using type = D; };
|
||||||
|
template <class... Types>
|
||||||
|
struct return_type_helper<void, Types...> : std::common_type<Types...> {
|
||||||
|
static_assert(conjunction_v<not_ref_wrapper<Types>...>,
|
||||||
|
"Types cannot contain reference_wrappers when D is void");
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class D, class... Types>
|
||||||
|
using return_type = std::array<typename return_type_helper<D, Types...>::type,
|
||||||
|
sizeof...(Types)>;
|
||||||
|
}
|
||||||
|
|
||||||
|
template < class D = void, class... Types>
|
||||||
|
constexpr details::return_type<D, Types...> make_array(Types&&... t) {
|
||||||
|
return {std::forward<Types>(t)...};
|
||||||
|
}
|
Loading…
Reference in New Issue