tuple/type: add 'nth' accessor for tuples
This commit is contained in:
parent
8c0c374a53
commit
84ef2c1117
@ -21,6 +21,17 @@ main (void)
|
|||||||
tap.expect_eq (cruft::tuple::type::index<tuple_t,int>::value, 1u, "tuple index extraction");
|
tap.expect_eq (cruft::tuple::type::index<tuple_t,int>::value, 1u, "tuple index extraction");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
using tuple_t = std::tuple<float,int,void>;
|
||||||
|
tap.expect (
|
||||||
|
std::is_same_v<
|
||||||
|
cruft::tuple::type::nth_t<tuple_t,1>,
|
||||||
|
int
|
||||||
|
>,
|
||||||
|
"tuple type indexing with 'nth'"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
#if !defined(NO_RTTI)
|
#if !defined(NO_RTTI)
|
||||||
auto tuple = std::make_tuple (1u, 1, 1.f, 1.);
|
auto tuple = std::make_tuple (1u, 1, 1.f, 1.);
|
||||||
|
@ -172,8 +172,8 @@ namespace cruft::tuple::type {
|
|||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// transform a tuple-like type (ie, something that responds to
|
/// Transform a tuple-like type (ie, something that responds to
|
||||||
// tuple_element) into a tuple
|
/// tuple_element) into a tuple
|
||||||
template <
|
template <
|
||||||
typename TupleT,
|
typename TupleT,
|
||||||
typename Indices = std::make_index_sequence<
|
typename Indices = std::make_index_sequence<
|
||||||
@ -202,7 +202,7 @@ namespace cruft::tuple::type {
|
|||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// concatenate a variadic collection of tuple-like types
|
/// Concatenate a variadic collection of tuple-like types
|
||||||
template <typename ...Args>
|
template <typename ...Args>
|
||||||
struct cat;
|
struct cat;
|
||||||
|
|
||||||
@ -234,7 +234,7 @@ namespace cruft::tuple::type {
|
|||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// remove a type from a tuple-like type
|
/// Remove a type from a tuple-like type
|
||||||
template <
|
template <
|
||||||
typename DoomedT,
|
typename DoomedT,
|
||||||
typename TupleT
|
typename TupleT
|
||||||
@ -280,6 +280,7 @@ namespace cruft::tuple::type {
|
|||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
/// Remove duplicate types from the list of held types in a tuple
|
||||||
template <typename TupleT>
|
template <typename TupleT>
|
||||||
struct unique;
|
struct unique;
|
||||||
|
|
||||||
@ -309,4 +310,27 @@ namespace cruft::tuple::type {
|
|||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
template <typename T>
|
template <typename T>
|
||||||
using unique_t = typename unique<T>::type;
|
using unique_t = typename unique<T>::type;
|
||||||
}
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
/// Convenience accessor for the 'nth' type of a tuple.
|
||||||
|
template <typename TupleT, std::size_t IndexV>
|
||||||
|
struct nth;
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
template <typename HeadT, typename ...TailT>
|
||||||
|
struct nth<std::tuple<HeadT,TailT...>,0> {
|
||||||
|
using type = HeadT;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
template <typename HeadT, typename ...TailT, std::size_t IndexV>
|
||||||
|
struct nth<std::tuple<HeadT,TailT...>,IndexV> : nth<std::tuple<TailT...>,IndexV-1> { };
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
template <typename TupleT, std::size_t IndexV>
|
||||||
|
using nth_t = typename nth<TupleT, IndexV>::type;
|
||||||
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user