ATLAS Offline Software
TypeInformation.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #ifndef TRIGNAVIGATION_TYPEINFORMATION_H
6 #define TRIGNAVIGATION_TYPEINFORMATION_H
7 #include <string>
8 #include <iostream>
9 #include <vector>
10 #include <type_traits>
11 #include <typeinfo>
12 
13 #include <boost/function_types/function_type.hpp>
14 #include <boost/function_types/parameter_types.hpp>
15 #include <boost/function_types/function_arity.hpp>
16 #include <boost/typeof/std/utility.hpp>
17 #include <type_traits>
18 
19 
20 namespace HLT{
21 namespace TypeInformation{
22 // a basic structue of the information that we want to store about the trigger EDM
23 // this includes the lead (element) type
24 // the type with which such features are stored within the navigation
25 // the container type that is saved to SG
26 
27 // we want to know when a list ends (similar to how we terminate const char arrays with a "\0" terminatino sequence)
28 struct nil{
29 static const int last_index=-1;
30 };
31 
32 // this implements a generic linked list that makes up an array
33 // from each element we can go the the next one by the rest typedef
34 // we also define two 'methods' add and join that add a single element
35 // and concatenates the present list with a new list respectively
36 
37 /* MN: ROOT6 Clang is not able to parse definitions with get_list_index<>
38 template <class type,class list_of_types> struct list;
39 
40 template<class a_list> struct get_list_index {static const int result = 1+ get_list_index<typename a_list::rest>::result;};
41 template<class first_element> struct get_list_index<list<first_element,nil> > {static const int result = 0;};
42 */
43 
44 template<class type,class list_of_types>
45 struct list {
46  static const int last_index = 1 + list_of_types::last_index;
47  //static const int last_index = get_list_index<list<type,list_of_types> >::result;
48  typedef type first;
49  typedef list_of_types rest;
51 
52  template <class new_element> struct add;
53  template <class new_element> struct addWithChecking;
54  template <class new_list> struct join;
55  template <class element> struct has;
56  template <int i> struct get;
57  template <int i, class element> struct set;
58  template <int begin, int end> struct range;
59 };
60 
61 // here we implement the list::add 'method' it takes a new element and defines
62 // the output of the do_add helper method as its result. do_add adds the element
63 // *except* when the new element is nil, in which case it doesn't do anything
64 // this is important for cancatenating two lists (as each one will have its terminating nil)
66 
67 //nil case
68 template<class new_element,class thelist>
69 struct do_add<new_element,thelist,true>{
70  typedef thelist result;
71 };
72 
73 //general case
74 template<class new_element,class thelist>
75 struct do_add<new_element,thelist,false>{
77 };
78 
79 //here if we already have the container/object combination in the map, we just want to add the feature
80 //otherwise we will want to add the feature of the new combination to the existing record
81 
82 
83 template <class type, class list_of_types>
84 template <class new_element>
85 struct list<type,list_of_types>::add {
87 };
88 
89 // here we defined an iterator on the list. calling nx<list> is equivalent to list::rest and defines
90 // nx<list>::type as list::first. Thus, one can iterate via calling the nx template multiple times, e.g.
91 // nx<nx<nx<list> > >
92 template<class list>
93 struct nx : list::rest {//for structs this is public inheritance by default
94  typedef typename list::first type;
95 };
96 
97 // here we have a implementation of random access to the i-th element. given an index this iterates on
98 // the list a given number of types using the nx<> iterator
99 template<class list, int i>
100 struct _at{
101  typedef nx<typename _at<list,i-1>::it> it;
102  typedef typename it::type type;
103 };
104 
105 template<class list>
106 struct _at<list,0> {
107  typedef nx<list> it;
108  typedef typename it::type type;
109 };
110 
111 template<class list, int i>
112 struct at{
113  typedef typename _at<list,list::last_index-i>::type type;
114 };
115 
116 // in case we just want to know if a specific element in already in a list we can use
117 // this search function that iterates over the list and returns a bool with the answer
118 #ifdef __COVERITY__
119 template<typename element, typename list>
120 struct do_search{
123 };
124 
125 //if list is specified as terminated with 'nil'
126 template<class element>
127 struct do_search<element,nil>{
128  static const bool found =false;
129 };
130 #else
131 template<typename element, typename list, int i = list::last_index>
132 struct do_search{
134  do_search<element,list,i-1>::found;
135 };
136 
137 template<typename element, typename list>
138 struct do_search<element,list,0>{
140 };
141 #endif
142 
143 template <class type, class list_of_types>
144 template <class element>
145 struct list<type,list_of_types>::has {
147 };
148 
149 template <class the_type, class list_of_types>
150 template <int i>
151 struct list<the_type,list_of_types>::get {
153 };
154 
155 template<class thelist, int begin, int end, bool begin_is_end = (begin==end)>
156 struct do_range{
158  typedef typename do_range<thelist,begin,end-1>::type earlier_list;
159  typedef typename earlier_list::template add<last_item>::go::done type;
160 };
161 
162 template<class thelist, int begin, int end>
163 struct do_range<thelist,begin,end,true>{
166 };
167 
168 template <class the_type, class list_of_types>
169 template <int begin, int end>
170 struct list<the_type,list_of_types>::range {
171  typedef typename do_range<list<the_type,list_of_types>,
177 };
178 
179 template<class new_element, class old_element, bool do_replace> struct replace_if;
180 template<class new_element, class old_element> struct replace_if<new_element,old_element,true>{typedef new_element result;};
181 template<class new_element, class old_element> struct replace_if<new_element,old_element,false>{typedef old_element result;};
182 
184 
185 template<class a_list,class new_element,int i>
186 struct do_update<a_list,new_element,i,false>{
189 };
190 
191 template<class a_list,class new_element,int i>
192 struct do_update<a_list,new_element,i,true>{
195 };
196 
197 template <class the_type, class list_of_types>
198 template <int i, class new_element>
199 struct list<the_type,list_of_types>::set {
200  typedef typename do_update<list<the_type,list_of_types>,new_element,i>::result go;
201 };
202 
203 
204 // here we're implementing the join 'method'. it defines the output of the helper function join_lists as its
205 // output named 'go'. Thus, we can join a given list 'listA' with another list 'listB' using listA::join<listB>::go
206 // this supports also method chaining a la listA::join<listB>::go::join<listC>::go::join<listD>::go etc.
207 template<class first, class second, int index = first::last_index>
208 struct join_lists{
210 };
211 
212 template<class first, class second>
215 };
216 
217 template<class type,class list_of_types>
218 template<class new_list>
219 struct list<type,list_of_types>::join{
221 };
222 
223 
224 // now we're actually constructing a function that allows us to search our linked list in one 'key'
225 // of the type_info struct (let's say the object). This will give us the index of the type_info entry
226 // that contains that 'key'. Once we have this index, we can query that element for any other 'column'
227 // that would consitute the 'value'.. i.e. search by object and return feature...
228 // or seach by feature the container.. mix and match as you like
229 // template to test
230 
231 
232 // this is a helper function for iterating over the list (as it need to be done recusively)
233 // if the tested index is in fact the element we're after we set the result to that index
234 // if not we just leave the result untouched and set the current value as the result again
235 // this way we're kinda passing the 'state' of the search along in recursive calls
236 template<bool is_same, int index, int value> struct test;
237 
238 template<int index, int value> struct test<true,index,value>{
239 typedef int output_type;
240 static const int result = index;
241 };
242 
243 template<int index, int value> struct test<false,index,value>{
244 typedef int output_type;
245 static const int result = value;
246 };
247 
248 struct no_aux{};
249 
250 template<typename _objt,typename _list_of_feats, typename _cont, typename _aux = no_aux>
251 struct type_info {
252  typedef _objt object;
253  typedef _list_of_feats list_of_features;
254  typedef _cont container;
255  typedef _aux aux;
256 };
257 
258 //the actual find function. we test each element to see if the desired type is equal to that returned by the functor that was also
259 //passed in the function call
260 template<class element, class list, template<class E,class L,int I> class by, int index = list::last_index, int fall_back = -1> struct find{
262  index,
263  find<element,list,by,index-1,fall_back>::result>::result;
264 };
265 
266 template<class element, class list, template<class E,class L,int I> class by, int fall_back> struct find<element,list,by,0,fall_back>{
268  0,
269  fall_back>::result;
270 };
271 
272 
273 // here come four functors that get the key out of an element, we can pass these functors
274 // to the find function so it know's by what to search
275 
276 template<typename element,typename list,int index> struct get_element{
278 };
279 template<typename element,typename list,int index> struct get_cont{
280  static const bool result = std::is_same<element,typename at<list,index>::type::container>::value;
281 };
282 
283 template<typename element,typename list,int index> struct get_objt{
285 };
286 
287 template<typename element,typename list,int index> struct get_aux{
288  static const bool result = std::is_same<element,typename at<list,index>::type::auxt>::value;
289 };
290 
291 template<typename element,typename list,int index> struct get_feat{
294 };
295 
296 
297 
298 //this is a shorthand for finding the index and then using the index to get the element with that index
299 template<typename element,typename list, template<class E,class L,int I> class by, int index = find<element,list,by>::result>
300 struct map_search {
301  typedef typename at<list,index>::type type;
302 };
303 
304 template<class T>
306 
307 template<typename element,typename list, template<class E,class L,int I> class by>
308 struct map_search<element,list,by,-1> {
310 };
311 
312 struct newlist{
313  template <class first_element>struct add{typedef list<first_element,nil> go;};
314  template <class first_element>struct addWithChecking{typedef list<first_element,nil> go;};
315 };
316 
317 //type_info case
318 
319 template<class new_element,class thelist, int index> struct do_my_add;
320 
321 template<class O,class F,class C,class A,class thelist>
322 struct do_my_add<type_info<O,F,C,A>,thelist,-1>{
323  typedef typename thelist::template add<type_info<O,F,C,A> >::go result;
324 };
325 
326 template<class O,class F,class C,class A,class thelist, int index>
327 struct do_my_add<type_info<O,F,C,A>,thelist,index>{
329  typedef typename old_entry::list_of_features old_feats;
332  typedef typename thelist::template set<index,type_info<typename old_entry::object,extended,typename old_entry::container,typename old_entry::aux> >::go result;
333 };
334 
335 #ifdef __COVERITY__
336 template <class type, class list_of_types>
337 template<class newElement>
338 struct list<type,list_of_types>::addWithChecking{
340 };
341 #else
342 template <class type, class list_of_types>
343 template<class O,class F,class C,class A>
344 struct list<type,list_of_types>::addWithChecking<type_info<O,F,C,A> >{
346 };
347 #endif
348 
349 //AND WE'RE DONE
350 
356 
357 //compile-time iteration
358 //parameters:
359 // list: list to iterate on
360 // functor: a meta function that should be applied to each item in the list
361 // it itself has three parameters (the fourth is for internal use only
362 // first: element of the list
363 // second: result structure that can be used to keep track of things through the loop
364 // third: arguments that may want to be passed into the functor
365 // result: the result structe to be used
366 // arg: the arguments to be passed to the inner body of the loop
367  template<typename list, template<typename,typename,typename, bool> class functor, typename result, class arg, int i = list::last_index, bool isLast = true>
369  typedef typename functor<typename at<list,i>::type, typename for_each_type_c<list,functor,result,arg,i-1,false>::type,arg, isLast>::type type;
370 };
371 
372  template<typename list, template<typename,typename,typename,bool> class functor,typename result, class arg,bool isLast>
373 struct for_each_type_c<list,functor,result,arg,0,isLast>{
375 };
376 
377 //run-time iteration
378 template <class list,class functor, int last_index = list::last_index>
380  static void do_it(functor* f = 0) {
381  //transient object to use in cas no object given, must have default ctor
382  functor transient = functor();
383  functor* ptr = (!f) ? &transient : f;
384 
386 
387  // apparently must use function pointer to get all the types resolved properly
389  (ptr->*funcptr)();
390  };
391 };
392 
393 template <class list,class functor>
394 struct for_each_type<list,functor,0>{
395  static void do_it(functor* f = 0) {
396  //apparently must use function pointer to get all the types resolved properly
397  functor transient = functor();
398  functor* ptr = (!f) ? &transient : f;
399 
401  (ptr->*funcptr)();
402  };
403 };
404 
406  template <class element>
407  void do_it() const {std::cout << "["<< typeid(element).name() << "] ";}
408 };
409 
410 struct printer{
411  template <class element>
412  void do_it() const;
413 };
414 
415 template <class element>
416 void printer::do_it() const {
417  std::cout << " object ["<< typeid(typename element::object).name() << "] ";
418  std::cout << " features [";
420  std::cout << "]";
421  std::cout << " container ["<< typeid(typename element::container).name() << "] ";
422  std::cout << std::endl;
423 }
424 
425 }//end_of_namespace TypeInformation
426 }//end_of_namespace HLT
427 
428 #endif
my_result
Definition: EDM_MasterSearch.h:25
HLT::TypeInformation::list::last_index
static const int last_index
Definition: TypeInformation.h:46
HLT::TypeInformation::do_my_add< type_info< O, F, C, A >, thelist, index >::old_entry
at< thelist, index >::type old_entry
Definition: TypeInformation.h:328
python.SystemOfUnits.second
int second
Definition: SystemOfUnits.py:120
HLT::TypeInformation::_at< list, 0 >::it
nx< list > it
Definition: TypeInformation.h:107
HLT::TypeInformation::newlist
Definition: TypeInformation.h:312
python.CaloRecoConfig.f
f
Definition: CaloRecoConfig.py:127
HLT::TypeInformation::list::join::go
join_lists< new_list, list< type, list_of_types > >::joined go
Definition: TypeInformation.h:220
HLT::TypeInformation::list::get::type
at< list< the_type, list_of_types >, i >::type type
Definition: TypeInformation.h:152
get_generator_info.result
result
Definition: get_generator_info.py:21
HLT::TypeInformation::ERROR_THE_FOLLOWING_TYPE_IS_NOT_KNOWN_TO_THE_EDM
Definition: TypeInformation.h:305
HLT::TypeInformation::printer::do_it
void do_it() const
Definition: TypeInformation.h:416
HLT::TypeInformation::join_lists< first, second, 0 >::joined
second::template add< typename at< first, 0 >::type >::go::done joined
Definition: TypeInformation.h:214
HLT::TypeInformation::nx
Definition: TypeInformation.h:93
HLT::TypeInformation::_at::type
it::type type
Definition: TypeInformation.h:102
HLT::TypeInformation::type_info::aux
_aux aux
Definition: TypeInformation.h:255
HLT::TypeInformation::do_range< thelist, begin, end, true >::type
list< last_item, nil > type
Definition: TypeInformation.h:165
HLT::TypeInformation::newlist::add
Definition: TypeInformation.h:313
HLT::TypeInformation::find
Definition: TypeInformation.h:260
HLT::TypeInformation::list::join
Definition: TypeInformation.h:54
index
Definition: index.py:1
HLT::TypeInformation::list::done
list< type, list_of_types > done
Definition: TypeInformation.h:50
DMTest::C
C_v1 C
Definition: C.h:26
HLT::TypeInformation::list::add
Definition: TypeInformation.h:52
HLT::TypeInformation::list::first
type first
Definition: TypeInformation.h:48
PlotCalibFromCool.begin
begin
Definition: PlotCalibFromCool.py:94
HLT::TypeInformation::simple_printer::do_it
void do_it() const
Definition: TypeInformation.h:407
taskman.template
dictionary template
Definition: taskman.py:317
HLT::TypeInformation::do_my_add< type_info< O, F, C, A >, thelist, index >::extended
old_feats::template join< new_feats >::go extended
Definition: TypeInformation.h:331
HLT::TypeInformation::type_info::container
_cont container
Definition: TypeInformation.h:254
HLT::TypeInformation::type_info::object
_objt object
Definition: TypeInformation.h:252
HLT::TypeInformation::list::addWithChecking< type_info< O, F, C, A > >::go
do_my_add< type_info< O, F, C, A >, list< type, list_of_types >, find< typename type_info< O, F, C, A >::container, list< type, list_of_types >, get_cont >::result >::result go
Definition: TypeInformation.h:345
HLT::TypeInformation::get_aux::result
static const bool result
Definition: TypeInformation.h:288
HLT::TypeInformation::newlist::addWithChecking
Definition: TypeInformation.h:314
athena.value
value
Definition: athena.py:122
HLT::TypeInformation::do_update< a_list, new_element, i, true >::result
list< typename replace_if< new_element, typename a_list::first, a_list::last_index==i >::result, nil > result
Definition: TypeInformation.h:194
HLT::TypeInformation::replace_if< new_element, old_element, true >::result
new_element result
Definition: TypeInformation.h:180
HLT::TypeInformation::for_each_type::do_it
static void do_it(functor *f=0)
Definition: TypeInformation.h:380
HLT::TypeInformation::get_objt
Definition: TypeInformation.h:283
HLT::TypeInformation::newlist::add::go
list< first_element, nil > go
Definition: TypeInformation.h:313
HLT::TypeInformation::list::get
Definition: TypeInformation.h:56
HLT::TypeInformation::get_feat
Definition: TypeInformation.h:291
HLT::TypeInformation::list::range::type
do_range< list< the_type, list_of_types >,(list< the_type, list_of_types >::last_index< begin) ? list< the_type, list_of_types >::last_index :begin,(list< the_type, list_of_types >::last_index< end) ? list< the_type, list_of_types >::last_index :end >::type type
Definition: TypeInformation.h:176
HLT::TypeInformation::list::range
Definition: TypeInformation.h:58
HLT::TypeInformation::do_add< new_element, thelist, false >::result
list< new_element, thelist > result
Definition: TypeInformation.h:76
HLT::TypeInformation::do_my_add< type_info< O, F, C, A >, thelist, index >::result
thelist::template set< index, type_info< typename old_entry::object, extended, typename old_entry::container, typename old_entry::aux > >::go result
Definition: TypeInformation.h:332
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
dqt_zlumi_alleff_HIST.A
A
Definition: dqt_zlumi_alleff_HIST.py:110
HLT::TypeInformation::type_info
Definition: TypeInformation.h:251
HLT::TypeInformation::at::type
_at< list, list::last_index-i >::type type
Definition: TypeInformation.h:113
HLT::TypeInformation::do_my_add< type_info< O, F, C, A >, thelist, index >::new_feats
type_info< O, F, C, A >::list_of_features new_feats
Definition: TypeInformation.h:330
HLT::TypeInformation::for_each_type_c
Definition: TypeInformation.h:368
HLT::TypeInformation::test< true, index, value >::output_type
int output_type
Definition: TypeInformation.h:239
HLT::TypeInformation::list::addWithChecking
Definition: TypeInformation.h:53
HLT::TypeInformation::join_lists
Definition: TypeInformation.h:208
HLT::TypeInformation::do_update< a_list, new_element, i, false >::result
list< typename replace_if< new_element, typename a_list::first, a_list::last_index==i >::result, typename do_update< typename a_list::rest, new_element, i >::result > result
Definition: TypeInformation.h:188
HLT::TypeInformation::_at
Definition: TypeInformation.h:100
HLT::TypeInformation::list::add::go
do_add< new_element, list< type, list_of_types > >::result go
Definition: TypeInformation.h:86
HLT::TypeInformation::_at::it
nx< typename _at< list, i-1 >::it > it
Definition: TypeInformation.h:101
HLT
It used to be useful piece of code for replacing actual SG with other store of similar functionality ...
Definition: HLTResultReader.h:26
HLT::TypeInformation::get_objt::result
static const bool result
Definition: TypeInformation.h:284
lumiFormat.i
int i
Definition: lumiFormat.py:92
HLT::TypeInformation::join_lists::joined
join_lists< first, second, index-1 >::joined::template add< typename at< first, index >::type >::go::done joined
Definition: TypeInformation.h:209
HLT::TypeInformation::get_cont
Definition: TypeInformation.h:279
HLT::TypeInformation::do_my_add< type_info< O, F, C, A >, thelist,-1 >::result
thelist::template add< type_info< O, F, C, A > >::go result
Definition: TypeInformation.h:323
HLT::TypeInformation::type_info::list_of_features
_list_of_feats list_of_features
Definition: TypeInformation.h:253
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
add
bool add(const std::string &hname, TKey *tobj)
Definition: fastadd.cxx:55
HLT::TypeInformation::get_aux
Definition: TypeInformation.h:287
HLT::TypeInformation::_at< list, 0 >::type
it::type type
Definition: TypeInformation.h:108
histSizes.list
def list(name, path='/')
Definition: histSizes.py:38
fitman.by
by
Definition: fitman.py:411
HLT::TypeInformation::do_add
Definition: TypeInformation.h:65
HLT::TypeInformation::no_aux
Definition: TypeInformation.h:248
HLT::TypeInformation::map_search
Definition: TypeInformation.h:300
HLT::TypeInformation::do_range::type
earlier_list::template add< last_item >::go::done type
Definition: TypeInformation.h:159
HLT::TypeInformation::get_element::result
static const bool result
Definition: TypeInformation.h:277
HLT::TypeInformation::list::set
Definition: TypeInformation.h:57
CxxUtils::set
constexpr std::enable_if_t< is_bitmask_v< E >, E & > set(E &lhs, E rhs)
Convenience function to set bits in a class enum bitmask.
Definition: bitmask.h:224
create_dcsc_inputs_sqlite.arg
list arg
Definition: create_dcsc_inputs_sqlite.py:48
HLT::TypeInformation::replace_if
Definition: TypeInformation.h:179
python.doZLumi.go
def go(fname)
Definition: doZLumi.py:78
HLT::TypeInformation::printer
Definition: TypeInformation.h:410
TCS::join
std::string join(const std::vector< std::string > &v, const char c=',')
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/Root/StringUtils.cxx:10
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
HLT::TypeInformation::for_each_type
Definition: TypeInformation.h:379
HLT::TypeInformation::get_element
Definition: TypeInformation.h:276
HLT::TypeInformation::do_my_add< type_info< O, F, C, A >, thelist, index >::old_feats
old_entry::list_of_features old_feats
Definition: TypeInformation.h:329
HLT::TypeInformation::do_range::last_item
at< thelist, end >::type last_item
Definition: TypeInformation.h:157
HLT::TypeInformation::newlist::addWithChecking::go
list< first_element, nil > go
Definition: TypeInformation.h:314
HLT::TypeInformation::do_update
Definition: TypeInformation.h:183
HLT::TypeInformation::test< false, index, value >::output_type
int output_type
Definition: TypeInformation.h:244
HLT::TypeInformation::list::rest
list_of_types rest
Definition: TypeInformation.h:49
HLT::TypeInformation::do_range::earlier_list
do_range< thelist, begin, end-1 >::type earlier_list
Definition: TypeInformation.h:158
HLT::TypeInformation::get_cont::result
static const bool result
Definition: TypeInformation.h:280
HLT::TypeInformation::simple_printer
Definition: TypeInformation.h:405
DeMoScan.index
string index
Definition: DeMoScan.py:362
CondAlgsOpts.found
int found
Definition: CondAlgsOpts.py:101
HLT::TypeInformation::do_search
Definition: TypeInformation.h:132
HLT::TypeInformation::map_search< element, list, by,-1 >::type
ERROR_THE_FOLLOWING_TYPE_IS_NOT_KNOWN_TO_THE_EDM< element > type
Definition: TypeInformation.h:309
HLT::TypeInformation::do_my_add
Definition: TypeInformation.h:319
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
DeMoScan.first
bool first
Definition: DeMoScan.py:534
HLT::TypeInformation::for_each_type< list, functor, 0 >::do_it
static void do_it(functor *f=0)
Definition: TypeInformation.h:395
F
#define F(x, y, z)
Definition: MD5.cxx:112
HLT::TypeInformation::find::result
static const int result
Definition: TypeInformation.h:261
HLT::TypeInformation::nil::last_index
static const int last_index
Definition: TypeInformation.h:29
pickleTool.object
object
Definition: pickleTool.py:30
HLT::TypeInformation::list::has
Definition: TypeInformation.h:55
HLT::TypeInformation::do_add< new_element, thelist, true >::result
thelist result
Definition: TypeInformation.h:70
HLT::TypeInformation::list::set::go
do_update< list< the_type, list_of_types >, new_element, i >::result go
Definition: TypeInformation.h:200
HLT::TypeInformation::do_range< thelist, begin, end, true >::last_item
at< thelist, end >::type last_item
Definition: TypeInformation.h:164
HLT::TypeInformation::for_each_type_c::type
functor< typename at< list, i >::type, typename for_each_type_c< list, functor, result, arg, i-1, false >::type, arg, isLast >::type type
Definition: TypeInformation.h:369
HLT::TypeInformation::nx::type
list::first type
Definition: TypeInformation.h:94
HLT::TypeInformation::list
Definition: TypeInformation.h:45
HLT::TypeInformation::nil
Definition: TypeInformation.h:28
HLT::TypeInformation::test
Definition: TypeInformation.h:236
HLT::TypeInformation::do_search::found
static const bool found
Definition: TypeInformation.h:133
HLT::TypeInformation::map_search::type
at< list, index >::type type
Definition: TypeInformation.h:301
HLT::TypeInformation::at
Definition: TypeInformation.h:112
HLT::TypeInformation::replace_if< new_element, old_element, false >::result
old_element result
Definition: TypeInformation.h:181
HLT::TypeInformation::get_feat::result
static const bool result
Definition: TypeInformation.h:292
HLT::TypeInformation::do_range
Definition: TypeInformation.h:156
HLT::TypeInformation::for_each_type_c< list, functor, result, arg, 0, isLast >::type
functor< typename at< list, 0 >::type, result, arg, false >::type type
Definition: TypeInformation.h:374