43#ifndef LASS_GUARDIAN_OF_INCLUSION_META_TUPLE_H
44#define LASS_GUARDIAN_OF_INCLUSION_META_TUPLE_H
55template <
typename TList>
class Tuple;
57template <
typename H,
typename Ts>
58class Tuple< TypeList<H, Ts> >:
public Tuple<Ts>
62 typedef Tuple<Ts> TTail;
63 typedef TypeList<H, Ts> TList;
65 const H& value()
const {
return value_; }
66 H& value() {
return value_; }
72class Tuple< TypeList<meta::EmptyType, Ts> >:
public Tuple<Ts>
75 typedef meta::EmptyType TValue;
76 typedef Tuple<Ts> TTail;
77 typedef TypeList<meta::EmptyType, Ts> TList;
78 const meta::EmptyType& value()
const {
return meta::EmptyType::instance(); }
79 meta::EmptyType& value() {
return meta::EmptyType::instance(); }
83class Tuple<meta::NullType>
86 typedef meta::NullType TValue;
87 typedef meta::NullType TTail;
88 typedef meta::NullType TList;
96template <
typename TupleType,
size_t index>
99 typedef typename type_list::At<typename TupleType::TList, index>::Type Type;
102template <
typename TupleType,
size_t index>
103struct Field<const TupleType, index>
105 typedef const typename type_list::At<typename TupleType::TList, index>::Type Type;
110template <
typename TupleType,
size_t index>
struct SubType;
112template <
typename H,
typename Ts,
size_t index>
113struct SubType< Tuple< TypeList<H, Ts> >, index >:
public SubType< Tuple<Ts>, index - 1 >
117template <
typename H,
typename Ts>
118struct SubType< Tuple< TypeList<H, Ts> >, 0 >
120 typedef Tuple< TypeList<H, Ts> > Type;
123template <
typename H,
typename Ts,
size_t index>
124struct SubType< const Tuple< TypeList<H, Ts> >, index >:
public SubType< const Tuple<Ts>, index - 1 >
128template <
typename H,
typename Ts>
129struct SubType< const Tuple< TypeList<H, Ts> >, 0 >
131 typedef const Tuple< TypeList<H, Ts> > Type;
136template <
size_t index,
typename TupleType>
137typename Field<TupleType, index>::Type& field(TupleType& tuple)
139 typedef typename SubType<TupleType, index>::Type TSubType;
140 return static_cast<TSubType&
>(tuple).value();
147 template <
typename TupleType>
struct ForEach;
148 template <
typename H,
typename Ts>
149 struct ForEach< Tuple< TypeList<H, Ts> > >
151 template <
typename Functor>
static void call(Tuple< TypeList<H, Ts> >& tuple, Functor& fun)
154 ForEach< Tuple<Ts> >::call(tuple, fun);
156 template <
typename Functor>
static void call(
const Tuple< TypeList<H, Ts> >& tuple, Functor& fun)
159 ForEach< Tuple<Ts> >::call(tuple, fun);
162 template <
typename Ts>
163 struct ForEach< Tuple< TypeList<meta::EmptyType, Ts> > >
165 template <
typename Functor>
static void call(Tuple< TypeList<meta::EmptyType, Ts> >& tuple, Functor& fun)
167 ForEach< Tuple<Ts> >::call(tuple, fun);
169 template <
typename Functor>
static void call(
const Tuple< TypeList<meta::EmptyType, Ts> >& tuple, Functor& fun)
171 ForEach< Tuple<Ts> >::call(tuple, fun);
175 struct ForEach< Tuple< meta::NullType> >
177 template <
typename Functor>
static void call(Tuple<meta::NullType>&, Functor&)
180 template <
typename Functor>
static void call(
const Tuple<meta::NullType>&, Functor&)
186template <
typename TupleType,
typename Functor>
187void forEach(TupleType& tuple, Functor& fun)
189 impl::ForEach<TupleType>::call(tuple, fun);
192template <
typename TupleType,
typename Functor>
193void forEach(
const TupleType& tuple, Functor& fun)
195 impl::ForEach<TupleType>::call(tuple, fun);
Library for Assembled Shared Sources.