Jpp
JClass.hh
Go to the documentation of this file.
1 #ifndef __JLANG__JCLASS__
2 #define __JLANG__JCLASS__
3 
4 
5 /**
6  * \author mdejong
7  */
8 
9 namespace JLANG {}
10 namespace JPP { using namespace JLANG; }
11 
12 namespace JLANG {
13 
14 
15  /**
16  * Data structure for primitive types.
17  */
18  template<class T>
19  struct JPrimitive {
20 
21  typedef const T argument_type;
22 
23  enum { is_primitive = true };
24  };
25 
26 
27  /**
28  * Data structure for method argument types.
29  */
30  template<class T>
31  struct JArgument {
32 
33  typedef const T& argument_type;
34 
35  enum { is_primitive = false };
36  };
37 
38 
39  /**
40  * Specialisations of JArgument for primitive types.
41  */
42  template<> struct JArgument<bool> : public JPrimitive<bool> {};
43  template<> struct JArgument<char> : public JPrimitive<char> {};
44  template<> struct JArgument<unsigned char> : public JPrimitive<unsigned char> {};
45  template<> struct JArgument<short> : public JPrimitive<short> {};
46  template<> struct JArgument<unsigned short> : public JPrimitive<unsigned short> {};
47  template<> struct JArgument<int> : public JPrimitive<int> {};
48  template<> struct JArgument<unsigned int> : public JPrimitive<unsigned int> {};
49  template<> struct JArgument<long int> : public JPrimitive<long int> {};
50  template<> struct JArgument<unsigned long int> : public JPrimitive<unsigned long int> {};
51  template<> struct JArgument<long long int> : public JPrimitive<long long int> {};
52  template<> struct JArgument<unsigned long long int> : public JPrimitive<unsigned long long int> {};
53  template<> struct JArgument<float> : public JPrimitive<float> {};
54  template<> struct JArgument<double> : public JPrimitive<double> {};
55  template<> struct JArgument<long double> : public JPrimitive<long double> {};
56 
57 
58  /**
59  * Data structure to check whether given data type is an iterator.
60  */
61  template<class T>
62  struct is_iterator {
63 
64  static T make();
65 
66  typedef void* buffer[2];
67 
68  static buffer& test(...); //!< any type
69  template<class R> static typename R::iterator_category* test(R); //!< iterator
70  template<class R> static void* test(R *); //!< pointer
71 
72  static const bool value = sizeof(test(make())) == sizeof(void *);
73  };
74 
75 
76  /**
77  * Template for generic class types.
78  */
79  template<class T>
80  struct JClass {
81 
83  typedef T value_type;
86 
88  enum { is_reference = false };
89  enum { is_pointer = false };
90  enum { is_constant = false };
91  };
92 
93 
94  /**
95  * Specialisation of JClass for const class types.
96  */
97  template<class T>
98  struct JClass<const T> {
99 
101  typedef T value_type;
102  typedef const value_type& reference_type;
103  typedef const value_type* pointer_type;
104 
106  enum { is_reference = false };
107  enum { is_pointer = false };
108  enum { is_constant = true };
109  };
110 
111 
112  /**
113  * Specialisation of JClass for reference class types.
114  */
115  template<class T>
116  struct JClass<T&> {
117 
118  typedef T& argument_type;
119  typedef T value_type;
122 
123  enum { is_primitive = JArgument<T>::is_primitive };
124  enum { is_reference = true };
125  enum { is_pointer = false };
126  enum { is_constant = false };
127  };
128 
129 
130  /**
131  * Specialisation of JClass for const reference class types.
132  */
133  template<class T>
134  struct JClass<const T&> {
135 
136  typedef const T& argument_type;
137  typedef T value_type;
138  typedef const value_type& reference_type;
139  typedef const value_type* pointer_type;
140 
141  enum { is_primitive = JArgument<T>::is_primitive };
142  enum { is_reference = true };
143  enum { is_pointer = false };
144  enum { is_constant = true };
145  };
146 
147 
148  /**
149  * Specialisation of JClass for pointer class types.
150  */
151  template<class T>
152  struct JClass<T*> {
153 
154  typedef T* argument_type;
155  typedef T value_type;
158 
159  enum { is_primitive = JArgument<T>::is_primitive };
160  enum { is_reference = false };
161  enum { is_pointer = true };
162  enum { is_constant = false };
163  };
164 
165 
166  /**
167  * Specialisation of JClass for const pointer class types.
168  */
169  template<class T>
170  struct JClass<const T*> {
171 
172  typedef const T* argument_type;
173  typedef T value_type;
174  typedef const value_type*& reference_type;
175  typedef const value_type* pointer_type;
176 
177  enum { is_primitive = JArgument<T>::is_primitive };
178  enum { is_reference = false };
179  enum { is_pointer = true };
180  enum { is_constant = true };
181  };
182 
183 
184  /**
185  * Specialisation of JClass for pointer class types.
186  */
187  template<class T>
188  struct JClass<T*&> {
189 
190  typedef T*& argument_type;
191  typedef T value_type;
194 
195  enum { is_primitive = JArgument<T>::is_primitive };
196  enum { is_reference = true };
197  enum { is_pointer = true };
198  enum { is_constant = false };
199  };
200 
201 
202  /**
203  * Specialisation of JClass for const pointer class types.
204  */
205  template<class T>
206  struct JClass<const T*&> {
207 
208  typedef const T*& argument_type;
209  typedef T value_type;
210  typedef const value_type*& reference_type;
211  typedef const value_type* pointer_type;
212 
213  enum { is_primitive = JArgument<T>::is_primitive };
214  enum { is_reference = true };
215  enum { is_pointer = true };
216  enum { is_constant = true };
217  };
218 }
219 
220 #endif
JLANG::JClass::value_type
T value_type
Definition: JClass.hh:83
JLANG::JClass< T * >::value_type
T value_type
Definition: JClass.hh:155
JLANG::JClass< const T * >::pointer_type
const typedef value_type * pointer_type
Definition: JClass.hh:175
JLANG::JClass< const T & >::value_type
T value_type
Definition: JClass.hh:137
JLANG::JClass< T *& >::argument_type
T *& argument_type
Definition: JClass.hh:190
JLANG::JClass< T * >::reference_type
value_type *& reference_type
Definition: JClass.hh:156
JLANG::JClass< T *& >::reference_type
value_type *& reference_type
Definition: JClass.hh:192
JLANG::JClass::reference_type
value_type & reference_type
Definition: JClass.hh:84
JLANG::is_iterator::buffer
void * buffer[2]
Definition: JClass.hh:66
JLANG::is_iterator
Data structure to check whether given data type is an iterator.
Definition: JClass.hh:62
JLANG::JClass::is_pointer
Definition: JClass.hh:89
JLANG::JArgument::argument_type
const typedef T & argument_type
Definition: JClass.hh:33
JLANG::JClass::argument_type
JArgument< T >::argument_type argument_type
Definition: JClass.hh:82
JLANG::JClass< const T *& >::value_type
T value_type
Definition: JClass.hh:209
JLANG::JArgument::is_primitive
Definition: JClass.hh:35
JLANG::JClass
Template for generic class types.
Definition: JClass.hh:80
JLANG::JClass< const T *& >::pointer_type
const typedef value_type * pointer_type
Definition: JClass.hh:211
JLANG::is_iterator::make
static T make()
JLANG::JClass::is_constant
Definition: JClass.hh:90
JLANG::JClass< const T >::argument_type
JArgument< T >::argument_type argument_type
Definition: JClass.hh:100
JLANG::JClass< const T *& >::reference_type
const typedef value_type *& reference_type
Definition: JClass.hh:210
JLANG::JClass< T *& >::value_type
T value_type
Definition: JClass.hh:191
JPP
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Definition: JAAnetToolkit.hh:37
JLANG::JClass< T & >::pointer_type
value_type * pointer_type
Definition: JClass.hh:121
JLANG::JClass< const T & >::argument_type
const typedef T & argument_type
Definition: JClass.hh:136
JLANG::JClass< const T >::pointer_type
const typedef value_type * pointer_type
Definition: JClass.hh:103
JLANG::is_iterator::test
static buffer & test(...)
any type
JLANG::JClass::is_reference
Definition: JClass.hh:88
JLANG::JClass< T & >::reference_type
value_type & reference_type
Definition: JClass.hh:120
JLANG::JClass< T * >::argument_type
T * argument_type
Definition: JClass.hh:154
JLANG::JPrimitive
Data structure for primitive types.
Definition: JClass.hh:19
JLANG::JClass< const T * >::value_type
T value_type
Definition: JClass.hh:173
JLANG::JClass< const T *& >::argument_type
const typedef T *& argument_type
Definition: JClass.hh:208
JLANG::JClass::is_primitive
Definition: JClass.hh:87
JLANG::JClass< T * >::pointer_type
value_type * pointer_type
Definition: JClass.hh:157
JLANG::JClass< const T & >::reference_type
const typedef value_type & reference_type
Definition: JClass.hh:138
JLANG::JClass< const T >::reference_type
const typedef value_type & reference_type
Definition: JClass.hh:102
JLANG::JPrimitive::argument_type
const typedef T argument_type
Definition: JClass.hh:21
JLANG::JClass< T & >::value_type
T value_type
Definition: JClass.hh:119
JLANG::JClass::pointer_type
value_type * pointer_type
Definition: JClass.hh:85
JLANG::JClass< T *& >::pointer_type
value_type * pointer_type
Definition: JClass.hh:193
JLANG
Auxiliary classes and methods for language specific functionality.
Definition: JAbstractClass.hh:10
JLANG::is_iterator::value
static const bool value
Definition: JClass.hh:72
JLANG::JClass< const T >::value_type
T value_type
Definition: JClass.hh:101
JLANG::JClass< T & >::argument_type
T & argument_type
Definition: JClass.hh:118
JLANG::JArgument
Data structure for method argument types.
Definition: JClass.hh:31
JLANG::JPrimitive::is_primitive
Definition: JClass.hh:23
JLANG::JClass< const T * >::reference_type
const typedef value_type *& reference_type
Definition: JClass.hh:174
JLANG::JClass< const T * >::argument_type
const typedef T * argument_type
Definition: JClass.hh:172
JLANG::JClass< const T & >::pointer_type
const typedef value_type * pointer_type
Definition: JClass.hh:139