move TupleElementBase out of namespace detail (meant to be overloaded)

master
Daniel Kolesa 2015-07-11 15:17:12 +01:00
parent cd6e2a96aa
commit 4a871db249
4 changed files with 51 additions and 56 deletions

View File

@ -79,12 +79,10 @@ struct Array {
template<typename T, Size N>
struct TupleSize<Array<T, N>>: IntegralConstant<Size, N> {};
namespace detail {
template<Size I, typename T, Size N>
struct TupleElementBase<I, Array<T, N>> {
using Type = T;
};
}
template<Size I, typename T, Size N>
struct TupleElementBase<I, Array<T, N>> {
using Type = T;
};
template<Size I, typename T, Size N>
TupleElement<I, Array<T, N>> &get(Array<T, N> &a) {

View File

@ -26,24 +26,22 @@ template<typename T> struct TupleSize<const volatile T>: public TupleSize<T> {};
/* tuple element */
namespace detail {
template<Size I, typename T> struct TupleElementBase;
template<Size I, typename T>
struct TupleElementBase<I, const T> {
using Type = AddConst<typename TupleElementBase<I, T>::Type>;
};
template<Size I, typename T>
struct TupleElementBase<I, volatile T> {
using Type = AddVolatile<typename TupleElementBase<I, T>::Type>;
};
template<Size I, typename T>
struct TupleElementBase<I, const volatile T> {
using Type = AddCv<typename TupleElementBase<I, T>::Type>;
};
}
template<Size I, typename T> struct TupleElementBase;
template<Size I, typename T>
struct TupleElementBase<I, const T> {
using Type = AddConst<typename TupleElementBase<I, T>::Type>;
};
template<Size I, typename T>
struct TupleElementBase<I, volatile T> {
using Type = AddVolatile<typename TupleElementBase<I, T>::Type>;
};
template<Size I, typename T>
struct TupleElementBase<I, const volatile T> {
using Type = AddCv<typename TupleElementBase<I, T>::Type>;
};
template<Size I, typename T>
using TupleElement = typename detail::TupleElementBase<I, T>::Type;
using TupleElement = typename TupleElementBase<I, T>::Type;
/* is tuple-like */
@ -123,26 +121,27 @@ namespace detail {
namespace detail {
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...>>:
IntegralConstant<Size, sizeof...(T)> {};

View File

@ -22,12 +22,10 @@ template<typename ...T> struct TupleSize<Tuple<T...>>:
/* tuple element */
namespace detail {
template<Size I, typename ...T>
struct TupleElementBase<I, Tuple<T...>> {
using Type = typename TupleElementBase<I, TupleTypes<T...>>::Type;
};
}
template<Size I, typename ...T>
struct TupleElementBase<I, Tuple<T...>> {
using Type = typename TupleElementBase<I, detail::TupleTypes<T...>>::Type;
};
/* tuple leaf */

View File

@ -170,17 +170,17 @@ Pair<typename detail::MakePairRet<T>::Type,
template<typename T, typename U>
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 {
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<> struct GetPair<0> {