move TupleElementBase out of namespace detail (meant to be overloaded)
This commit is contained in:
parent
cd6e2a96aa
commit
4a871db249
|
@ -79,12 +79,10 @@ struct Array {
|
||||||
template<typename T, Size N>
|
template<typename T, Size N>
|
||||||
struct TupleSize<Array<T, N>>: IntegralConstant<Size, N> {};
|
struct TupleSize<Array<T, N>>: IntegralConstant<Size, N> {};
|
||||||
|
|
||||||
namespace detail {
|
template<Size I, typename T, Size N>
|
||||||
template<Size I, typename T, Size N>
|
struct TupleElementBase<I, Array<T, N>> {
|
||||||
struct TupleElementBase<I, Array<T, N>> {
|
using Type = T;
|
||||||
using Type = T;
|
};
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
template<Size I, typename T, Size N>
|
template<Size I, typename T, Size N>
|
||||||
TupleElement<I, Array<T, N>> &get(Array<T, N> &a) {
|
TupleElement<I, Array<T, N>> &get(Array<T, N> &a) {
|
||||||
|
|
|
@ -26,24 +26,22 @@ template<typename T> struct TupleSize<const volatile T>: public TupleSize<T> {};
|
||||||
|
|
||||||
/* tuple element */
|
/* tuple element */
|
||||||
|
|
||||||
namespace detail {
|
template<Size I, typename T> struct TupleElementBase;
|
||||||
template<Size I, typename T> struct TupleElementBase;
|
template<Size I, typename T>
|
||||||
template<Size I, typename T>
|
struct TupleElementBase<I, const T> {
|
||||||
struct TupleElementBase<I, const T> {
|
using Type = AddConst<typename TupleElementBase<I, T>::Type>;
|
||||||
using Type = AddConst<typename TupleElementBase<I, T>::Type>;
|
};
|
||||||
};
|
template<Size I, typename T>
|
||||||
template<Size I, typename T>
|
struct TupleElementBase<I, volatile T> {
|
||||||
struct TupleElementBase<I, volatile T> {
|
using Type = AddVolatile<typename TupleElementBase<I, T>::Type>;
|
||||||
using Type = AddVolatile<typename TupleElementBase<I, T>::Type>;
|
};
|
||||||
};
|
template<Size I, typename T>
|
||||||
template<Size I, typename T>
|
struct TupleElementBase<I, const volatile T> {
|
||||||
struct TupleElementBase<I, const volatile T> {
|
using Type = AddCv<typename TupleElementBase<I, T>::Type>;
|
||||||
using Type = AddCv<typename TupleElementBase<I, T>::Type>;
|
};
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
template<Size I, typename T>
|
template<Size I, typename T>
|
||||||
using TupleElement = typename detail::TupleElementBase<I, T>::Type;
|
using TupleElement = typename TupleElementBase<I, T>::Type;
|
||||||
|
|
||||||
/* is tuple-like */
|
/* is tuple-like */
|
||||||
|
|
||||||
|
@ -123,26 +121,27 @@ namespace detail {
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
template<typename ...T> struct TupleTypes {};
|
template<typename ...T> struct TupleTypes {};
|
||||||
|
|
||||||
template<Size I> struct TupleElementBase<I, TupleTypes<>> {
|
|
||||||
public:
|
|
||||||
static_assert(I == 0, "TupleElement index out of range");
|
|
||||||
static_assert(I != 0, "TupleElement index out of range");
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename H, typename ...T>
|
|
||||||
struct TupleElementBase<0, TupleTypes<H, T...>> {
|
|
||||||
public:
|
|
||||||
using Type = H;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<Size I, typename H, typename ...T>
|
|
||||||
struct TupleElementBase<I, TupleTypes<H, T...>> {
|
|
||||||
public:
|
|
||||||
using Type = typename TupleElementBase<I - 1, TupleTypes<T...>>::Type;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<Size I> struct TupleElementBase<I, detail::TupleTypes<>> {
|
||||||
|
public:
|
||||||
|
static_assert(I == 0, "TupleElement index out of range");
|
||||||
|
static_assert(I != 0, "TupleElement index out of range");
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename H, typename ...T>
|
||||||
|
struct TupleElementBase<0, detail::TupleTypes<H, T...>> {
|
||||||
|
public:
|
||||||
|
using Type = H;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<Size I, typename H, typename ...T>
|
||||||
|
struct TupleElementBase<I, detail::TupleTypes<H, T...>> {
|
||||||
|
public:
|
||||||
|
using Type = typename TupleElementBase<I - 1,
|
||||||
|
detail::TupleTypes<T...>>::Type;
|
||||||
|
};
|
||||||
|
|
||||||
template<typename ...T> struct TupleSize<detail::TupleTypes<T...>>:
|
template<typename ...T> struct TupleSize<detail::TupleTypes<T...>>:
|
||||||
IntegralConstant<Size, sizeof...(T)> {};
|
IntegralConstant<Size, sizeof...(T)> {};
|
||||||
|
|
||||||
|
|
|
@ -22,12 +22,10 @@ template<typename ...T> struct TupleSize<Tuple<T...>>:
|
||||||
|
|
||||||
/* tuple element */
|
/* tuple element */
|
||||||
|
|
||||||
namespace detail {
|
template<Size I, typename ...T>
|
||||||
template<Size I, typename ...T>
|
struct TupleElementBase<I, Tuple<T...>> {
|
||||||
struct TupleElementBase<I, Tuple<T...>> {
|
using Type = typename TupleElementBase<I, detail::TupleTypes<T...>>::Type;
|
||||||
using Type = typename TupleElementBase<I, TupleTypes<T...>>::Type;
|
};
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/* tuple leaf */
|
/* tuple leaf */
|
||||||
|
|
||||||
|
|
|
@ -170,17 +170,17 @@ Pair<typename detail::MakePairRet<T>::Type,
|
||||||
template<typename T, typename U>
|
template<typename T, typename U>
|
||||||
struct TupleSize<Pair<T, U>>: IntegralConstant<Size, 2> {};
|
struct TupleSize<Pair<T, U>>: IntegralConstant<Size, 2> {};
|
||||||
|
|
||||||
|
template<typename T, typename U>
|
||||||
|
struct TupleElementBase<0, Pair<T, U>> {
|
||||||
|
using Type = T;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T, typename U>
|
||||||
|
struct TupleElementBase<1, Pair<T, U>> {
|
||||||
|
using Type = U;
|
||||||
|
};
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
template<typename T, typename U>
|
|
||||||
struct TupleElementBase<0, Pair<T, U>> {
|
|
||||||
using Type = T;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T, typename U>
|
|
||||||
struct TupleElementBase<1, Pair<T, U>> {
|
|
||||||
using Type = U;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<Size> struct GetPair;
|
template<Size> struct GetPair;
|
||||||
|
|
||||||
template<> struct GetPair<0> {
|
template<> struct GetPair<0> {
|
||||||
|
|
Loading…
Reference in a new issue