root / trunk / tbeta / OSX / libs / poco / include / Poco / NamedTuple.h @ 151

View | Annotate | Download (154.2 KB)

1
//
2
// NamedTuple.h
3
//
4
// $Id: //poco/1.3/Foundation/include/Poco/NamedTuple.h#3 $
5
//
6
// Library: Foundation
7
// Package: Core
8
// Module:  NamedTuple
9
//
10
// Definition of the NamedTuple class.
11
//
12
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
13
// and Contributors.
14
//
15
// Permission is hereby granted, free of charge, to any person or organization
16
// obtaining a copy of the software and accompanying documentation covered by
17
// this license (the "Software") to use, reproduce, display, distribute,
18
// execute, and transmit the Software, and to prepare derivative works of the
19
// Software, and to permit third-parties to whom the Software is furnished to
20
// do so, all subject to the following:
21
// 
22
// The copyright notices in the Software and this entire statement, including
23
// the above license grant, this restriction and the following disclaimer,
24
// must be included in all copies of the Software, in whole or in part, and
25
// all derivative works of the Software, unless such copies or derivative
26
// works are solely in the form of machine-executable object code generated by
27
// a source language processor.
28
// 
29
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
30
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
31
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
32
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
33
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
34
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
35
// DEALINGS IN THE SOFTWARE.
36
//
37
38
39
#ifndef Foundation_NamedTuple_INCLUDED
40
#define Foundation_NamedTuple_INCLUDED
41
42
43
#include "Poco/Foundation.h"
44
#include "Poco/Tuple.h"
45
#include "Poco/TypeList.h"
46
#include "Poco/DynamicAny.h"
47
#include "Poco/SharedPtr.h"
48
#include "Poco/Format.h"
49
50
51
namespace Poco {
52
53
54
template<class T0, 
55
    class T1 = NullTypeList,
56
    class T2 = NullTypeList,
57
    class T3 = NullTypeList,
58
    class T4 = NullTypeList,
59
    class T5 = NullTypeList,
60
    class T6 = NullTypeList,
61
    class T7 = NullTypeList, 
62
    class T8 = NullTypeList,
63
    class T9 = NullTypeList,
64
    class T10 = NullTypeList,
65
    class T11 = NullTypeList,
66
    class T12 = NullTypeList,
67
    class T13 = NullTypeList,
68
    class T14 = NullTypeList,
69
    class T15 = NullTypeList,
70
    class T16 = NullTypeList,
71
    class T17 = NullTypeList,
72
    class T18 = NullTypeList,
73
    class T19 = NullTypeList>
74
struct NamedTuple: public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19>
75
{
76
        typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19> TupleType;
77
        typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19>::Type Type;
78
    typedef std::vector<std::string> NameVec; 
79
    typedef SharedPtr<NameVec> NameVecPtr; 
80
81
    NamedTuple(): _pNames(0)
82
    {
83
        init();
84
    }
85
86
    NamedTuple(const NameVecPtr& rNames)
87
    {
88
        if (rNames->size() != TupleType::length)
89
            throw InvalidArgumentException("Wrong names vector length."); 
90
91
        _pNames = rNames;
92
    }
93
94
    NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
95
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1), 
96
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
97
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
98
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
99
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
100
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
101
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
102
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
103
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9), 
104
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10), 
105
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11), 
106
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12), 
107
        typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13), 
108
        typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14), 
109
        typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15), 
110
        typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16), 
111
        typename TypeWrapper<T17>::CONSTTYPE& t17 = POCO_TYPEWRAPPER_DEFAULTVALUE(T17), 
112
        typename TypeWrapper<T18>::CONSTTYPE& t18 = POCO_TYPEWRAPPER_DEFAULTVALUE(T18), 
113
        typename TypeWrapper<T19>::CONSTTYPE& t19 = POCO_TYPEWRAPPER_DEFAULTVALUE(T19)): 
114
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19), 
115
                _pNames(0)
116
    {
117
        init();
118
    }
119
120
    NamedTuple(const NameVecPtr& rNames, 
121
        typename TypeWrapper<T0>::CONSTTYPE& t0,
122
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
123
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
124
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
125
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
126
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
127
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
128
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
129
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
130
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9), 
131
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10), 
132
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11), 
133
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12), 
134
        typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13), 
135
        typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14), 
136
        typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15), 
137
        typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16), 
138
        typename TypeWrapper<T17>::CONSTTYPE& t17 = POCO_TYPEWRAPPER_DEFAULTVALUE(T17), 
139
        typename TypeWrapper<T18>::CONSTTYPE& t18 = POCO_TYPEWRAPPER_DEFAULTVALUE(T18), 
140
        typename TypeWrapper<T19>::CONSTTYPE& t19 = POCO_TYPEWRAPPER_DEFAULTVALUE(T19)): 
141
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19)
142
    {
143
                if (rNames->size() != TupleType::length)
144
            throw InvalidArgumentException("Wrong names vector length."); 
145
146
        _pNames = rNames;
147
    }
148
149
    NamedTuple(const std::string& n0,
150
        typename TypeWrapper<T0>::CONSTTYPE& t0, 
151
        const std::string& n1 = "B",
152
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
153
        const std::string& n2 = "C",
154
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
155
        const std::string& n3 = "D",
156
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
157
        const std::string& n4 = "E",
158
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4), 
159
        const std::string& n5 = "F",
160
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
161
        const std::string& n6 = "G",
162
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6), 
163
        const std::string& n7 = "H",
164
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
165
        const std::string& n8 = "I",
166
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
167
        const std::string& n9 = "J",
168
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
169
        const std::string& n10 = "K",
170
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
171
        const std::string& n11 = "L",
172
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
173
        const std::string& n12 = "M",
174
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
175
        const std::string& n13 = "N",
176
        typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
177
        const std::string& n14 = "O",
178
        typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
179
        const std::string& n15 = "P",
180
        typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15),
181
        const std::string& n16 = "Q",
182
        typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16),
183
        const std::string& n17 = "R",
184
        typename TypeWrapper<T17>::CONSTTYPE& t17 = POCO_TYPEWRAPPER_DEFAULTVALUE(T17),
185
        const std::string& n18 = "S",
186
        typename TypeWrapper<T18>::CONSTTYPE& t18 = POCO_TYPEWRAPPER_DEFAULTVALUE(T18),
187
                const std::string& n19 = "T",
188
        typename TypeWrapper<T19>::CONSTTYPE& t19 = POCO_TYPEWRAPPER_DEFAULTVALUE(T19)): 
189
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19), 
190
                _pNames(0) 
191
    {
192
        init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16,n17,n18,n19);
193
    }
194
195
    const DynamicAny get(const std::string& name) const
196
    {
197
        NameVec::const_iterator it = _pNames->begin(); 
198
        NameVec::const_iterator itEnd = _pNames->end();
199
200
        for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
201
        {
202
            if (name == *it)
203
            {
204
                switch (counter)
205
                { 
206
                    case 0: return TupleType::template get<0>();
207
                    case 1: return TupleType::template get<1>();
208
                    case 2: return TupleType::template get<2>();
209
                    case 3: return TupleType::template get<3>(); 
210
                    case 4: return TupleType::template get<4>();
211
                    case 5: return TupleType::template get<5>();
212
                    case 6: return TupleType::template get<6>();
213
                    case 7: return TupleType::template get<7>(); 
214
                    case 8: return TupleType::template get<8>();
215
                    case 9: return TupleType::template get<9>();
216
                                        case 10: return TupleType::template get<10>();
217
                                        case 11: return TupleType::template get<11>();
218
                                        case 12: return TupleType::template get<12>();
219
                                        case 13: return TupleType::template get<13>();
220
                                        case 14: return TupleType::template get<14>();
221
                                        case 15: return TupleType::template get<15>();
222
                                        case 16: return TupleType::template get<16>();
223
                                        case 17: return TupleType::template get<17>();
224
                                        case 18: return TupleType::template get<18>();
225
                                        case 19: return TupleType::template get<19>();
226
                    default: throw RangeException();
227
                }
228
            }
229
        } 
230
231
        throw NotFoundException("Name not found: " + name);
232
    }
233
234
    const DynamicAny operator [] (const std::string& name) const
235
    {
236
        return get(name);
237
    }
238
239
    template<int N>
240
    typename TypeGetter<N, Type>::ConstHeadType& get() const 
241
    {
242
        return TupleType::template get<N>();
243
    }
244
245
    template<int N>
246
    typename TypeGetter<N, Type>::HeadType& get()
247
    {
248
        return TupleType::template get<N>();
249
    }
250
251
    template<int N>
252
    void set(typename TypeGetter<N, Type>::ConstHeadType& val)
253
    {
254
        return TupleType::template set<N>(val);
255
    }
256
257
    const NameVecPtr& names()
258
    {
259
        return _pNames; 
260
    }
261
262
        void setName(std::size_t index, const std::string& name)
263
        {
264
                if (index >= _pNames->size())
265
                        throw InvalidArgumentException(format("Invalid index: %z", index));
266
267
                (*_pNames)[index] = name;
268
        }
269
270
        const std::string& getName(std::size_t index)
271
        {
272
                if (index >= _pNames->size())
273
                        throw InvalidArgumentException(format("Invalid index: %z", index));
274
275
                return (*_pNames)[index];
276
        }
277
278
    bool operator == (const NamedTuple& other) const
279
    {
280
        return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
281
    }
282
283
    bool operator != (const NamedTuple& other) const 
284
    {
285
        return !(*this == other);
286
    }
287
288
    bool operator < (const NamedTuple& other) const
289
    {
290
        TupleType th(*this);
291
        TupleType oth(other); 
292
293
        return (th < oth && _pNames == other._pNames) || 
294
            (th == oth && _pNames < other._pNames) ||
295
            (th < oth && _pNames < other._pNames);
296
    }
297
298
private:
299
    void init(const std::string& n0 = "A",
300
        const std::string& n1 = "B",
301
        const std::string& n2 = "C",
302
        const std::string& n3 = "D",
303
        const std::string& n4 = "E",
304
        const std::string& n5 = "F", 
305
        const std::string& n6 = "G",
306
        const std::string& n7 = "H",
307
        const std::string& n8 = "I",
308
        const std::string& n9 = "J",
309
        const std::string& n10 = "K",
310
        const std::string& n11 = "L",
311
        const std::string& n12 = "M",
312
        const std::string& n13 = "N",
313
        const std::string& n14 = "O",
314
        const std::string& n15 = "P",
315
        const std::string& n16 = "Q",
316
        const std::string& n17 = "R",
317
        const std::string& n18 = "S",
318
        const std::string& n19 = "T")
319
    { 
320
        if (!_pNames)
321
        {
322
            _pNames = new NameVec;
323
            _pNames->push_back(n0);
324
            _pNames->push_back(n1);
325
            _pNames->push_back(n2);
326
            _pNames->push_back(n3); 
327
            _pNames->push_back(n4);
328
            _pNames->push_back(n5);
329
            _pNames->push_back(n6);
330
            _pNames->push_back(n7);
331
            _pNames->push_back(n8);
332
            _pNames->push_back(n9); 
333
                        _pNames->push_back(n10); 
334
                        _pNames->push_back(n11); 
335
                        _pNames->push_back(n12); 
336
                        _pNames->push_back(n13); 
337
                        _pNames->push_back(n14); 
338
                        _pNames->push_back(n15); 
339
                        _pNames->push_back(n16); 
340
                        _pNames->push_back(n17); 
341
                        _pNames->push_back(n18); 
342
                        _pNames->push_back(n19); 
343
        }
344
    }
345
346
    NameVecPtr _pNames;
347
};
348
349
350
template<class T0, 
351
    class T1,
352
    class T2,
353
    class T3,
354
    class T4,
355
    class T5,
356
    class T6,
357
    class T7, 
358
    class T8,
359
    class T9,
360
    class T10,
361
    class T11,
362
    class T12,
363
    class T13,
364
    class T14,
365
    class T15,
366
    class T16,
367
    class T17,
368
    class T18>
369
struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,NullTypeList>:
370
        public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18>
371
{
372
        typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18> TupleType;
373
        typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18>::Type Type;
374
    typedef std::vector<std::string> NameVec; 
375
    typedef SharedPtr<NameVec> NameVecPtr; 
376
377
    NamedTuple(): _pNames(0)
378
    {
379
        init();
380
    }
381
382
    NamedTuple(const NameVecPtr& rNames) 
383
    {
384
        if (rNames->size() != TupleType::length)
385
            throw InvalidArgumentException("Wrong names vector length."); 
386
387
        _pNames = rNames;
388
    }
389
390
    NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
391
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1), 
392
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
393
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
394
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
395
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
396
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
397
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
398
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
399
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9), 
400
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10), 
401
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11), 
402
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12), 
403
        typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13), 
404
        typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14), 
405
        typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15), 
406
        typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16), 
407
        typename TypeWrapper<T17>::CONSTTYPE& t17 = POCO_TYPEWRAPPER_DEFAULTVALUE(T17), 
408
        typename TypeWrapper<T18>::CONSTTYPE& t18 = POCO_TYPEWRAPPER_DEFAULTVALUE(T18)): 
409
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18), 
410
                _pNames(0)
411
    {
412
        init();
413
    }
414
415
    NamedTuple(const NameVecPtr& rNames, 
416
        typename TypeWrapper<T0>::CONSTTYPE& t0,
417
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
418
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
419
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
420
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
421
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
422
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
423
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
424
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
425
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9), 
426
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10), 
427
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11), 
428
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12), 
429
        typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13), 
430
        typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14), 
431
        typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15), 
432
        typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16), 
433
        typename TypeWrapper<T17>::CONSTTYPE& t17 = POCO_TYPEWRAPPER_DEFAULTVALUE(T17), 
434
        typename TypeWrapper<T18>::CONSTTYPE& t18 = POCO_TYPEWRAPPER_DEFAULTVALUE(T18)): 
435
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18)
436
    {
437
                if (rNames->size() != TupleType::length)
438
            throw InvalidArgumentException("Wrong names vector length."); 
439
440
        _pNames = rNames;
441
    }
442
443
    NamedTuple(const std::string& n0,
444
        typename TypeWrapper<T0>::CONSTTYPE& t0, 
445
        const std::string& n1 = "B",
446
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
447
        const std::string& n2 = "C",
448
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
449
        const std::string& n3 = "D",
450
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
451
        const std::string& n4 = "E",
452
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4), 
453
        const std::string& n5 = "F",
454
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
455
        const std::string& n6 = "G",
456
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6), 
457
        const std::string& n7 = "H",
458
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
459
        const std::string& n8 = "I",
460
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
461
        const std::string& n9 = "J",
462
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
463
        const std::string& n10 = "K",
464
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
465
        const std::string& n11 = "L",
466
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
467
        const std::string& n12 = "M",
468
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
469
        const std::string& n13 = "N",
470
        typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
471
        const std::string& n14 = "O",
472
        typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
473
        const std::string& n15 = "P",
474
        typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15),
475
        const std::string& n16 = "Q",
476
        typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16),
477
        const std::string& n17 = "R",
478
        typename TypeWrapper<T17>::CONSTTYPE& t17 = POCO_TYPEWRAPPER_DEFAULTVALUE(T17),
479
        const std::string& n18 = "S",
480
        typename TypeWrapper<T18>::CONSTTYPE& t18 = POCO_TYPEWRAPPER_DEFAULTVALUE(T18)): 
481
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18), 
482
                _pNames(0) 
483
    {
484
        init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16,n17,n18);
485
    }
486
487
    const DynamicAny get(const std::string& name) const
488
    {
489
        NameVec::const_iterator it = _pNames->begin(); 
490
        NameVec::const_iterator itEnd = _pNames->end();
491
492
        for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
493
        {
494
            if (name == *it)
495
            {
496
                switch (counter)
497
                { 
498
                    case 0: return TupleType::template get<0>();
499
                    case 1: return TupleType::template get<1>();
500
                    case 2: return TupleType::template get<2>();
501
                    case 3: return TupleType::template get<3>(); 
502
                    case 4: return TupleType::template get<4>();
503
                    case 5: return TupleType::template get<5>();
504
                    case 6: return TupleType::template get<6>();
505
                    case 7: return TupleType::template get<7>(); 
506
                    case 8: return TupleType::template get<8>();
507
                    case 9: return TupleType::template get<9>();
508
                                        case 10: return TupleType::template get<10>();
509
                                        case 11: return TupleType::template get<11>();
510
                                        case 12: return TupleType::template get<12>();
511
                                        case 13: return TupleType::template get<13>();
512
                                        case 14: return TupleType::template get<14>();
513
                                        case 15: return TupleType::template get<15>();
514
                                        case 16: return TupleType::template get<16>();
515
                                        case 17: return TupleType::template get<17>();
516
                                        case 18: return TupleType::template get<18>();
517
                    default: throw RangeException();
518
                }
519
            }
520
        } 
521
522
                throw NotFoundException("Name not found: " + name);
523
    }
524
525
    const DynamicAny operator [] (const std::string& name) const
526
    {
527
        return get(name);
528
    }
529
530
    template<int N>
531
    typename TypeGetter<N, Type>::ConstHeadType& get() const 
532
    {
533
        return TupleType::template get<N>();
534
    }
535
536
    template<int N>
537
    typename TypeGetter<N, Type>::HeadType& get()
538
    {
539
        return TupleType::template get<N>();
540
    }
541
542
    template<int N>
543
    void set(typename TypeGetter<N, Type>::ConstHeadType& val)
544
    {
545
        return TupleType::template set<N>(val);
546
    }
547
548
    const NameVecPtr& names()
549
    {
550
        return _pNames; 
551
    }
552
553
    void setName(std::size_t index, const std::string& name)
554
        {
555
                if (index >= _pNames->size())
556
                        throw InvalidArgumentException(format("Invalid index: %z", index));
557
558
                (*_pNames)[index] = name;
559
        }
560
561
        const std::string& getName(std::size_t index)
562
        {
563
                if (index >= _pNames->size())
564
                        throw InvalidArgumentException(format("Invalid index: %z", index));
565
566
                return (*_pNames)[index];
567
        }
568
569
    bool operator == (const NamedTuple& other) const
570
    {
571
        return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
572
    }
573
574
    bool operator != (const NamedTuple& other) const 
575
    {
576
        return !(*this == other);
577
    }
578
579
    bool operator < (const NamedTuple& other) const
580
    {
581
        TupleType th(*this);
582
        TupleType oth(other); 
583
584
        return (th < oth && _pNames == other._pNames) || 
585
            (th == oth && _pNames < other._pNames) ||
586
            (th < oth && _pNames < other._pNames);
587
    }
588
589
private:
590
    void init(const std::string& n0 = "A",
591
        const std::string& n1 = "B",
592
        const std::string& n2 = "C",
593
        const std::string& n3 = "D",
594
        const std::string& n4 = "E",
595
        const std::string& n5 = "F", 
596
        const std::string& n6 = "G",
597
        const std::string& n7 = "H",
598
        const std::string& n8 = "I",
599
        const std::string& n9 = "J",
600
        const std::string& n10 = "K",
601
        const std::string& n11 = "L",
602
        const std::string& n12 = "M",
603
        const std::string& n13 = "N",
604
        const std::string& n14 = "O",
605
        const std::string& n15 = "P",
606
        const std::string& n16 = "Q",
607
        const std::string& n17 = "R",
608
        const std::string& n18 = "S")
609
    { 
610
        if (!_pNames)
611
        {
612
            _pNames = new NameVec;
613
            _pNames->push_back(n0);
614
            _pNames->push_back(n1);
615
            _pNames->push_back(n2);
616
            _pNames->push_back(n3); 
617
            _pNames->push_back(n4);
618
            _pNames->push_back(n5);
619
            _pNames->push_back(n6);
620
            _pNames->push_back(n7);
621
            _pNames->push_back(n8);
622
            _pNames->push_back(n9); 
623
                        _pNames->push_back(n10); 
624
                        _pNames->push_back(n11); 
625
                        _pNames->push_back(n12); 
626
                        _pNames->push_back(n13); 
627
                        _pNames->push_back(n14); 
628
                        _pNames->push_back(n15); 
629
                        _pNames->push_back(n16); 
630
                        _pNames->push_back(n17); 
631
                        _pNames->push_back(n18); 
632
        }
633
    }
634
635
    NameVecPtr _pNames;
636
};
637
638
639
template<class T0, 
640
    class T1,
641
    class T2,
642
    class T3,
643
    class T4,
644
    class T5,
645
    class T6,
646
    class T7, 
647
    class T8,
648
    class T9,
649
    class T10,
650
    class T11,
651
    class T12,
652
    class T13,
653
    class T14,
654
    class T15,
655
    class T16,
656
    class T17>
657
struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,NullTypeList>:
658
        public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17>
659
{
660
        typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17> TupleType;
661
        typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17>::Type Type;
662
    typedef std::vector<std::string> NameVec; 
663
    typedef SharedPtr<NameVec> NameVecPtr; 
664
665
    NamedTuple(): _pNames(0)
666
    {
667
        init();
668
    }
669
670
    NamedTuple(const NameVecPtr& rNames)
671
    {
672
        if (rNames->size() != TupleType::length)
673
            throw InvalidArgumentException("Wrong names vector length."); 
674
675
        _pNames = rNames;
676
    }
677
678
    NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
679
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1), 
680
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
681
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
682
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
683
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
684
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
685
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
686
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
687
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9), 
688
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10), 
689
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11), 
690
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12), 
691
        typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13), 
692
        typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14), 
693
        typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15), 
694
        typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16), 
695
        typename TypeWrapper<T17>::CONSTTYPE& t17 = POCO_TYPEWRAPPER_DEFAULTVALUE(T17)): 
696
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17), 
697
                _pNames(0)
698
    {
699
        init();
700
    }
701
702
    NamedTuple(const NameVecPtr& rNames, 
703
        typename TypeWrapper<T0>::CONSTTYPE& t0,
704
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
705
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
706
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
707
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
708
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
709
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
710
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
711
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
712
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9), 
713
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10), 
714
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11), 
715
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12), 
716
        typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13), 
717
        typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14), 
718
        typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15), 
719
        typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16), 
720
        typename TypeWrapper<T17>::CONSTTYPE& t17 = POCO_TYPEWRAPPER_DEFAULTVALUE(T17)): 
721
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17)
722
    {
723
                if (rNames->size() != TupleType::length)
724
            throw InvalidArgumentException("Wrong names vector length."); 
725
726
        _pNames = rNames;
727
    }
728
729
    NamedTuple(const std::string& n0,
730
        typename TypeWrapper<T0>::CONSTTYPE& t0, 
731
        const std::string& n1 = "B",
732
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
733
        const std::string& n2 = "C",
734
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
735
        const std::string& n3 = "D",
736
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
737
        const std::string& n4 = "E",
738
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4), 
739
        const std::string& n5 = "F",
740
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
741
        const std::string& n6 = "G",
742
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6), 
743
        const std::string& n7 = "H",
744
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
745
        const std::string& n8 = "I",
746
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
747
        const std::string& n9 = "J",
748
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
749
        const std::string& n10 = "K",
750
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
751
        const std::string& n11 = "L",
752
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
753
        const std::string& n12 = "M",
754
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
755
        const std::string& n13 = "N",
756
        typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
757
        const std::string& n14 = "O",
758
        typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
759
        const std::string& n15 = "P",
760
        typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15),
761
        const std::string& n16 = "Q",
762
        typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16),
763
        const std::string& n17 = "R",
764
        typename TypeWrapper<T17>::CONSTTYPE& t17 = POCO_TYPEWRAPPER_DEFAULTVALUE(T17)): 
765
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17), 
766
                _pNames(0) 
767
    {
768
        init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16,n17);
769
    }
770
771
    const DynamicAny get(const std::string& name) const
772
    {
773
        NameVec::const_iterator it = _pNames->begin(); 
774
        NameVec::const_iterator itEnd = _pNames->end();
775
776
        for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
777
        {
778
            if (name == *it)
779
            {
780
                switch (counter)
781
                { 
782
                    case 0: return TupleType::template get<0>();
783
                    case 1: return TupleType::template get<1>();
784
                    case 2: return TupleType::template get<2>();
785
                    case 3: return TupleType::template get<3>(); 
786
                    case 4: return TupleType::template get<4>();
787
                    case 5: return TupleType::template get<5>();
788
                    case 6: return TupleType::template get<6>();
789
                    case 7: return TupleType::template get<7>(); 
790
                    case 8: return TupleType::template get<8>();
791
                    case 9: return TupleType::template get<9>();
792
                                        case 10: return TupleType::template get<10>();
793
                                        case 11: return TupleType::template get<11>();
794
                                        case 12: return TupleType::template get<12>();
795
                                        case 13: return TupleType::template get<13>();
796
                                        case 14: return TupleType::template get<14>();
797
                                        case 15: return TupleType::template get<15>();
798
                                        case 16: return TupleType::template get<16>();
799
                                        case 17: return TupleType::template get<17>();
800
                    default: throw RangeException();
801
                }
802
            }
803
        } 
804
805
                throw NotFoundException("Name not found: " + name);
806
    }
807
808
    const DynamicAny operator [] (const std::string& name) const
809
    {
810
        return get(name);
811
    }
812
813
    template<int N>
814
    typename TypeGetter<N, Type>::ConstHeadType& get() const 
815
    {
816
        return TupleType::template get<N>();
817
    }
818
819
    template<int N>
820
    typename TypeGetter<N, Type>::HeadType& get()
821
    {
822
        return TupleType::template get<N>();
823
    }
824
825
    template<int N>
826
    void set(typename TypeGetter<N, Type>::ConstHeadType& val)
827
    {
828
        return TupleType::template set<N>(val);
829
    }
830
831
    const NameVecPtr& names()
832
    {
833
        return _pNames; 
834
    }
835
836
    void setName(std::size_t index, const std::string& name)
837
        {
838
                if (index >= _pNames->size())
839
                        throw InvalidArgumentException(format("Invalid index: %z", index));
840
841
                (*_pNames)[index] = name;
842
        }
843
844
        const std::string& getName(std::size_t index)
845
        {
846
                if (index >= _pNames->size())
847
                        throw InvalidArgumentException(format("Invalid index: %z", index));
848
849
                return (*_pNames)[index];
850
        }
851
852
    bool operator == (const NamedTuple& other) const
853
    {
854
        return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
855
    }
856
857
    bool operator != (const NamedTuple& other) const 
858
    {
859
        return !(*this == other);
860
    }
861
862
    bool operator < (const NamedTuple& other) const
863
    {
864
        TupleType th(*this);
865
        TupleType oth(other); 
866
867
        return (th < oth && _pNames == other._pNames) || 
868
            (th == oth && _pNames < other._pNames) ||
869
            (th < oth && _pNames < other._pNames);
870
    }
871
872
private:
873
    void init(const std::string& n0 = "A",
874
        const std::string& n1 = "B",
875
        const std::string& n2 = "C",
876
        const std::string& n3 = "D",
877
        const std::string& n4 = "E",
878
        const std::string& n5 = "F", 
879
        const std::string& n6 = "G",
880
        const std::string& n7 = "H",
881
        const std::string& n8 = "I",
882
        const std::string& n9 = "J",
883
        const std::string& n10 = "K",
884
        const std::string& n11 = "L",
885
        const std::string& n12 = "M",
886
        const std::string& n13 = "N",
887
        const std::string& n14 = "O",
888
        const std::string& n15 = "P",
889
        const std::string& n16 = "Q",
890
        const std::string& n17 = "R")
891
    { 
892
        if (!_pNames)
893
        {
894
            _pNames = new NameVec;
895
            _pNames->push_back(n0);
896
            _pNames->push_back(n1);
897
            _pNames->push_back(n2);
898
            _pNames->push_back(n3); 
899
            _pNames->push_back(n4);
900
            _pNames->push_back(n5);
901
            _pNames->push_back(n6);
902
            _pNames->push_back(n7);
903
            _pNames->push_back(n8);
904
            _pNames->push_back(n9); 
905
                        _pNames->push_back(n10); 
906
                        _pNames->push_back(n11); 
907
                        _pNames->push_back(n12); 
908
                        _pNames->push_back(n13); 
909
                        _pNames->push_back(n14); 
910
                        _pNames->push_back(n15); 
911
                        _pNames->push_back(n16); 
912
                        _pNames->push_back(n17); 
913
        }
914
    }
915
916
    NameVecPtr _pNames;
917
};
918
919
920
template<class T0, 
921
    class T1,
922
    class T2,
923
    class T3,
924
    class T4,
925
    class T5,
926
    class T6,
927
    class T7, 
928
    class T8,
929
    class T9,
930
    class T10,
931
    class T11,
932
    class T12,
933
    class T13,
934
    class T14,
935
    class T15,
936
    class T16>
937
struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,NullTypeList>:
938
        public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>
939
{
940
        typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16> TupleType;
941
        typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>::Type Type;
942
    typedef std::vector<std::string> NameVec; 
943
    typedef SharedPtr<NameVec> NameVecPtr; 
944
945
    NamedTuple(): _pNames(0)
946
    {
947
        init();
948
    }
949
950
    NamedTuple(const NameVecPtr& rNames) 
951
    {
952
        if (rNames->size() != TupleType::length)
953
            throw InvalidArgumentException("Wrong names vector length."); 
954
955
        _pNames = rNames;
956
    }
957
958
    NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
959
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1), 
960
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
961
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
962
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
963
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
964
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
965
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
966
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
967
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9), 
968
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10), 
969
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11), 
970
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12), 
971
        typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13), 
972
        typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14), 
973
        typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15), 
974
        typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16)): 
975
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16), 
976
                _pNames(0)
977
    {
978
        init();
979
    }
980
981
    NamedTuple(const NameVecPtr& rNames, 
982
        typename TypeWrapper<T0>::CONSTTYPE& t0,
983
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
984
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
985
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
986
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
987
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
988
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
989
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
990
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
991
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9), 
992
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10), 
993
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11), 
994
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12), 
995
        typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13), 
996
        typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14), 
997
        typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15), 
998
        typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16)): 
999
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16)
1000
    {
1001
                if (rNames->size() != TupleType::length)
1002
            throw InvalidArgumentException("Wrong names vector length."); 
1003
1004
        _pNames = rNames;
1005
    }
1006
1007
    NamedTuple(const std::string& n0,
1008
        typename TypeWrapper<T0>::CONSTTYPE& t0, 
1009
        const std::string& n1 = "B",
1010
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
1011
        const std::string& n2 = "C",
1012
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
1013
        const std::string& n3 = "D",
1014
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
1015
        const std::string& n4 = "E",
1016
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4), 
1017
        const std::string& n5 = "F",
1018
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
1019
        const std::string& n6 = "G",
1020
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6), 
1021
        const std::string& n7 = "H",
1022
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
1023
        const std::string& n8 = "I",
1024
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
1025
        const std::string& n9 = "J",
1026
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
1027
        const std::string& n10 = "K",
1028
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
1029
        const std::string& n11 = "L",
1030
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
1031
        const std::string& n12 = "M",
1032
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
1033
        const std::string& n13 = "N",
1034
        typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
1035
        const std::string& n14 = "O",
1036
        typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
1037
        const std::string& n15 = "P",
1038
        typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15),
1039
        const std::string& n16 = "Q",
1040
        typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16)): 
1041
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16), 
1042
                _pNames(0) 
1043
    {
1044
        init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16);
1045
    }
1046
1047
    const DynamicAny get(const std::string& name) const
1048
    {
1049
        NameVec::const_iterator it = _pNames->begin(); 
1050
        NameVec::const_iterator itEnd = _pNames->end();
1051
1052
        for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
1053
        {
1054
            if (name == *it)
1055
            {
1056
                switch (counter)
1057
                { 
1058
                    case 0: return TupleType::template get<0>();
1059
                    case 1: return TupleType::template get<1>();
1060
                    case 2: return TupleType::template get<2>();
1061
                    case 3: return TupleType::template get<3>(); 
1062
                    case 4: return TupleType::template get<4>();
1063
                    case 5: return TupleType::template get<5>();
1064
                    case 6: return TupleType::template get<6>();
1065
                    case 7: return TupleType::template get<7>(); 
1066
                    case 8: return TupleType::template get<8>();
1067
                    case 9: return TupleType::template get<9>();
1068
                                        case 10: return TupleType::template get<10>();
1069
                                        case 11: return TupleType::template get<11>();
1070
                                        case 12: return TupleType::template get<12>();
1071
                                        case 13: return TupleType::template get<13>();
1072
                                        case 14: return TupleType::template get<14>();
1073
                                        case 15: return TupleType::template get<15>();
1074
                                        case 16: return TupleType::template get<16>();
1075
                    default: throw RangeException();
1076
                }
1077
            }
1078
        } 
1079
1080
                throw NotFoundException("Name not found: " + name);
1081
    }
1082
1083
    const DynamicAny operator [] (const std::string& name) const
1084
    {
1085
        return get(name);
1086
    }
1087
1088
    template<int N>
1089
    typename TypeGetter<N, Type>::ConstHeadType& get() const 
1090
    {
1091
        return TupleType::template get<N>();
1092
    }
1093
1094
    template<int N>
1095
    typename TypeGetter<N, Type>::HeadType& get()
1096
    {
1097
        return TupleType::template get<N>();
1098
    }
1099
1100
    template<int N>
1101
    void set(typename TypeGetter<N, Type>::ConstHeadType& val)
1102
    {
1103
        return TupleType::template set<N>(val);
1104
    }
1105
1106
    const NameVecPtr& names()
1107
    {
1108
        return _pNames; 
1109
    }
1110
1111
    void setName(std::size_t index, const std::string& name)
1112
        {
1113
                if (index >= _pNames->size())
1114
                        throw InvalidArgumentException(format("Invalid index: %z", index));
1115
1116
                (*_pNames)[index] = name;
1117
        }
1118
1119
        const std::string& getName(std::size_t index)
1120
        {
1121
                if (index >= _pNames->size())
1122
                        throw InvalidArgumentException(format("Invalid index: %z", index));
1123
1124
                return (*_pNames)[index];
1125
        }
1126
1127
    bool operator == (const NamedTuple& other) const
1128
    {
1129
        return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
1130
    }
1131
1132
    bool operator != (const NamedTuple& other) const 
1133
    {
1134
        return !(*this == other);
1135
    }
1136
1137
    bool operator < (const NamedTuple& other) const
1138
    {
1139
        TupleType th(*this);
1140
        TupleType oth(other); 
1141
1142
        return (th < oth && _pNames == other._pNames) || 
1143
            (th == oth && _pNames < other._pNames) ||
1144
            (th < oth && _pNames < other._pNames);
1145
    }
1146
1147
private:
1148
    void init(const std::string& n0 = "A",
1149
        const std::string& n1 = "B",
1150
        const std::string& n2 = "C",
1151
        const std::string& n3 = "D",
1152
        const std::string& n4 = "E",
1153
        const std::string& n5 = "F", 
1154
        const std::string& n6 = "G",
1155
        const std::string& n7 = "H",
1156
        const std::string& n8 = "I",
1157
        const std::string& n9 = "J",
1158
        const std::string& n10 = "K",
1159
        const std::string& n11 = "L",
1160
        const std::string& n12 = "M",
1161
        const std::string& n13 = "N",
1162
        const std::string& n14 = "O",
1163
        const std::string& n15 = "P",
1164
        const std::string& n16 = "Q")
1165
    { 
1166
        if (!_pNames)
1167
        {
1168
            _pNames = new NameVec;
1169
            _pNames->push_back(n0);
1170
            _pNames->push_back(n1);
1171
            _pNames->push_back(n2);
1172
            _pNames->push_back(n3); 
1173
            _pNames->push_back(n4);
1174
            _pNames->push_back(n5);
1175
            _pNames->push_back(n6);
1176
            _pNames->push_back(n7);
1177
            _pNames->push_back(n8);
1178
            _pNames->push_back(n9); 
1179
                        _pNames->push_back(n10); 
1180
                        _pNames->push_back(n11); 
1181
                        _pNames->push_back(n12); 
1182
                        _pNames->push_back(n13); 
1183
                        _pNames->push_back(n14); 
1184
                        _pNames->push_back(n15); 
1185
                        _pNames->push_back(n16); 
1186
        }
1187
    }
1188
1189
    NameVecPtr _pNames;
1190
};
1191
1192
1193
template<class T0, 
1194
    class T1,
1195
    class T2,
1196
    class T3,
1197
    class T4,
1198
    class T5,
1199
    class T6,
1200
    class T7, 
1201
    class T8,
1202
    class T9,
1203
    class T10,
1204
    class T11,
1205
    class T12,
1206
    class T13,
1207
    class T14,
1208
    class T15>
1209
struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,NullTypeList>:
1210
        public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>
1211
{
1212
        typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15> TupleType;
1213
        typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>::Type Type;
1214
1215
    typedef std::vector<std::string> NameVec; 
1216
    typedef SharedPtr<NameVec> NameVecPtr; 
1217
1218
    NamedTuple(): _pNames(0)
1219
    {
1220
        init();
1221
    }
1222
1223
    NamedTuple(const NameVecPtr& rNames) 
1224
    {
1225
        if (rNames->size() != TupleType::length)
1226
            throw InvalidArgumentException("Wrong names vector length."); 
1227
1228
        _pNames = rNames;
1229
    }
1230
1231
    NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
1232
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1), 
1233
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
1234
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
1235
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
1236
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
1237
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
1238
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
1239
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
1240
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9), 
1241
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10), 
1242
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11), 
1243
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12), 
1244
        typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13), 
1245
        typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14), 
1246
        typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15)): 
1247
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15), 
1248
                _pNames(0)
1249
    {
1250
        init();
1251
    }
1252
1253
    NamedTuple(const NameVecPtr& rNames, 
1254
        typename TypeWrapper<T0>::CONSTTYPE& t0,
1255
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
1256
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
1257
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
1258
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
1259
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
1260
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
1261
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
1262
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
1263
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9), 
1264
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10), 
1265
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11), 
1266
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12), 
1267
        typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13), 
1268
        typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14), 
1269
        typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15)): 
1270
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15)
1271
    {
1272
                if (rNames->size() != TupleType::length)
1273
            throw InvalidArgumentException("Wrong names vector length."); 
1274
1275
        _pNames = rNames;
1276
    }
1277
1278
    NamedTuple(const std::string& n0,
1279
        typename TypeWrapper<T0>::CONSTTYPE& t0, 
1280
        const std::string& n1 = "B",
1281
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
1282
        const std::string& n2 = "C",
1283
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
1284
        const std::string& n3 = "D",
1285
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
1286
        const std::string& n4 = "E",
1287
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4), 
1288
        const std::string& n5 = "F",
1289
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
1290
        const std::string& n6 = "G",
1291
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6), 
1292
        const std::string& n7 = "H",
1293
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
1294
        const std::string& n8 = "I",
1295
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
1296
        const std::string& n9 = "J",
1297
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
1298
        const std::string& n10 = "K",
1299
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
1300
        const std::string& n11 = "L",
1301
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
1302
        const std::string& n12 = "M",
1303
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
1304
        const std::string& n13 = "N",
1305
        typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
1306
        const std::string& n14 = "O",
1307
        typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
1308
        const std::string& n15 = "P",
1309
        typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15)): 
1310
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15), 
1311
                _pNames(0) 
1312
    {
1313
        init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15);
1314
    }
1315
1316
    const DynamicAny get(const std::string& name) const
1317
    {
1318
        NameVec::const_iterator it = _pNames->begin(); 
1319
        NameVec::const_iterator itEnd = _pNames->end();
1320
1321
        for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
1322
        {
1323
            if (name == *it)
1324
            {
1325
                switch (counter)
1326
                { 
1327
                    case 0: return TupleType::template get<0>();
1328
                    case 1: return TupleType::template get<1>();
1329
                    case 2: return TupleType::template get<2>();
1330
                    case 3: return TupleType::template get<3>(); 
1331
                    case 4: return TupleType::template get<4>();
1332
                    case 5: return TupleType::template get<5>();
1333
                    case 6: return TupleType::template get<6>();
1334
                    case 7: return TupleType::template get<7>(); 
1335
                    case 8: return TupleType::template get<8>();
1336
                    case 9: return TupleType::template get<9>();
1337
                                        case 10: return TupleType::template get<10>();
1338
                                        case 11: return TupleType::template get<11>();
1339
                                        case 12: return TupleType::template get<12>();
1340
                                        case 13: return TupleType::template get<13>();
1341
                                        case 14: return TupleType::template get<14>();
1342
                                        case 15: return TupleType::template get<15>();
1343
                    default: throw RangeException();
1344
                }
1345
            }
1346
        } 
1347
1348
                throw NotFoundException("Name not found: " + name);
1349
    }
1350
1351
    const DynamicAny operator [] (const std::string& name) const
1352
    {
1353
        return get(name);
1354
    }
1355
1356
    template<int N>
1357
    typename TypeGetter<N, Type>::ConstHeadType& get() const 
1358
    {
1359
        return TupleType::template get<N>();
1360
    }
1361
1362
    template<int N>
1363
    typename TypeGetter<N, Type>::HeadType& get()
1364
    {
1365
        return TupleType::template get<N>();
1366
    }
1367
1368
    template<int N>
1369
    void set(typename TypeGetter<N, Type>::ConstHeadType& val)
1370
    {
1371
        return TupleType::template set<N>(val);
1372
    }
1373
1374
    const NameVecPtr& names()
1375
    {
1376
        return _pNames; 
1377
    }
1378
1379
    void setName(std::size_t index, const std::string& name)
1380
        {
1381
                if (index >= _pNames->size())
1382
                        throw InvalidArgumentException(format("Invalid index: %z", index));
1383
1384
                (*_pNames)[index] = name;
1385
        }
1386
1387
        const std::string& getName(std::size_t index)
1388
        {
1389
                if (index >= _pNames->size())
1390
                        throw InvalidArgumentException(format("Invalid index: %z", index));
1391
1392
                return (*_pNames)[index];
1393
        }
1394
1395
    bool operator == (const NamedTuple& other) const
1396
    {
1397
        return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
1398
    }
1399
1400
    bool operator != (const NamedTuple& other) const 
1401
    {
1402
        return !(*this == other);
1403
    }
1404
1405
    bool operator < (const NamedTuple& other) const
1406
    {
1407
        TupleType th(*this);
1408
        TupleType oth(other); 
1409
1410
        return (th < oth && _pNames == other._pNames) || 
1411
            (th == oth && _pNames < other._pNames) ||
1412
            (th < oth && _pNames < other._pNames);
1413
    }
1414
1415
private:
1416
    void init(const std::string& n0 = "A",
1417
        const std::string& n1 = "B",
1418
        const std::string& n2 = "C",
1419
        const std::string& n3 = "D",
1420
        const std::string& n4 = "E",
1421
        const std::string& n5 = "F", 
1422
        const std::string& n6 = "G",
1423
        const std::string& n7 = "H",
1424
        const std::string& n8 = "I",
1425
        const std::string& n9 = "J",
1426
        const std::string& n10 = "K",
1427
        const std::string& n11 = "L",
1428
        const std::string& n12 = "M",
1429
        const std::string& n13 = "N",
1430
        const std::string& n14 = "O",
1431
        const std::string& n15 = "P")
1432
    { 
1433
        if (!_pNames)
1434
        {
1435
            _pNames = new NameVec;
1436
            _pNames->push_back(n0);
1437
            _pNames->push_back(n1);
1438
            _pNames->push_back(n2);
1439
            _pNames->push_back(n3); 
1440
            _pNames->push_back(n4);
1441
            _pNames->push_back(n5);
1442
            _pNames->push_back(n6);
1443
            _pNames->push_back(n7);
1444
            _pNames->push_back(n8);
1445
            _pNames->push_back(n9); 
1446
                        _pNames->push_back(n10); 
1447
                        _pNames->push_back(n11); 
1448
                        _pNames->push_back(n12); 
1449
                        _pNames->push_back(n13); 
1450
                        _pNames->push_back(n14); 
1451
                        _pNames->push_back(n15); 
1452
        }
1453
    }
1454
1455
    NameVecPtr _pNames;
1456
};
1457
1458
1459
template<class T0, 
1460
    class T1,
1461
    class T2,
1462
    class T3,
1463
    class T4,
1464
    class T5,
1465
    class T6,
1466
    class T7, 
1467
    class T8,
1468
    class T9,
1469
    class T10,
1470
    class T11,
1471
    class T12,
1472
    class T13,
1473
    class T14>
1474
struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,NullTypeList>:
1475
        public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>
1476
{
1477
        typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14> TupleType;
1478
        typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>::Type Type;
1479
1480
    typedef std::vector<std::string> NameVec; 
1481
    typedef SharedPtr<NameVec> NameVecPtr; 
1482
1483
    NamedTuple(): _pNames(0)
1484
    {
1485
        init();
1486
    }
1487
1488
    NamedTuple(const NameVecPtr& rNames) 
1489
    {
1490
        if (rNames->size() != TupleType::length)
1491
            throw InvalidArgumentException("Wrong names vector length."); 
1492
1493
        _pNames = rNames;
1494
    }
1495
1496
    NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
1497
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1), 
1498
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
1499
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
1500
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
1501
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
1502
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
1503
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
1504
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
1505
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9), 
1506
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10), 
1507
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11), 
1508
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12), 
1509
        typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13), 
1510
        typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14)): 
1511
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14), 
1512
                _pNames(0)
1513
    {
1514
        init();
1515
    }
1516
1517
    NamedTuple(const NameVecPtr& rNames, 
1518
        typename TypeWrapper<T0>::CONSTTYPE& t0,
1519
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
1520
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
1521
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
1522
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
1523
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
1524
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
1525
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
1526
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
1527
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9), 
1528
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10), 
1529
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11), 
1530
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12), 
1531
        typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13), 
1532
        typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14)): 
1533
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14)
1534
    {
1535
                if (rNames->size() != TupleType::length)
1536
            throw InvalidArgumentException("Wrong names vector length."); 
1537
1538
        _pNames = rNames;
1539
    }
1540
1541
    NamedTuple(const std::string& n0,
1542
        typename TypeWrapper<T0>::CONSTTYPE& t0, 
1543
        const std::string& n1 = "B",
1544
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
1545
        const std::string& n2 = "C",
1546
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
1547
        const std::string& n3 = "D",
1548
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
1549
        const std::string& n4 = "E",
1550
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4), 
1551
        const std::string& n5 = "F",
1552
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
1553
        const std::string& n6 = "G",
1554
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6), 
1555
        const std::string& n7 = "H",
1556
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
1557
        const std::string& n8 = "I",
1558
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
1559
        const std::string& n9 = "J",
1560
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
1561
        const std::string& n10 = "K",
1562
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
1563
        const std::string& n11 = "L",
1564
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
1565
        const std::string& n12 = "M",
1566
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
1567
        const std::string& n13 = "N",
1568
        typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
1569
        const std::string& n14 = "O",
1570
        typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14)): 
1571
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14), 
1572
                _pNames(0) 
1573
    {
1574
        init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14);
1575
    }
1576
1577
    const DynamicAny get(const std::string& name) const
1578
    {
1579
        NameVec::const_iterator it = _pNames->begin(); 
1580
        NameVec::const_iterator itEnd = _pNames->end();
1581
1582
        for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
1583
        {
1584
            if (name == *it)
1585
            {
1586
                switch (counter)
1587
                { 
1588
                    case 0: return TupleType::template get<0>();
1589
                    case 1: return TupleType::template get<1>();
1590
                    case 2: return TupleType::template get<2>();
1591
                    case 3: return TupleType::template get<3>(); 
1592
                    case 4: return TupleType::template get<4>();
1593
                    case 5: return TupleType::template get<5>();
1594
                    case 6: return TupleType::template get<6>();
1595
                    case 7: return TupleType::template get<7>(); 
1596
                    case 8: return TupleType::template get<8>();
1597
                    case 9: return TupleType::template get<9>();
1598
                                        case 10: return TupleType::template get<10>();
1599
                                        case 11: return TupleType::template get<11>();
1600
                                        case 12: return TupleType::template get<12>();
1601
                                        case 13: return TupleType::template get<13>();
1602
                                        case 14: return TupleType::template get<14>();
1603
                    default: throw RangeException();
1604
                }
1605
            }
1606
        } 
1607
1608
                throw NotFoundException("Name not found: " + name);
1609
    }
1610
1611
    const DynamicAny operator [] (const std::string& name) const
1612
    {
1613
        return get(name);
1614
    }
1615
1616
    template<int N>
1617
    typename TypeGetter<N, Type>::ConstHeadType& get() const 
1618
    {
1619
        return TupleType::template get<N>();
1620
    }
1621
1622
    template<int N>
1623
    typename TypeGetter<N, Type>::HeadType& get()
1624
    {
1625
        return TupleType::template get<N>();
1626
    }
1627
1628
    template<int N>
1629
    void set(typename TypeGetter<N, Type>::ConstHeadType& val)
1630
    {
1631
        return TupleType::template set<N>(val);
1632
    }
1633
1634
    const NameVecPtr& names()
1635
    {
1636
        return _pNames; 
1637
    }
1638
1639
    void setName(std::size_t index, const std::string& name)
1640
        {
1641
                if (index >= _pNames->size())
1642
                        throw InvalidArgumentException(format("Invalid index: %z", index));
1643
1644
                (*_pNames)[index] = name;
1645
        }
1646
1647
        const std::string& getName(std::size_t index)
1648
        {
1649
                if (index >= _pNames->size())
1650
                        throw InvalidArgumentException(format("Invalid index: %z", index));
1651
1652
                return (*_pNames)[index];
1653
        }
1654
1655
    bool operator == (const NamedTuple& other) const
1656
    {
1657
        return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
1658
    }
1659
1660
    bool operator != (const NamedTuple& other) const 
1661
    {
1662
        return !(*this == other);
1663
    }
1664
1665
    bool operator < (const NamedTuple& other) const
1666
    {
1667
        TupleType th(*this);
1668
        TupleType oth(other); 
1669
1670
        return (th < oth && _pNames == other._pNames) || 
1671
            (th == oth && _pNames < other._pNames) ||
1672
            (th < oth && _pNames < other._pNames);
1673
    }
1674
1675
private:
1676
    void init(const std::string& n0 = "A",
1677
        const std::string& n1 = "B",
1678
        const std::string& n2 = "C",
1679
        const std::string& n3 = "D",
1680
        const std::string& n4 = "E",
1681
        const std::string& n5 = "F", 
1682
        const std::string& n6 = "G",
1683
        const std::string& n7 = "H",
1684
        const std::string& n8 = "I",
1685
        const std::string& n9 = "J",
1686
        const std::string& n10 = "K",
1687
        const std::string& n11 = "L",
1688
        const std::string& n12 = "M",
1689
        const std::string& n13 = "N",
1690
        const std::string& n14 = "O")
1691
    { 
1692
        if (!_pNames)
1693
        {
1694
            _pNames = new NameVec;
1695
            _pNames->push_back(n0);
1696
            _pNames->push_back(n1);
1697
            _pNames->push_back(n2);
1698
            _pNames->push_back(n3); 
1699
            _pNames->push_back(n4);
1700
            _pNames->push_back(n5);
1701
            _pNames->push_back(n6);
1702
            _pNames->push_back(n7);
1703
            _pNames->push_back(n8);
1704
            _pNames->push_back(n9); 
1705
                        _pNames->push_back(n10); 
1706
                        _pNames->push_back(n11); 
1707
                        _pNames->push_back(n12); 
1708
                        _pNames->push_back(n13); 
1709
                        _pNames->push_back(n14); 
1710
        }
1711
    }
1712
1713
    NameVecPtr _pNames;
1714
};
1715
1716
1717
template<class T0, 
1718
    class T1,
1719
    class T2,
1720
    class T3,
1721
    class T4,
1722
    class T5,
1723
    class T6,
1724
    class T7, 
1725
    class T8,
1726
    class T9,
1727
    class T10,
1728
    class T11,
1729
    class T12,
1730
    class T13>
1731
struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,NullTypeList>:
1732
        public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>
1733
{
1734
        typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13> TupleType;
1735
        typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>::Type Type;
1736
1737
    typedef std::vector<std::string> NameVec; 
1738
    typedef SharedPtr<NameVec> NameVecPtr; 
1739
1740
    NamedTuple(): _pNames(0)
1741
    {
1742
        init();
1743
    }
1744
1745
    NamedTuple(const NameVecPtr& rNames) 
1746
    {
1747
        if (rNames->size() != TupleType::length)
1748
            throw InvalidArgumentException("Wrong names vector length."); 
1749
1750
        _pNames = rNames;
1751
    }
1752
1753
    NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
1754
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1), 
1755
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
1756
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
1757
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
1758
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
1759
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
1760
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
1761
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
1762
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9), 
1763
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10), 
1764
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11), 
1765
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12), 
1766
        typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13)): 
1767
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13), 
1768
                _pNames(0)
1769
    {
1770
        init();
1771
    }
1772
1773
    NamedTuple(const NameVecPtr& rNames, 
1774
        typename TypeWrapper<T0>::CONSTTYPE& t0,
1775
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
1776
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
1777
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
1778
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
1779
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
1780
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
1781
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
1782
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
1783
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9), 
1784
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10), 
1785
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11), 
1786
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12), 
1787
        typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13)): 
1788
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13)
1789
    {
1790
                if (rNames->size() != TupleType::length)
1791
            throw InvalidArgumentException("Wrong names vector length."); 
1792
1793
        _pNames = rNames;
1794
    }
1795
1796
    NamedTuple(const std::string& n0,
1797
        typename TypeWrapper<T0>::CONSTTYPE& t0, 
1798
        const std::string& n1 = "B",
1799
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
1800
        const std::string& n2 = "C",
1801
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
1802
        const std::string& n3 = "D",
1803
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
1804
        const std::string& n4 = "E",
1805
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4), 
1806
        const std::string& n5 = "F",
1807
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
1808
        const std::string& n6 = "G",
1809
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6), 
1810
        const std::string& n7 = "H",
1811
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
1812
        const std::string& n8 = "I",
1813
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
1814
        const std::string& n9 = "J",
1815
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
1816
        const std::string& n10 = "K",
1817
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
1818
        const std::string& n11 = "L",
1819
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
1820
        const std::string& n12 = "M",
1821
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
1822
        const std::string& n13 = "N",
1823
        typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13)): 
1824
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13), 
1825
                _pNames(0) 
1826
    {
1827
        init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13);
1828
    }
1829
1830
    const DynamicAny get(const std::string& name) const
1831
    {
1832
        NameVec::const_iterator it = _pNames->begin(); 
1833
        NameVec::const_iterator itEnd = _pNames->end();
1834
1835
        for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
1836
        {
1837
            if (name == *it)
1838
            {
1839
                switch (counter)
1840
                { 
1841
                    case 0: return TupleType::template get<0>();
1842
                    case 1: return TupleType::template get<1>();
1843
                    case 2: return TupleType::template get<2>();
1844
                    case 3: return TupleType::template get<3>(); 
1845
                    case 4: return TupleType::template get<4>();
1846
                    case 5: return TupleType::template get<5>();
1847
                    case 6: return TupleType::template get<6>();
1848
                    case 7: return TupleType::template get<7>(); 
1849
                    case 8: return TupleType::template get<8>();
1850
                    case 9: return TupleType::template get<9>();
1851
                                        case 10: return TupleType::template get<10>();
1852
                                        case 11: return TupleType::template get<11>();
1853
                                        case 12: return TupleType::template get<12>();
1854
                                        case 13: return TupleType::template get<13>();
1855
                    default: throw RangeException();
1856
                }
1857
            }
1858
        } 
1859
1860
                throw NotFoundException("Name not found: " + name);
1861
    }
1862
1863
    const DynamicAny operator [] (const std::string& name) const
1864
    {
1865
        return get(name);
1866
    }
1867
1868
    template<int N>
1869
    typename TypeGetter<N, Type>::ConstHeadType& get() const 
1870
    {
1871
        return TupleType::template get<N>();
1872
    }
1873
1874
    template<int N>
1875
    typename TypeGetter<N, Type>::HeadType& get()
1876
    {
1877
        return TupleType::template get<N>();
1878
    }
1879
1880
    template<int N>
1881
    void set(typename TypeGetter<N, Type>::ConstHeadType& val)
1882
    {
1883
        return TupleType::template set<N>(val);
1884
    }
1885
1886
    const NameVecPtr& names()
1887
    {
1888
        return _pNames; 
1889
    }
1890
1891
    void setName(std::size_t index, const std::string& name)
1892
        {
1893
                if (index >= _pNames->size())
1894
                        throw InvalidArgumentException(format("Invalid index: %z", index));
1895
1896
                (*_pNames)[index] = name;
1897
        }
1898
1899
        const std::string& getName(std::size_t index)
1900
        {
1901
                if (index >= _pNames->size())
1902
                        throw InvalidArgumentException(format("Invalid index: %z", index));
1903
1904
                return (*_pNames)[index];
1905
        }
1906
1907
    bool operator == (const NamedTuple& other) const
1908
    {
1909
        return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
1910
    }
1911
1912
    bool operator != (const NamedTuple& other) const 
1913
    {
1914
        return !(*this == other);
1915
    }
1916
1917
    bool operator < (const NamedTuple& other) const
1918
    {
1919
        TupleType th(*this);
1920
        TupleType oth(other); 
1921
1922
        return (th < oth && _pNames == other._pNames) || 
1923
            (th == oth && _pNames < other._pNames) ||
1924
            (th < oth && _pNames < other._pNames);
1925
    }
1926
1927
private:
1928
    void init(const std::string& n0 = "A",
1929
        const std::string& n1 = "B",
1930
        const std::string& n2 = "C",
1931
        const std::string& n3 = "D",
1932
        const std::string& n4 = "E",
1933
        const std::string& n5 = "F", 
1934
        const std::string& n6 = "G",
1935
        const std::string& n7 = "H",
1936
        const std::string& n8 = "I",
1937
        const std::string& n9 = "J",
1938
        const std::string& n10 = "K",
1939
        const std::string& n11 = "L",
1940
        const std::string& n12 = "M",
1941
        const std::string& n13 = "N")
1942
    { 
1943
        if (!_pNames)
1944
        {
1945
            _pNames = new NameVec;
1946
            _pNames->push_back(n0);
1947
            _pNames->push_back(n1);
1948
            _pNames->push_back(n2);
1949
            _pNames->push_back(n3); 
1950
            _pNames->push_back(n4);
1951
            _pNames->push_back(n5);
1952
            _pNames->push_back(n6);
1953
            _pNames->push_back(n7);
1954
            _pNames->push_back(n8);
1955
            _pNames->push_back(n9); 
1956
                        _pNames->push_back(n10); 
1957
                        _pNames->push_back(n11); 
1958
                        _pNames->push_back(n12); 
1959
                        _pNames->push_back(n13); 
1960
        }
1961
    }
1962
1963
    NameVecPtr _pNames;
1964
};
1965
1966
1967
template<class T0, 
1968
    class T1,
1969
    class T2,
1970
    class T3,
1971
    class T4,
1972
    class T5,
1973
    class T6,
1974
    class T7, 
1975
    class T8,
1976
    class T9,
1977
    class T10,
1978
    class T11,
1979
    class T12>
1980
struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,NullTypeList>:
1981
        public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>
1982
{
1983
        typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12> TupleType;
1984
        typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>::Type Type;
1985
1986
    typedef std::vector<std::string> NameVec; 
1987
    typedef SharedPtr<NameVec> NameVecPtr; 
1988
1989
    NamedTuple(): _pNames(0)
1990
    {
1991
        init();
1992
    }
1993
1994
    NamedTuple(const NameVecPtr& rNames) 
1995
    {
1996
        if (rNames->size() != TupleType::length)
1997
            throw InvalidArgumentException("Wrong names vector length."); 
1998
1999
        _pNames = rNames;
2000
    }
2001
2002
    NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
2003
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1), 
2004
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
2005
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
2006
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
2007
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
2008
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
2009
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
2010
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
2011
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9), 
2012
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10), 
2013
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11), 
2014
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12)): 
2015
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12), 
2016
                _pNames(0)
2017
    {
2018
        init();
2019
    }
2020
2021
    NamedTuple(const NameVecPtr& rNames, 
2022
        typename TypeWrapper<T0>::CONSTTYPE& t0,
2023
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
2024
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
2025
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
2026
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
2027
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
2028
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
2029
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
2030
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
2031
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9), 
2032
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10), 
2033
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11), 
2034
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12)): 
2035
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12)
2036
    {
2037
                if (rNames->size() != TupleType::length)
2038
            throw InvalidArgumentException("Wrong names vector length."); 
2039
2040
        _pNames = rNames;
2041
    }
2042
2043
    NamedTuple(const std::string& n0,
2044
        typename TypeWrapper<T0>::CONSTTYPE& t0, 
2045
        const std::string& n1 = "B",
2046
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
2047
        const std::string& n2 = "C",
2048
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
2049
        const std::string& n3 = "D",
2050
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
2051
        const std::string& n4 = "E",
2052
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4), 
2053
        const std::string& n5 = "F",
2054
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
2055
        const std::string& n6 = "G",
2056
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6), 
2057
        const std::string& n7 = "H",
2058
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
2059
        const std::string& n8 = "I",
2060
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
2061
        const std::string& n9 = "J",
2062
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
2063
        const std::string& n10 = "K",
2064
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
2065
        const std::string& n11 = "L",
2066
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
2067
        const std::string& n12 = "M",
2068
        typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12)): 
2069
    TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12), _pNames(0) 
2070
    {
2071
        init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12);
2072
    }
2073
2074
    const DynamicAny get(const std::string& name) const
2075
    {
2076
        NameVec::const_iterator it = _pNames->begin(); 
2077
        NameVec::const_iterator itEnd = _pNames->end();
2078
2079
        for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
2080
        {
2081
            if (name == *it)
2082
            {
2083
                switch (counter)
2084
                { 
2085
                    case 0: return TupleType::template get<0>();
2086
                    case 1: return TupleType::template get<1>();
2087
                    case 2: return TupleType::template get<2>();
2088
                    case 3: return TupleType::template get<3>(); 
2089
                    case 4: return TupleType::template get<4>();
2090
                    case 5: return TupleType::template get<5>();
2091
                    case 6: return TupleType::template get<6>();
2092
                    case 7: return TupleType::template get<7>(); 
2093
                    case 8: return TupleType::template get<8>();
2094
                    case 9: return TupleType::template get<9>();
2095
                                        case 10: return TupleType::template get<10>();
2096
                                        case 11: return TupleType::template get<11>();
2097
                                        case 12: return TupleType::template get<12>();
2098
                    default: throw RangeException();
2099
                }
2100
            }
2101
        } 
2102
2103
                throw NotFoundException("Name not found: " + name);
2104
    }
2105
2106
    const DynamicAny operator [] (const std::string& name) const
2107
    {
2108
        return get(name);
2109
    }
2110
2111
    template<int N>
2112
    typename TypeGetter<N, Type>::ConstHeadType& get() const 
2113
    {
2114
        return TupleType::template get<N>();
2115
    }
2116
2117
    template<int N>
2118
    typename TypeGetter<N, Type>::HeadType& get()
2119
    {
2120
        return TupleType::template get<N>();
2121
    }
2122
2123
    template<int N>
2124
    void set(typename TypeGetter<N, Type>::ConstHeadType& val)
2125
    {
2126
        return TupleType::template set<N>(val);
2127
    }
2128
2129
    const NameVecPtr& names()
2130
    {
2131
        return _pNames; 
2132
    }
2133
2134
    void setName(std::size_t index, const std::string& name)
2135
        {
2136
                if (index >= _pNames->size())
2137
                        throw InvalidArgumentException(format("Invalid index: %z", index));
2138
2139
                (*_pNames)[index] = name;
2140
        }
2141
2142
        const std::string& getName(std::size_t index)
2143
        {
2144
                if (index >= _pNames->size())
2145
                        throw InvalidArgumentException(format("Invalid index: %z", index));
2146
2147
                return (*_pNames)[index];
2148
        }
2149
2150
    bool operator == (const NamedTuple& other) const
2151
    {
2152
        return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
2153
    }
2154
2155
    bool operator != (const NamedTuple& other) const 
2156
    {
2157
        return !(*this == other);
2158
    }
2159
2160
    bool operator < (const NamedTuple& other) const
2161
    {
2162
        TupleType th(*this);
2163
        TupleType oth(other); 
2164
2165
        return (th < oth && _pNames == other._pNames) || 
2166
            (th == oth && _pNames < other._pNames) ||
2167
            (th < oth && _pNames < other._pNames);
2168
    }
2169
2170
private:
2171
    void init(const std::string& n0 = "A",
2172
        const std::string& n1 = "B",
2173
        const std::string& n2 = "C",
2174
        const std::string& n3 = "D",
2175
        const std::string& n4 = "E",
2176
        const std::string& n5 = "F", 
2177
        const std::string& n6 = "G",
2178
        const std::string& n7 = "H",
2179
        const std::string& n8 = "I",
2180
        const std::string& n9 = "J",
2181
        const std::string& n10 = "K",
2182
        const std::string& n11 = "L",
2183
        const std::string& n12 = "M")
2184
    { 
2185
        if (!_pNames)
2186
        {
2187
            _pNames = new NameVec;
2188
            _pNames->push_back(n0);
2189
            _pNames->push_back(n1);
2190
            _pNames->push_back(n2);
2191
            _pNames->push_back(n3); 
2192
            _pNames->push_back(n4);
2193
            _pNames->push_back(n5);
2194
            _pNames->push_back(n6);
2195
            _pNames->push_back(n7);
2196
            _pNames->push_back(n8);
2197
            _pNames->push_back(n9); 
2198
                        _pNames->push_back(n10); 
2199
                        _pNames->push_back(n11); 
2200
                        _pNames->push_back(n12); 
2201
        }
2202
    }
2203
2204
    NameVecPtr _pNames;
2205
};
2206
2207
2208
template<class T0, 
2209
    class T1,
2210
    class T2,
2211
    class T3,
2212
    class T4,
2213
    class T5,
2214
    class T6,
2215
    class T7, 
2216
    class T8,
2217
    class T9,
2218
    class T10,
2219
    class T11>
2220
struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,NullTypeList>:
2221
        public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>
2222
{
2223
        typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11> TupleType;
2224
        typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>::Type Type;
2225
2226
    typedef std::vector<std::string> NameVec; 
2227
    typedef SharedPtr<NameVec> NameVecPtr; 
2228
2229
    NamedTuple(): _pNames(0)
2230
    {
2231
        init();
2232
    }
2233
2234
    NamedTuple(const NameVecPtr& rNames) 
2235
    {
2236
        if (rNames->size() != TupleType::length)
2237
            throw InvalidArgumentException("Wrong names vector length."); 
2238
2239
        _pNames = rNames;
2240
    }
2241
2242
    NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
2243
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1), 
2244
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
2245
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
2246
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
2247
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
2248
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
2249
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
2250
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
2251
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9), 
2252
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10), 
2253
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11)): 
2254
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11), 
2255
                _pNames(0)
2256
    {
2257
        init();
2258
    }
2259
2260
    NamedTuple(const NameVecPtr& rNames, 
2261
        typename TypeWrapper<T0>::CONSTTYPE& t0,
2262
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
2263
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
2264
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
2265
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
2266
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
2267
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
2268
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
2269
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
2270
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9), 
2271
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10), 
2272
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11)): 
2273
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11)
2274
    {
2275
                if (rNames->size() != TupleType::length)
2276
            throw InvalidArgumentException("Wrong names vector length."); 
2277
2278
        _pNames = rNames;
2279
    }
2280
2281
    NamedTuple(const std::string& n0,
2282
        typename TypeWrapper<T0>::CONSTTYPE& t0, 
2283
        const std::string& n1 = "B",
2284
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
2285
        const std::string& n2 = "C",
2286
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
2287
        const std::string& n3 = "D",
2288
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
2289
        const std::string& n4 = "E",
2290
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4), 
2291
        const std::string& n5 = "F",
2292
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
2293
        const std::string& n6 = "G",
2294
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6), 
2295
        const std::string& n7 = "H",
2296
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
2297
        const std::string& n8 = "I",
2298
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
2299
        const std::string& n9 = "J",
2300
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
2301
        const std::string& n10 = "K",
2302
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
2303
        const std::string& n11 = "L",
2304
        typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11)): 
2305
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11), 
2306
                _pNames(0) 
2307
    {
2308
        init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11);
2309
    }
2310
2311
    const DynamicAny get(const std::string& name) const
2312
    {
2313
        NameVec::const_iterator it = _pNames->begin(); 
2314
        NameVec::const_iterator itEnd = _pNames->end();
2315
2316
        for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
2317
        {
2318
            if (name == *it)
2319
            {
2320
                switch (counter)
2321
                { 
2322
                    case 0: return TupleType::template get<0>();
2323
                    case 1: return TupleType::template get<1>();
2324
                    case 2: return TupleType::template get<2>();
2325
                    case 3: return TupleType::template get<3>(); 
2326
                    case 4: return TupleType::template get<4>();
2327
                    case 5: return TupleType::template get<5>();
2328
                    case 6: return TupleType::template get<6>();
2329
                    case 7: return TupleType::template get<7>(); 
2330
                    case 8: return TupleType::template get<8>();
2331
                    case 9: return TupleType::template get<9>();
2332
                                        case 10: return TupleType::template get<10>();
2333
                                        case 11: return TupleType::template get<11>();
2334
                    default: throw RangeException();
2335
                }
2336
            }
2337
        } 
2338
2339
                throw NotFoundException("Name not found: " + name);
2340
    }
2341
2342
    const DynamicAny operator [] (const std::string& name) const
2343
    {
2344
        return get(name);
2345
    }
2346
2347
    template<int N>
2348
    typename TypeGetter<N, Type>::ConstHeadType& get() const 
2349
    {
2350
        return TupleType::template get<N>();
2351
    }
2352
2353
    template<int N>
2354
    typename TypeGetter<N, Type>::HeadType& get()
2355
    {
2356
        return TupleType::template get<N>();
2357
    }
2358
2359
    template<int N>
2360
    void set(typename TypeGetter<N, Type>::ConstHeadType& val)
2361
    {
2362
        return TupleType::template set<N>(val);
2363
    }
2364
2365
    const NameVecPtr& names()
2366
    {
2367
        return _pNames; 
2368
    }
2369
2370
    void setName(std::size_t index, const std::string& name)
2371
        {
2372
                if (index >= _pNames->size())
2373
                        throw InvalidArgumentException(format("Invalid index: %z", index));
2374
2375
                (*_pNames)[index] = name;
2376
        }
2377
2378
        const std::string& getName(std::size_t index)
2379
        {
2380
                if (index >= _pNames->size())
2381
                        throw InvalidArgumentException(format("Invalid index: %z", index));
2382
2383
                return (*_pNames)[index];
2384
        }
2385
2386
    bool operator == (const NamedTuple& other) const
2387
    {
2388
        return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
2389
    }
2390
2391
    bool operator != (const NamedTuple& other) const 
2392
    {
2393
        return !(*this == other);
2394
    }
2395
2396
    bool operator < (const NamedTuple& other) const
2397
    {
2398
        TupleType th(*this);
2399
        TupleType oth(other); 
2400
2401
        return (th < oth && _pNames == other._pNames) || 
2402
            (th == oth && _pNames < other._pNames) ||
2403
            (th < oth && _pNames < other._pNames);
2404
    }
2405
2406
private:
2407
    void init(const std::string& n0 = "A",
2408
        const std::string& n1 = "B",
2409
        const std::string& n2 = "C",
2410
        const std::string& n3 = "D",
2411
        const std::string& n4 = "E",
2412
        const std::string& n5 = "F", 
2413
        const std::string& n6 = "G",
2414
        const std::string& n7 = "H",
2415
        const std::string& n8 = "I",
2416
        const std::string& n9 = "J",
2417
        const std::string& n10 = "K",
2418
        const std::string& n11 = "L")
2419
    { 
2420
        if (!_pNames)
2421
        {
2422
            _pNames = new NameVec;
2423
            _pNames->push_back(n0);
2424
            _pNames->push_back(n1);
2425
            _pNames->push_back(n2);
2426
            _pNames->push_back(n3); 
2427
            _pNames->push_back(n4);
2428
            _pNames->push_back(n5);
2429
            _pNames->push_back(n6);
2430
            _pNames->push_back(n7);
2431
            _pNames->push_back(n8);
2432
            _pNames->push_back(n9); 
2433
                        _pNames->push_back(n10); 
2434
                        _pNames->push_back(n11); 
2435
        }
2436
    }
2437
2438
    NameVecPtr _pNames;
2439
};
2440
2441
2442
template<class T0, 
2443
    class T1,
2444
    class T2,
2445
    class T3,
2446
    class T4,
2447
    class T5,
2448
    class T6,
2449
    class T7, 
2450
    class T8,
2451
    class T9,
2452
    class T10>
2453
struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,NullTypeList>:
2454
        public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>
2455
{
2456
        typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10> TupleType;
2457
        typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>::Type Type;
2458
2459
    typedef std::vector<std::string> NameVec; 
2460
    typedef SharedPtr<NameVec> NameVecPtr; 
2461
2462
    NamedTuple(): _pNames(0)
2463
    {
2464
        init();
2465
    }
2466
2467
    NamedTuple(const NameVecPtr& rNames) 
2468
    {
2469
        if (rNames->size() != TupleType::length)
2470
            throw InvalidArgumentException("Wrong names vector length."); 
2471
2472
        _pNames = rNames;
2473
    }
2474
2475
    NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
2476
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1), 
2477
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
2478
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
2479
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
2480
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
2481
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
2482
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
2483
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
2484
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9), 
2485
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10)): 
2486
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10), 
2487
                _pNames(0)
2488
    {
2489
        init();
2490
    }
2491
2492
    NamedTuple(const NameVecPtr& rNames, 
2493
        typename TypeWrapper<T0>::CONSTTYPE& t0,
2494
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
2495
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
2496
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
2497
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
2498
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
2499
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
2500
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
2501
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
2502
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9), 
2503
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10)): 
2504
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)
2505
    {
2506
                if (rNames->size() != TupleType::length)
2507
            throw InvalidArgumentException("Wrong names vector length."); 
2508
2509
        _pNames = rNames;
2510
    }
2511
2512
    NamedTuple(const std::string& n0,
2513
        typename TypeWrapper<T0>::CONSTTYPE& t0, 
2514
        const std::string& n1 = "B",
2515
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
2516
        const std::string& n2 = "C",
2517
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
2518
        const std::string& n3 = "D",
2519
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
2520
        const std::string& n4 = "E",
2521
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4), 
2522
        const std::string& n5 = "F",
2523
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
2524
        const std::string& n6 = "G",
2525
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6), 
2526
        const std::string& n7 = "H",
2527
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
2528
        const std::string& n8 = "I",
2529
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
2530
        const std::string& n9 = "J",
2531
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
2532
        const std::string& n10 = "K",
2533
        typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10)): 
2534
    TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10), _pNames(0) 
2535
    {
2536
        init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10);
2537
    }
2538
2539
    const DynamicAny get(const std::string& name) const
2540
    {
2541
        NameVec::const_iterator it = _pNames->begin(); 
2542
        NameVec::const_iterator itEnd = _pNames->end();
2543
2544
        for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
2545
        {
2546
            if (name == *it)
2547
            {
2548
                switch (counter)
2549
                { 
2550
                    case 0: return TupleType::template get<0>();
2551
                    case 1: return TupleType::template get<1>();
2552
                    case 2: return TupleType::template get<2>();
2553
                    case 3: return TupleType::template get<3>(); 
2554
                    case 4: return TupleType::template get<4>();
2555
                    case 5: return TupleType::template get<5>();
2556
                    case 6: return TupleType::template get<6>();
2557
                    case 7: return TupleType::template get<7>(); 
2558
                    case 8: return TupleType::template get<8>();
2559
                    case 9: return TupleType::template get<9>();
2560
                                        case 10: return TupleType::template get<10>();
2561
                    default: throw RangeException();
2562
                }
2563
            }
2564
        } 
2565
2566
                throw NotFoundException("Name not found: " + name);
2567
    }
2568
2569
    const DynamicAny operator [] (const std::string& name) const
2570
    {
2571
        return get(name);
2572
    }
2573
2574
    template<int N>
2575
    typename TypeGetter<N, Type>::ConstHeadType& get() const 
2576
    {
2577
        return TupleType::template get<N>();
2578
    }
2579
2580
    template<int N>
2581
    typename TypeGetter<N, Type>::HeadType& get()
2582
    {
2583
        return TupleType::template get<N>();
2584
    }
2585
2586
    template<int N>
2587
    void set(typename TypeGetter<N, Type>::ConstHeadType& val)
2588
    {
2589
        return TupleType::template set<N>(val);
2590
    }
2591
2592
    const NameVecPtr& names()
2593
    {
2594
        return _pNames; 
2595
    }
2596
2597
    void setName(std::size_t index, const std::string& name)
2598
        {
2599
                if (index >= _pNames->size())
2600
                        throw InvalidArgumentException(format("Invalid index: %z", index));
2601
2602
                (*_pNames)[index] = name;
2603
        }
2604
2605
        const std::string& getName(std::size_t index)
2606
        {
2607
                if (index >= _pNames->size())
2608
                        throw InvalidArgumentException(format("Invalid index: %z", index));
2609
2610
                return (*_pNames)[index];
2611
        }
2612
2613
    bool operator == (const NamedTuple& other) const
2614
    {
2615
        return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
2616
    }
2617
2618
    bool operator != (const NamedTuple& other) const 
2619
    {
2620
        return !(*this == other);
2621
    }
2622
2623
    bool operator < (const NamedTuple& other) const
2624
    {
2625
        TupleType th(*this);
2626
        TupleType oth(other); 
2627
2628
        return (th < oth && _pNames == other._pNames) || 
2629
            (th == oth && _pNames < other._pNames) ||
2630
            (th < oth && _pNames < other._pNames);
2631
    }
2632
2633
private:
2634
    void init(const std::string& n0 = "A",
2635
        const std::string& n1 = "B",
2636
        const std::string& n2 = "C",
2637
        const std::string& n3 = "D",
2638
        const std::string& n4 = "E",
2639
        const std::string& n5 = "F", 
2640
        const std::string& n6 = "G",
2641
        const std::string& n7 = "H",
2642
        const std::string& n8 = "I",
2643
        const std::string& n9 = "J",
2644
        const std::string& n10 = "K")
2645
    { 
2646
        if (!_pNames)
2647
        {
2648
            _pNames = new NameVec;
2649
            _pNames->push_back(n0);
2650
            _pNames->push_back(n1);
2651
            _pNames->push_back(n2);
2652
            _pNames->push_back(n3); 
2653
            _pNames->push_back(n4);
2654
            _pNames->push_back(n5);
2655
            _pNames->push_back(n6);
2656
            _pNames->push_back(n7);
2657
            _pNames->push_back(n8);
2658
            _pNames->push_back(n9); 
2659
                        _pNames->push_back(n10); 
2660
        }
2661
    }
2662
2663
    NameVecPtr _pNames;
2664
};
2665
2666
2667
template<class T0, 
2668
    class T1,
2669
    class T2,
2670
    class T3,
2671
    class T4,
2672
    class T5,
2673
    class T6,
2674
    class T7, 
2675
    class T8,
2676
    class T9>
2677
struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,NullTypeList>:
2678
        public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>
2679
{
2680
        typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9> TupleType;
2681
        typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>::Type Type;
2682
2683
    typedef std::vector<std::string> NameVec; 
2684
    typedef SharedPtr<NameVec> NameVecPtr; 
2685
2686
    NamedTuple(): _pNames(0)
2687
    {
2688
        init();
2689
    }
2690
2691
    NamedTuple(const NameVecPtr& rNames) 
2692
    {
2693
        if (rNames->size() != TupleType::length)
2694
            throw InvalidArgumentException("Wrong names vector length."); 
2695
2696
        _pNames = rNames;
2697
    }
2698
2699
    NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
2700
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1), 
2701
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
2702
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
2703
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
2704
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
2705
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
2706
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
2707
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
2708
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9)): 
2709
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9), 
2710
                _pNames(0)
2711
    {
2712
        init();
2713
    }
2714
2715
    NamedTuple(const NameVecPtr& rNames, 
2716
        typename TypeWrapper<T0>::CONSTTYPE& t0,
2717
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
2718
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
2719
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
2720
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
2721
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
2722
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
2723
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
2724
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
2725
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9)): 
2726
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9)
2727
    {
2728
                if (rNames->size() != TupleType::length)
2729
            throw InvalidArgumentException("Wrong names vector length."); 
2730
2731
        _pNames = rNames;
2732
    }
2733
2734
    NamedTuple(const std::string& n0,
2735
        typename TypeWrapper<T0>::CONSTTYPE& t0, 
2736
        const std::string& n1 = "B",
2737
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
2738
        const std::string& n2 = "C",
2739
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
2740
        const std::string& n3 = "D",
2741
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
2742
        const std::string& n4 = "E",
2743
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4), 
2744
        const std::string& n5 = "F",
2745
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
2746
        const std::string& n6 = "G",
2747
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6), 
2748
        const std::string& n7 = "H",
2749
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
2750
        const std::string& n8 = "I",
2751
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8), 
2752
        const std::string& n9 = "J",
2753
        typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9)): 
2754
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9), 
2755
                _pNames(0) 
2756
    {
2757
        init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9);
2758
    }
2759
2760
    const DynamicAny get(const std::string& name) const
2761
    {
2762
        NameVec::const_iterator it = _pNames->begin(); 
2763
        NameVec::const_iterator itEnd = _pNames->end();
2764
2765
        for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
2766
        {
2767
            if (name == *it)
2768
            {
2769
                switch (counter)
2770
                { 
2771
                    case 0: return TupleType::template get<0>();
2772
                    case 1: return TupleType::template get<1>();
2773
                    case 2: return TupleType::template get<2>();
2774
                    case 3: return TupleType::template get<3>(); 
2775
                    case 4: return TupleType::template get<4>();
2776
                    case 5: return TupleType::template get<5>();
2777
                    case 6: return TupleType::template get<6>();
2778
                    case 7: return TupleType::template get<7>(); 
2779
                    case 8: return TupleType::template get<8>();
2780
                    case 9: return TupleType::template get<9>();
2781
                    default: throw RangeException();
2782
                }
2783
            }
2784
        } 
2785
2786
                throw NotFoundException("Name not found: " + name);
2787
    }
2788
2789
    const DynamicAny operator [] (const std::string& name) const
2790
    {
2791
        return get(name);
2792
    }
2793
2794
    template<int N>
2795
    typename TypeGetter<N, Type>::ConstHeadType& get() const 
2796
    {
2797
        return TupleType::template get<N>();
2798
    }
2799
2800
    template<int N>
2801
    typename TypeGetter<N, Type>::HeadType& get()
2802
    {
2803
        return TupleType::template get<N>();
2804
    }
2805
2806
    template<int N>
2807
    void set(typename TypeGetter<N, Type>::ConstHeadType& val)
2808
    {
2809
        return TupleType::template set<N>(val);
2810
    }
2811
2812
    const NameVecPtr& names()
2813
    {
2814
        return _pNames; 
2815
    }
2816
2817
    void setName(std::size_t index, const std::string& name)
2818
        {
2819
                if (index >= _pNames->size())
2820
                        throw InvalidArgumentException(format("Invalid index: %z", index));
2821
2822
                (*_pNames)[index] = name;
2823
        }
2824
2825
        const std::string& getName(std::size_t index)
2826
        {
2827
                if (index >= _pNames->size())
2828
                        throw InvalidArgumentException(format("Invalid index: %z", index));
2829
2830
                return (*_pNames)[index];
2831
        }
2832
2833
    bool operator == (const NamedTuple& other) const
2834
    {
2835
        return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
2836
    }
2837
2838
    bool operator != (const NamedTuple& other) const 
2839
    {
2840
        return !(*this == other);
2841
    }
2842
2843
    bool operator < (const NamedTuple& other) const
2844
    {
2845
        TupleType th(*this);
2846
        TupleType oth(other); 
2847
2848
        return (th < oth && _pNames == other._pNames) || 
2849
            (th == oth && _pNames < other._pNames) ||
2850
            (th < oth && _pNames < other._pNames);
2851
    }
2852
2853
private:
2854
    void init(const std::string& n0 = "A",
2855
        const std::string& n1 = "B",
2856
        const std::string& n2 = "C",
2857
        const std::string& n3 = "D",
2858
        const std::string& n4 = "E",
2859
        const std::string& n5 = "F", 
2860
        const std::string& n6 = "G",
2861
        const std::string& n7 = "H",
2862
        const std::string& n8 = "I",
2863
        const std::string& n9 = "J")
2864
    { 
2865
        if (!_pNames)
2866
        {
2867
            _pNames = new NameVec;
2868
            _pNames->push_back(n0);
2869
            _pNames->push_back(n1);
2870
            _pNames->push_back(n2);
2871
            _pNames->push_back(n3); 
2872
            _pNames->push_back(n4);
2873
            _pNames->push_back(n5);
2874
            _pNames->push_back(n6);
2875
            _pNames->push_back(n7);
2876
            _pNames->push_back(n8);
2877
            _pNames->push_back(n9); 
2878
        }
2879
    }
2880
2881
    NameVecPtr _pNames;
2882
};
2883
2884
2885
template<class T0, 
2886
    class T1,
2887
    class T2,
2888
    class T3,
2889
    class T4,
2890
    class T5,
2891
    class T6,
2892
    class T7, 
2893
    class T8>
2894
struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,NullTypeList>:
2895
        public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8>
2896
{
2897
        typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8> TupleType;
2898
        typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8>::Type Type;
2899
2900
    typedef std::vector<std::string> NameVec; 
2901
    typedef SharedPtr<NameVec> NameVecPtr; 
2902
2903
    NamedTuple(): _pNames(0)
2904
    {
2905
        init();
2906
    }
2907
2908
    NamedTuple(const NameVecPtr& rNames) 
2909
    {
2910
        if (rNames->size() != TupleType::length)
2911
            throw InvalidArgumentException("Wrong names vector length."); 
2912
2913
        _pNames = rNames;
2914
    }
2915
2916
    NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
2917
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1), 
2918
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
2919
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
2920
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
2921
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
2922
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
2923
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
2924
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8)): 
2925
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8), 
2926
                _pNames(0)
2927
    {
2928
        init();
2929
    }
2930
2931
    NamedTuple(const NameVecPtr& rNames, 
2932
        typename TypeWrapper<T0>::CONSTTYPE& t0,
2933
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
2934
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
2935
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
2936
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
2937
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
2938
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
2939
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
2940
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8)): 
2941
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8)
2942
    {
2943
                if (rNames->size() != TupleType::length)
2944
            throw InvalidArgumentException("Wrong names vector length."); 
2945
2946
        _pNames = rNames;
2947
    }
2948
2949
    NamedTuple(const std::string& n0,
2950
        typename TypeWrapper<T0>::CONSTTYPE& t0, 
2951
        const std::string& n1 = "B",
2952
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
2953
        const std::string& n2 = "C",
2954
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
2955
        const std::string& n3 = "D",
2956
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
2957
        const std::string& n4 = "E",
2958
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4), 
2959
        const std::string& n5 = "F",
2960
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
2961
        const std::string& n6 = "G",
2962
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6), 
2963
        const std::string& n7 = "H",
2964
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
2965
        const std::string& n8 = "I",
2966
        typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8)): 
2967
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8), 
2968
                _pNames(0) 
2969
    {
2970
        init(n0,n1,n2,n3,n4,n5,n6,n7,n8);
2971
    }
2972
2973
    const DynamicAny get(const std::string& name) const
2974
    {
2975
        NameVec::const_iterator it = _pNames->begin(); 
2976
        NameVec::const_iterator itEnd = _pNames->end();
2977
2978
        for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
2979
        {
2980
            if (name == *it)
2981
            {
2982
                switch (counter)
2983
                { 
2984
                    case 0: return TupleType::template get<0>();
2985
                    case 1: return TupleType::template get<1>();
2986
                    case 2: return TupleType::template get<2>();
2987
                    case 3: return TupleType::template get<3>(); 
2988
                    case 4: return TupleType::template get<4>();
2989
                    case 5: return TupleType::template get<5>();
2990
                    case 6: return TupleType::template get<6>();
2991
                    case 7: return TupleType::template get<7>(); 
2992
                    case 8: return TupleType::template get<8>();
2993
                    default: throw RangeException();
2994
                }
2995
            }
2996
        } 
2997
2998
                throw NotFoundException("Name not found: " + name);
2999
    }
3000
3001
    const DynamicAny operator [] (const std::string& name) const
3002
    {
3003
        return get(name);
3004
    }
3005
3006
    template<int N>
3007
    typename TypeGetter<N, Type>::ConstHeadType& get() const 
3008
    {
3009
        return TupleType::template get<N>();
3010
    }
3011
3012
    template<int N>
3013
    typename TypeGetter<N, Type>::HeadType& get()
3014
    {
3015
        return TupleType::template get<N>();
3016
    }
3017
3018
    template<int N>
3019
    void set(typename TypeGetter<N, Type>::ConstHeadType& val)
3020
    {
3021
        return TupleType::template set<N>(val);
3022
    }
3023
3024
    const NameVecPtr& names()
3025
    {
3026
        return _pNames; 
3027
    }
3028
3029
    void setName(std::size_t index, const std::string& name)
3030
        {
3031
                if (index >= _pNames->size())
3032
                        throw InvalidArgumentException(format("Invalid index: %z", index));
3033
3034
                (*_pNames)[index] = name;
3035
        }
3036
3037
        const std::string& getName(std::size_t index)
3038
        {
3039
                if (index >= _pNames->size())
3040
                        throw InvalidArgumentException(format("Invalid index: %z", index));
3041
3042
                return (*_pNames)[index];
3043
        }
3044
3045
    bool operator == (const NamedTuple& other) const
3046
    {
3047
        return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
3048
    }
3049
3050
    bool operator != (const NamedTuple& other) const 
3051
    {
3052
        return !(*this == other);
3053
    }
3054
3055
    bool operator < (const NamedTuple& other) const
3056
    {
3057
        TupleType th(*this);
3058
        TupleType oth(other); 
3059
3060
        return (th < oth && _pNames == other._pNames) || 
3061
            (th == oth && _pNames < other._pNames) ||
3062
            (th < oth && _pNames < other._pNames);
3063
    }
3064
3065
private:
3066
    void init(const std::string& n0 = "A",
3067
        const std::string& n1 = "B",
3068
        const std::string& n2 = "C",
3069
        const std::string& n3 = "D",
3070
        const std::string& n4 = "E",
3071
        const std::string& n5 = "F", 
3072
        const std::string& n6 = "G",
3073
        const std::string& n7 = "H",
3074
        const std::string& n8 = "I")
3075
    { 
3076
        if (!_pNames)
3077
        {
3078
            _pNames = new NameVec;
3079
            _pNames->push_back(n0);
3080
            _pNames->push_back(n1);
3081
            _pNames->push_back(n2);
3082
            _pNames->push_back(n3); 
3083
            _pNames->push_back(n4);
3084
            _pNames->push_back(n5);
3085
            _pNames->push_back(n6);
3086
            _pNames->push_back(n7);
3087
            _pNames->push_back(n8);
3088
        }
3089
    }
3090
3091
    NameVecPtr _pNames;
3092
};
3093
3094
3095
template<class T0, 
3096
    class T1,
3097
    class T2,
3098
    class T3,
3099
    class T4,
3100
    class T5,
3101
    class T6,
3102
    class T7>
3103
struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,NullTypeList>:
3104
        public Tuple<T0,T1,T2,T3,T4,T5,T6,T7>
3105
{
3106
        typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7> TupleType;
3107
        typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7>::Type Type;
3108
3109
    typedef std::vector<std::string> NameVec; 
3110
    typedef SharedPtr<NameVec> NameVecPtr; 
3111
3112
    NamedTuple(): _pNames(0)
3113
    {
3114
        init();
3115
    }
3116
3117
    NamedTuple(const NameVecPtr& rNames) 
3118
    {
3119
        if (rNames->size() != TupleType::length)
3120
            throw InvalidArgumentException("Wrong names vector length."); 
3121
3122
        _pNames = rNames;
3123
    }
3124
3125
    NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
3126
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1), 
3127
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
3128
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
3129
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
3130
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
3131
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
3132
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7)): 
3133
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7), 
3134
                _pNames(0)
3135
    {
3136
        init();
3137
    }
3138
3139
    NamedTuple(const NameVecPtr& rNames, 
3140
        typename TypeWrapper<T0>::CONSTTYPE& t0,
3141
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
3142
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
3143
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
3144
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
3145
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
3146
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
3147
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7)): 
3148
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7)
3149
    {
3150
                if (rNames->size() != TupleType::length)
3151
            throw InvalidArgumentException("Wrong names vector length."); 
3152
3153
        _pNames = rNames;
3154
    }
3155
3156
    NamedTuple(const std::string& n0,
3157
        typename TypeWrapper<T0>::CONSTTYPE& t0, 
3158
        const std::string& n1 = "B",
3159
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
3160
        const std::string& n2 = "C",
3161
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
3162
        const std::string& n3 = "D",
3163
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
3164
        const std::string& n4 = "E",
3165
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4), 
3166
        const std::string& n5 = "F",
3167
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
3168
        const std::string& n6 = "G",
3169
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6), 
3170
        const std::string& n7 = "H",
3171
        typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7)): 
3172
                TupleType(t0,t1,t2,t3,t4,t5,t6,t7), 
3173
                _pNames(0) 
3174
    {
3175
        init(n0,n1,n2,n3,n4,n5,n6,n7);
3176
    }
3177
3178
    const DynamicAny get(const std::string& name) const
3179
    {
3180
        NameVec::const_iterator it = _pNames->begin(); 
3181
        NameVec::const_iterator itEnd = _pNames->end();
3182
3183
        for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
3184
        {
3185
            if (name == *it)
3186
            {
3187
                switch (counter)
3188
                { 
3189
                    case 0: return TupleType::template get<0>();
3190
                    case 1: return TupleType::template get<1>();
3191
                    case 2: return TupleType::template get<2>();
3192
                    case 3: return TupleType::template get<3>(); 
3193
                    case 4: return TupleType::template get<4>();
3194
                    case 5: return TupleType::template get<5>();
3195
                    case 6: return TupleType::template get<6>();
3196
                    case 7: return TupleType::template get<7>(); 
3197
                    default: throw RangeException();
3198
                }
3199
            }
3200
        } 
3201
3202
                throw NotFoundException("Name not found: " + name);
3203
    }
3204
3205
    const DynamicAny operator [] (const std::string& name) const
3206
    {
3207
        return get(name);
3208
    }
3209
3210
    template<int N>
3211
    typename TypeGetter<N, Type>::ConstHeadType& get() const 
3212
    {
3213
        return TupleType::template get<N>();
3214
    }
3215
3216
    template<int N>
3217
    typename TypeGetter<N, Type>::HeadType& get()
3218
    {
3219
        return TupleType::template get<N>();
3220
    }
3221
3222
    template<int N>
3223
    void set(typename TypeGetter<N, Type>::ConstHeadType& val)
3224
    {
3225
        return TupleType::template set<N>(val);
3226
    }
3227
3228
    const NameVecPtr& names()
3229
    {
3230
        return _pNames; 
3231
    }
3232
3233
    void setName(std::size_t index, const std::string& name)
3234
        {
3235
                if (index >= _pNames->size())
3236
                        throw InvalidArgumentException(format("Invalid index: %z", index));
3237
3238
                (*_pNames)[index] = name;
3239
        }
3240
3241
        const std::string& getName(std::size_t index)
3242
        {
3243
                if (index >= _pNames->size())
3244
                        throw InvalidArgumentException(format("Invalid index: %z", index));
3245
3246
                return (*_pNames)[index];
3247
        }
3248
3249
    bool operator == (const NamedTuple& other) const
3250
    {
3251
        return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
3252
    }
3253
3254
    bool operator != (const NamedTuple& other) const 
3255
    {
3256
        return !(*this == other);
3257
    }
3258
3259
    bool operator < (const NamedTuple& other) const
3260
    {
3261
        TupleType th(*this);
3262
        TupleType oth(other); 
3263
3264
        return (th < oth && _pNames == other._pNames) || 
3265
            (th == oth && _pNames < other._pNames) ||
3266
            (th < oth && _pNames < other._pNames);
3267
    }
3268
3269
private:
3270
    void init(const std::string& n0 = "A",
3271
        const std::string& n1 = "B",
3272
        const std::string& n2 = "C",
3273
        const std::string& n3 = "D",
3274
        const std::string& n4 = "E",
3275
        const std::string& n5 = "F", 
3276
        const std::string& n6 = "G",
3277
        const std::string& n7 = "H")
3278
    { 
3279
        if (!_pNames)
3280
        {
3281
            _pNames = new NameVec;
3282
            _pNames->push_back(n0);
3283
            _pNames->push_back(n1);
3284
            _pNames->push_back(n2);
3285
            _pNames->push_back(n3); 
3286
            _pNames->push_back(n4);
3287
            _pNames->push_back(n5);
3288
            _pNames->push_back(n6);
3289
            _pNames->push_back(n7);
3290
        }
3291
    }
3292
3293
    NameVecPtr _pNames;
3294
};
3295
3296
3297
template<class T0, 
3298
    class T1,
3299
    class T2,
3300
    class T3,
3301
    class T4,
3302
    class T5,
3303
    class T6>
3304
struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,NullTypeList>:
3305
        public Tuple<T0,T1,T2,T3,T4,T5,T6>
3306
{
3307
        typedef Tuple<T0,T1,T2,T3,T4,T5,T6> TupleType;
3308
        typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6>::Type Type;
3309
3310
    typedef std::vector<std::string> NameVec; 
3311
    typedef SharedPtr<NameVec> NameVecPtr; 
3312
3313
    NamedTuple(): _pNames(0)
3314
    {
3315
        init();
3316
    }
3317
3318
    NamedTuple(const NameVecPtr& rNames) 
3319
    {
3320
        if (rNames->size() != TupleType::length)
3321
            throw InvalidArgumentException("Wrong names vector length."); 
3322
3323
        _pNames = rNames;
3324
    }
3325
3326
    NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
3327
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1), 
3328
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
3329
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
3330
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
3331
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
3332
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6)): 
3333
    TupleType(t0,t1,t2,t3,t4,t5,t6), _pNames(0)
3334
    {
3335
        init();
3336
    }
3337
3338
    NamedTuple(const NameVecPtr& rNames, 
3339
        typename TypeWrapper<T0>::CONSTTYPE& t0,
3340
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
3341
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
3342
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
3343
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
3344
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5), 
3345
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6)): 
3346
    TupleType(t0,t1,t2,t3,t4,t5,t6)
3347
    {
3348
                if (rNames->size() != TupleType::length)
3349
            throw InvalidArgumentException("Wrong names vector length."); 
3350
3351
        _pNames = rNames;
3352
    }
3353
3354
    NamedTuple(const std::string& n0,
3355
        typename TypeWrapper<T0>::CONSTTYPE& t0, 
3356
        const std::string& n1 = "B",
3357
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
3358
        const std::string& n2 = "C",
3359
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
3360
        const std::string& n3 = "D",
3361
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
3362
        const std::string& n4 = "E",
3363
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4), 
3364
        const std::string& n5 = "F",
3365
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
3366
        const std::string& n6 = "G",
3367
        typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6)): 
3368
    TupleType(t0,t1,t2,t3,t4,t5,t6), _pNames(0) 
3369
    {
3370
        init(n0,n1,n2,n3,n4,n5,n6);
3371
    }
3372
3373
    const DynamicAny get(const std::string& name) const
3374
    {
3375
        NameVec::const_iterator it = _pNames->begin(); 
3376
        NameVec::const_iterator itEnd = _pNames->end();
3377
3378
        for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
3379
        {
3380
            if (name == *it)
3381
            {
3382
                switch (counter)
3383
                { 
3384
                    case 0: return TupleType::template get<0>();
3385
                    case 1: return TupleType::template get<1>();
3386
                    case 2: return TupleType::template get<2>();
3387
                    case 3: return TupleType::template get<3>(); 
3388
                    case 4: return TupleType::template get<4>();
3389
                    case 5: return TupleType::template get<5>();
3390
                    case 6: return TupleType::template get<6>();
3391
                    default: throw RangeException();
3392
                }
3393
            }
3394
        } 
3395
3396
                throw NotFoundException("Name not found: " + name);
3397
    }
3398
3399
    const DynamicAny operator [] (const std::string& name) const
3400
    {
3401
        return get(name);
3402
    }
3403
3404
    template<int N>
3405
    typename TypeGetter<N, Type>::ConstHeadType& get() const 
3406
    {
3407
        return TupleType::template get<N>();
3408
    }
3409
3410
    template<int N>
3411
    typename TypeGetter<N, Type>::HeadType& get()
3412
    {
3413
        return TupleType::template get<N>();
3414
    }
3415
3416
    template<int N>
3417
    void set(typename TypeGetter<N, Type>::ConstHeadType& val)
3418
    {
3419
        return TupleType::template set<N>(val);
3420
    }
3421
3422
    const NameVecPtr& names()
3423
    {
3424
        return _pNames; 
3425
    }
3426
3427
    void setName(std::size_t index, const std::string& name)
3428
        {
3429
                if (index >= _pNames->size())
3430
                        throw InvalidArgumentException(format("Invalid index: %z", index));
3431
3432
                (*_pNames)[index] = name;
3433
        }
3434
3435
        const std::string& getName(std::size_t index)
3436
        {
3437
                if (index >= _pNames->size())
3438
                        throw InvalidArgumentException(format("Invalid index: %z", index));
3439
3440
                return (*_pNames)[index];
3441
        }
3442
3443
    bool operator == (const NamedTuple& other) const
3444
    {
3445
        return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
3446
    }
3447
3448
    bool operator != (const NamedTuple& other) const 
3449
    {
3450
        return !(*this == other);
3451
    }
3452
3453
    bool operator < (const NamedTuple& other) const
3454
    {
3455
        TupleType th(*this);
3456
        TupleType oth(other); 
3457
3458
        return (th < oth && _pNames == other._pNames) || 
3459
            (th == oth && _pNames < other._pNames) ||
3460
            (th < oth && _pNames < other._pNames);
3461
    }
3462
3463
private:
3464
    void init(const std::string& n0 = "A",
3465
        const std::string& n1 = "B",
3466
        const std::string& n2 = "C",
3467
        const std::string& n3 = "D",
3468
        const std::string& n4 = "E",
3469
        const std::string& n5 = "F", 
3470
        const std::string& n6 = "G")
3471
    { 
3472
        if (!_pNames)
3473
        {
3474
            _pNames = new NameVec;
3475
            _pNames->push_back(n0);
3476
            _pNames->push_back(n1);
3477
            _pNames->push_back(n2);
3478
            _pNames->push_back(n3); 
3479
            _pNames->push_back(n4);
3480
            _pNames->push_back(n5);
3481
            _pNames->push_back(n6);
3482
        }
3483
    }
3484
3485
    NameVecPtr _pNames;
3486
};
3487
3488
3489
template<class T0, 
3490
    class T1,
3491
    class T2,
3492
    class T3,
3493
    class T4,
3494
    class T5>
3495
struct NamedTuple<T0,T1,T2,T3,T4,T5,NullTypeList>:
3496
        public Tuple<T0,T1,T2,T3,T4,T5>
3497
{
3498
        typedef Tuple<T0,T1,T2,T3,T4,T5> TupleType;
3499
        typedef typename Tuple<T0,T1,T2,T3,T4,T5>::Type Type;
3500
3501
    typedef std::vector<std::string> NameVec; 
3502
    typedef SharedPtr<NameVec> NameVecPtr; 
3503
3504
    NamedTuple(): _pNames(0)
3505
    {
3506
        init();
3507
    }
3508
3509
    NamedTuple(const NameVecPtr& rNames) 
3510
    {
3511
        if (rNames->size() != TupleType::length)
3512
            throw InvalidArgumentException("Wrong names vector length."); 
3513
3514
        _pNames = rNames;
3515
    }
3516
3517
    NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
3518
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1), 
3519
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
3520
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
3521
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
3522
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5)): 
3523
    TupleType(t0,t1,t2,t3,t4,t5), _pNames(0)
3524
    {
3525
        init();
3526
    }
3527
3528
    NamedTuple(const NameVecPtr& rNames, 
3529
        typename TypeWrapper<T0>::CONSTTYPE& t0,
3530
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
3531
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
3532
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
3533
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
3534
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5)): 
3535
    TupleType(t0,t1,t2,t3,t4,t5)
3536
    {
3537
                if (rNames->size() != TupleType::length)
3538
            throw InvalidArgumentException("Wrong names vector length."); 
3539
3540
        _pNames = rNames;
3541
    }
3542
3543
    NamedTuple(const std::string& n0,
3544
        typename TypeWrapper<T0>::CONSTTYPE& t0, 
3545
        const std::string& n1 = "B",
3546
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
3547
        const std::string& n2 = "C",
3548
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
3549
        const std::string& n3 = "D",
3550
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
3551
        const std::string& n4 = "E",
3552
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4), 
3553
        const std::string& n5 = "F",
3554
        typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5)): 
3555
    TupleType(t0,t1,t2,t3,t4,t5), _pNames(0) 
3556
    {
3557
        init(n0,n1,n2,n3,n4,n5);
3558
    }
3559
3560
    const DynamicAny get(const std::string& name) const
3561
    {
3562
        NameVec::const_iterator it = _pNames->begin(); 
3563
        NameVec::const_iterator itEnd = _pNames->end();
3564
3565
        for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
3566
        {
3567
            if (name == *it)
3568
            {
3569
                switch (counter)
3570
                { 
3571
                    case 0: return TupleType::template get<0>();
3572
                    case 1: return TupleType::template get<1>();
3573
                    case 2: return TupleType::template get<2>();
3574
                    case 3: return TupleType::template get<3>(); 
3575
                    case 4: return TupleType::template get<4>();
3576
                    case 5: return TupleType::template get<5>();
3577
                    default: throw RangeException();
3578
                }
3579
            }
3580
        } 
3581
3582
                throw NotFoundException("Name not found: " + name);
3583
    }
3584
3585
    const DynamicAny operator [] (const std::string& name) const
3586
    {
3587
        return get(name);
3588
    }
3589
3590
    template<int N>
3591
    typename TypeGetter<N, Type>::ConstHeadType& get() const 
3592
    {
3593
        return TupleType::template get<N>();
3594
    }
3595
3596
    template<int N>
3597
    typename TypeGetter<N, Type>::HeadType& get()
3598
    {
3599
        return TupleType::template get<N>();
3600
    }
3601
3602
    template<int N>
3603
    void set(typename TypeGetter<N, Type>::ConstHeadType& val)
3604
    {
3605
        return TupleType::template set<N>(val);
3606
    }
3607
3608
    const NameVecPtr& names()
3609
    {
3610
        return _pNames; 
3611
    }
3612
3613
    void setName(std::size_t index, const std::string& name)
3614
        {
3615
                if (index >= _pNames->size())
3616
                        throw InvalidArgumentException(format("Invalid index: %z", index));
3617
3618
                (*_pNames)[index] = name;
3619
        }
3620
3621
        const std::string& getName(std::size_t index)
3622
        {
3623
                if (index >= _pNames->size())
3624
                        throw InvalidArgumentException(format("Invalid index: %z", index));
3625
3626
                return (*_pNames)[index];
3627
        }
3628
3629
    bool operator == (const NamedTuple& other) const
3630
    {
3631
        return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
3632
    }
3633
3634
    bool operator != (const NamedTuple& other) const 
3635
    {
3636
        return !(*this == other);
3637
    }
3638
3639
    bool operator < (const NamedTuple& other) const
3640
    {
3641
        TupleType th(*this);
3642
        TupleType oth(other); 
3643
3644
        return (th < oth && _pNames == other._pNames) || 
3645
            (th == oth && _pNames < other._pNames) ||
3646
            (th < oth && _pNames < other._pNames);
3647
    }
3648
3649
private:
3650
    void init(const std::string& n0 = "A",
3651
        const std::string& n1 = "B",
3652
        const std::string& n2 = "C",
3653
        const std::string& n3 = "D",
3654
        const std::string& n4 = "E",
3655
        const std::string& n5 = "F")
3656
    { 
3657
        if (!_pNames)
3658
        {
3659
            _pNames = new NameVec;
3660
            _pNames->push_back(n0);
3661
            _pNames->push_back(n1);
3662
            _pNames->push_back(n2);
3663
            _pNames->push_back(n3); 
3664
            _pNames->push_back(n4);
3665
            _pNames->push_back(n5);
3666
        }
3667
    }
3668
3669
    NameVecPtr _pNames;
3670
};
3671
3672
3673
template<class T0, 
3674
    class T1,
3675
    class T2,
3676
    class T3,
3677
    class T4>
3678
struct NamedTuple<T0,T1,T2,T3,T4,NullTypeList>:
3679
        public Tuple<T0,T1,T2,T3,T4>
3680
{
3681
        typedef Tuple<T0,T1,T2,T3,T4> TupleType;
3682
        typedef typename Tuple<T0,T1,T2,T3,T4>::Type Type;
3683
3684
    typedef std::vector<std::string> NameVec; 
3685
    typedef SharedPtr<NameVec> NameVecPtr; 
3686
3687
    NamedTuple(): _pNames(0)
3688
    {
3689
        init();
3690
    }
3691
3692
    NamedTuple(const NameVecPtr& rNames) 
3693
    {
3694
        if (rNames->size() != TupleType::length)
3695
            throw InvalidArgumentException("Wrong names vector length."); 
3696
3697
        _pNames = rNames;
3698
    }
3699
3700
    NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
3701
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1), 
3702
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
3703
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
3704
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4)): 
3705
                TupleType(t0,t1,t2,t3,t4), 
3706
                _pNames(0)
3707
    {
3708
        init();
3709
    }
3710
3711
    NamedTuple(const NameVecPtr& rNames, 
3712
        typename TypeWrapper<T0>::CONSTTYPE& t0,
3713
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
3714
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
3715
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
3716
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4)): 
3717
                TupleType(t0,t1,t2,t3,t4)
3718
    {
3719
                if (rNames->size() != TupleType::length)
3720
            throw InvalidArgumentException("Wrong names vector length."); 
3721
3722
        _pNames = rNames;
3723
    }
3724
3725
    NamedTuple(const std::string& n0,
3726
        typename TypeWrapper<T0>::CONSTTYPE& t0, 
3727
        const std::string& n1 = "B",
3728
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
3729
        const std::string& n2 = "C",
3730
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
3731
        const std::string& n3 = "D",
3732
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
3733
        const std::string& n4 = "E",
3734
        typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4)): 
3735
                TupleType(t0,t1,t2,t3,t4), 
3736
                _pNames(0) 
3737
    {
3738
        init(n0,n1,n2,n3,n4);
3739
    }
3740
3741
    const DynamicAny get(const std::string& name) const
3742
    {
3743
        NameVec::const_iterator it = _pNames->begin(); 
3744
        NameVec::const_iterator itEnd = _pNames->end();
3745
3746
        for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
3747
        {
3748
            if (name == *it)
3749
            {
3750
                switch (counter)
3751
                { 
3752
                    case 0: return TupleType::template get<0>();
3753
                    case 1: return TupleType::template get<1>();
3754
                    case 2: return TupleType::template get<2>();
3755
                    case 3: return TupleType::template get<3>(); 
3756
                    case 4: return TupleType::template get<4>();
3757
                    default: throw RangeException();
3758
                }
3759
            }
3760
        } 
3761
3762
                throw NotFoundException("Name not found: " + name);
3763
    }
3764
3765
    const DynamicAny operator [] (const std::string& name) const
3766
    {
3767
        return get(name);
3768
    }
3769
3770
    template<int N>
3771
    typename TypeGetter<N, Type>::ConstHeadType& get() const 
3772
    {
3773
        return TupleType::template get<N>();
3774
    }
3775
3776
    template<int N>
3777
    typename TypeGetter<N, Type>::HeadType& get()
3778
    {
3779
        return TupleType::template get<N>();
3780
    }
3781
3782
    template<int N>
3783
    void set(typename TypeGetter<N, Type>::ConstHeadType& val)
3784
    {
3785
        return TupleType::template set<N>(val);
3786
    }
3787
3788
    const NameVecPtr& names()
3789
    {
3790
        return _pNames; 
3791
    }
3792
3793
    void setName(std::size_t index, const std::string& name)
3794
        {
3795
                if (index >= _pNames->size())
3796
                        throw InvalidArgumentException(format("Invalid index: %z", index));
3797
3798
                (*_pNames)[index] = name;
3799
        }
3800
3801
        const std::string& getName(std::size_t index)
3802
        {
3803
                if (index >= _pNames->size())
3804
                        throw InvalidArgumentException(format("Invalid index: %z", index));
3805
3806
                return (*_pNames)[index];
3807
        }
3808
3809
    bool operator == (const NamedTuple& other) const
3810
    {
3811
        return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
3812
    }
3813
3814
    bool operator != (const NamedTuple& other) const 
3815
    {
3816
        return !(*this == other);
3817
    }
3818
3819
    bool operator < (const NamedTuple& other) const
3820
    {
3821
        TupleType th(*this);
3822
        TupleType oth(other); 
3823
3824
        return (th < oth && _pNames == other._pNames) || 
3825
            (th == oth && _pNames < other._pNames) ||
3826
            (th < oth && _pNames < other._pNames);
3827
    }
3828
3829
private:
3830
    void init(const std::string& n0 = "A",
3831
        const std::string& n1 = "B",
3832
        const std::string& n2 = "C",
3833
        const std::string& n3 = "D",
3834
        const std::string& n4 = "E")
3835
    { 
3836
        if (!_pNames)
3837
        {
3838
            _pNames = new NameVec;
3839
            _pNames->push_back(n0);
3840
            _pNames->push_back(n1);
3841
            _pNames->push_back(n2);
3842
            _pNames->push_back(n3); 
3843
            _pNames->push_back(n4);
3844
        }
3845
    }
3846
3847
    NameVecPtr _pNames;
3848
};
3849
3850
3851
template<class T0, 
3852
    class T1,
3853
    class T2,
3854
    class T3>
3855
struct NamedTuple<T0,T1,T2,T3,NullTypeList>:
3856
        public Tuple<T0,T1,T2,T3>
3857
{
3858
        typedef Tuple<T0,T1,T2,T3> TupleType;
3859
        typedef typename Tuple<T0,T1,T2,T3>::Type Type;
3860
3861
    typedef std::vector<std::string> NameVec; 
3862
    typedef SharedPtr<NameVec> NameVecPtr; 
3863
3864
    NamedTuple(): _pNames(0)
3865
    {
3866
        init();
3867
    }
3868
3869
    NamedTuple(const NameVecPtr& rNames) 
3870
    {
3871
        if (rNames->size() != TupleType::length)
3872
            throw InvalidArgumentException("Wrong names vector length."); 
3873
3874
        _pNames = rNames;
3875
    }
3876
3877
    NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
3878
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1), 
3879
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
3880
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3)): 
3881
                TupleType(t0,t1,t2,t3), 
3882
                _pNames(0)
3883
    {
3884
        init();
3885
    }
3886
3887
    NamedTuple(const NameVecPtr& rNames, 
3888
        typename TypeWrapper<T0>::CONSTTYPE& t0,
3889
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
3890
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
3891
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3)): 
3892
                TupleType(t0,t1,t2,t3)
3893
    {
3894
                if (rNames->size() != TupleType::length)
3895
            throw InvalidArgumentException("Wrong names vector length."); 
3896
3897
        _pNames = rNames;
3898
    }
3899
3900
    NamedTuple(const std::string& n0,
3901
        typename TypeWrapper<T0>::CONSTTYPE& t0, 
3902
        const std::string& n1 = "B",
3903
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
3904
        const std::string& n2 = "C",
3905
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2), 
3906
        const std::string& n3 = "D",
3907
        typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3)): 
3908
    TupleType(t0,t1,t2,t3), _pNames(0) 
3909
    {
3910
        init(n0,n1,n2,n3);
3911
    }
3912
3913
    const DynamicAny get(const std::string& name) const
3914
    {
3915
        NameVec::const_iterator it = _pNames->begin(); 
3916
        NameVec::const_iterator itEnd = _pNames->end();
3917
3918
        for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
3919
        {
3920
            if (name == *it)
3921
            {
3922
                switch (counter)
3923
                { 
3924
                    case 0: return TupleType::template get<0>();
3925
                    case 1: return TupleType::template get<1>();
3926
                    case 2: return TupleType::template get<2>();
3927
                    case 3: return TupleType::template get<3>(); 
3928
                    default: throw RangeException();
3929
                }
3930
            }
3931
        } 
3932
3933
                throw NotFoundException("Name not found: " + name);
3934
    }
3935
3936
    const DynamicAny operator [] (const std::string& name) const
3937
    {
3938
        return get(name);
3939
    }
3940
3941
    template<int N>
3942
    typename TypeGetter<N, Type>::ConstHeadType& get() const 
3943
    {
3944
        return TupleType::template get<N>();
3945
    }
3946
3947
    template<int N>
3948
    typename TypeGetter<N, Type>::HeadType& get()
3949
    {
3950
        return TupleType::template get<N>();
3951
    }
3952
3953
    template<int N>
3954
    void set(typename TypeGetter<N, Type>::ConstHeadType& val)
3955
    {
3956
        return TupleType::template set<N>(val);
3957
    }
3958
3959
    const NameVecPtr& names()
3960
    {
3961
        return _pNames; 
3962
    }
3963
3964
    void setName(std::size_t index, const std::string& name)
3965
        {
3966
                if (index >= _pNames->size())
3967
                        throw InvalidArgumentException(format("Invalid index: %z", index));
3968
3969
                (*_pNames)[index] = name;
3970
        }
3971
3972
        const std::string& getName(std::size_t index)
3973
        {
3974
                if (index >= _pNames->size())
3975
                        throw InvalidArgumentException(format("Invalid index: %z", index));
3976
3977
                return (*_pNames)[index];
3978
        }
3979
3980
    bool operator == (const NamedTuple& other) const
3981
    {
3982
        return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
3983
    }
3984
3985
    bool operator != (const NamedTuple& other) const 
3986
    {
3987
        return !(*this == other);
3988
    }
3989
3990
    bool operator < (const NamedTuple& other) const
3991
    {
3992
        TupleType th(*this);
3993
        TupleType oth(other); 
3994
3995
        return (th < oth && _pNames == other._pNames) || 
3996
            (th == oth && _pNames < other._pNames) ||
3997
            (th < oth && _pNames < other._pNames);
3998
    }
3999
4000
private:
4001
    void init(const std::string& n0 = "A",
4002
        const std::string& n1 = "B",
4003
        const std::string& n2 = "C",
4004
        const std::string& n3 = "D")
4005
    { 
4006
        if (!_pNames)
4007
        {
4008
            _pNames = new NameVec;
4009
            _pNames->push_back(n0);
4010
            _pNames->push_back(n1);
4011
            _pNames->push_back(n2);
4012
            _pNames->push_back(n3); 
4013
        }
4014
    }
4015
4016
    NameVecPtr _pNames;
4017
};
4018
4019
4020
template<class T0, 
4021
    class T1,
4022
    class T2>
4023
struct NamedTuple<T0,T1,T2,NullTypeList>:
4024
        public Tuple<T0,T1,T2>
4025
{
4026
        typedef Tuple<T0,T1,T2> TupleType;
4027
        typedef typename Tuple<T0,T1,T2>::Type Type;
4028
4029
    typedef std::vector<std::string> NameVec; 
4030
    typedef SharedPtr<NameVec> NameVecPtr; 
4031
4032
    NamedTuple(): _pNames(0)
4033
    {
4034
        init();
4035
    }
4036
4037
    NamedTuple(const NameVecPtr& rNames) 
4038
    {
4039
        if (rNames->size() != TupleType::length)
4040
            throw InvalidArgumentException("Wrong names vector length."); 
4041
4042
        _pNames = rNames;
4043
    }
4044
4045
    NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
4046
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1), 
4047
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2)): 
4048
                TupleType(t0,t1,t2), 
4049
                _pNames(0)
4050
    {
4051
        init();
4052
    }
4053
4054
    NamedTuple(const NameVecPtr& rNames, 
4055
        typename TypeWrapper<T0>::CONSTTYPE& t0,
4056
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
4057
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2)): 
4058
                TupleType(t0,t1,t2)
4059
    {
4060
                if (rNames->size() != TupleType::length)
4061
            throw InvalidArgumentException("Wrong names vector length."); 
4062
4063
        _pNames = rNames;
4064
    }
4065
4066
    NamedTuple(const std::string& n0,
4067
        typename TypeWrapper<T0>::CONSTTYPE& t0, 
4068
        const std::string& n1 = "B",
4069
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
4070
        const std::string& n2 = "C",
4071
        typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2)): 
4072
                TupleType(t0,t1,t2), 
4073
                _pNames(0) 
4074
    {
4075
        init(n0,n1,n2);
4076
    }
4077
4078
    const DynamicAny get(const std::string& name) const
4079
    {
4080
        NameVec::const_iterator it = _pNames->begin(); 
4081
        NameVec::const_iterator itEnd = _pNames->end();
4082
4083
        for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
4084
        {
4085
            if (name == *it)
4086
            {
4087
                switch (counter)
4088
                { 
4089
                    case 0: return TupleType::template get<0>();
4090
                    case 1: return TupleType::template get<1>();
4091
                    case 2: return TupleType::template get<2>();
4092
                    default: throw RangeException();
4093
                }
4094
            }
4095
        } 
4096
4097
                throw NotFoundException("Name not found: " + name);
4098
    }
4099
4100
    const DynamicAny operator [] (const std::string& name) const
4101
    {
4102
        return get(name);
4103
    }
4104
4105
    template<int N>
4106
    typename TypeGetter<N, Type>::ConstHeadType& get() const 
4107
    {
4108
        return TupleType::template get<N>();
4109
    }
4110
4111
    template<int N>
4112
    typename TypeGetter<N, Type>::HeadType& get()
4113
    {
4114
        return TupleType::template get<N>();
4115
    }
4116
4117
    template<int N>
4118
    void set(typename TypeGetter<N, Type>::ConstHeadType& val)
4119
    {
4120
        return TupleType::template set<N>(val);
4121
    }
4122
4123
    const NameVecPtr& names()
4124
    {
4125
        return _pNames; 
4126
    }
4127
4128
    void setName(std::size_t index, const std::string& name)
4129
        {
4130
                if (index >= _pNames->size())
4131
                        throw InvalidArgumentException(format("Invalid index: %z", index));
4132
4133
                (*_pNames)[index] = name;
4134
        }
4135
4136
        const std::string& getName(std::size_t index)
4137
        {
4138
                if (index >= _pNames->size())
4139
                        throw InvalidArgumentException(format("Invalid index: %z", index));
4140
4141
                return (*_pNames)[index];
4142
        }
4143
4144
    bool operator == (const NamedTuple& other) const
4145
    {
4146
        return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
4147
    }
4148
4149
    bool operator != (const NamedTuple& other) const 
4150
    {
4151
        return !(*this == other);
4152
    }
4153
4154
    bool operator < (const NamedTuple& other) const
4155
    {
4156
        TupleType th(*this);
4157
        TupleType oth(other); 
4158
4159
        return (th < oth && _pNames == other._pNames) || 
4160
            (th == oth && _pNames < other._pNames) ||
4161
            (th < oth && _pNames < other._pNames);
4162
    }
4163
4164
private:
4165
    void init(const std::string& n0 = "A",
4166
        const std::string& n1 = "B",
4167
        const std::string& n2 = "C")
4168
    { 
4169
        if (!_pNames)
4170
        {
4171
            _pNames = new NameVec;
4172
            _pNames->push_back(n0);
4173
            _pNames->push_back(n1);
4174
            _pNames->push_back(n2);
4175
        }
4176
    }
4177
4178
    NameVecPtr _pNames;
4179
};
4180
4181
4182
template<class T0, 
4183
    class T1>
4184
struct NamedTuple<T0,T1,NullTypeList>:
4185
        public Tuple<T0,T1>
4186
{
4187
        typedef Tuple<T0,T1> TupleType;
4188
        typedef typename Tuple<T0,T1>::Type Type;
4189
4190
    typedef std::vector<std::string> NameVec; 
4191
    typedef SharedPtr<NameVec> NameVecPtr; 
4192
4193
    NamedTuple(): _pNames(0)
4194
    {
4195
        init();
4196
    }
4197
4198
    NamedTuple(const NameVecPtr& rNames) 
4199
    {
4200
        if (rNames->size() != TupleType::length)
4201
            throw InvalidArgumentException("Wrong names vector length."); 
4202
4203
        _pNames = rNames;
4204
    }
4205
4206
    NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
4207
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1)): 
4208
                TupleType(t0,t1), 
4209
                _pNames(0)
4210
    {
4211
        init();
4212
    }
4213
4214
    NamedTuple(const NameVecPtr& rNames, 
4215
        typename TypeWrapper<T0>::CONSTTYPE& t0,
4216
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1)): 
4217
                TupleType(t0,t1)
4218
    {
4219
                if (rNames->size() != TupleType::length)
4220
            throw InvalidArgumentException("Wrong names vector length."); 
4221
4222
        _pNames = rNames;
4223
    }
4224
4225
    NamedTuple(const std::string& n0,
4226
        typename TypeWrapper<T0>::CONSTTYPE& t0, 
4227
        const std::string& n1 = "B",
4228
        typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1)): 
4229
                TupleType(t0,t1), 
4230
                _pNames(0) 
4231
    {
4232
        init(n0,n1);
4233
    }
4234
4235
    const DynamicAny get(const std::string& name) const
4236
    {
4237
        NameVec::const_iterator it = _pNames->begin(); 
4238
        NameVec::const_iterator itEnd = _pNames->end();
4239
4240
        for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
4241
        {
4242
            if (name == *it)
4243
            {
4244
                switch (counter)
4245
                { 
4246
                    case 0: return TupleType::template get<0>();
4247
                    case 1: return TupleType::template get<1>();
4248
                    default: throw RangeException();
4249
                }
4250
            }
4251
        } 
4252
4253
                throw NotFoundException("Name not found: " + name);
4254
    }
4255
4256
    const DynamicAny operator [] (const std::string& name) const
4257
    {
4258
        return get(name);
4259
    }
4260
4261
    template<int N>
4262
    typename TypeGetter<N, Type>::ConstHeadType& get() const 
4263
    {
4264
        return TupleType::template get<N>();
4265
    }
4266
4267
    template<int N>
4268
    typename TypeGetter<N, Type>::HeadType& get()
4269
    {
4270
        return TupleType::template get<N>();
4271
    }
4272
4273
    template<int N>
4274
    void set(typename TypeGetter<N, Type>::ConstHeadType& val)
4275
    {
4276
        return TupleType::template set<N>(val);
4277
    }
4278
4279
    const NameVecPtr& names()
4280
    {
4281
        return _pNames; 
4282
    }
4283
4284
    void setName(std::size_t index, const std::string& name)
4285
        {
4286
                if (index >= _pNames->size())
4287
                        throw InvalidArgumentException(format("Invalid index: %z", index));
4288
4289
                (*_pNames)[index] = name;
4290
        }
4291
4292
        const std::string& getName(std::size_t index)
4293
        {
4294
                if (index >= _pNames->size())
4295
                        throw InvalidArgumentException(format("Invalid index: %z", index));
4296
4297
                return (*_pNames)[index];
4298
        }
4299
4300
    bool operator == (const NamedTuple& other) const
4301
    {
4302
        return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
4303
    }
4304
4305
    bool operator != (const NamedTuple& other) const 
4306
    {
4307
        return !(*this == other);
4308
    }
4309
4310
    bool operator < (const NamedTuple& other) const
4311
    {
4312
        TupleType th(*this);
4313
        TupleType oth(other); 
4314
4315
        return (th < oth && _pNames == other._pNames) || 
4316
            (th == oth && _pNames < other._pNames) ||
4317
            (th < oth && _pNames < other._pNames);
4318
    }
4319
4320
private:
4321
    void init(const std::string& n0 = "A",
4322
        const std::string& n1 = "B")
4323
    { 
4324
        if (!_pNames)
4325
        {
4326
            _pNames = new NameVec;
4327
            _pNames->push_back(n0);
4328
            _pNames->push_back(n1);
4329
        }
4330
    }
4331
4332
    NameVecPtr _pNames;
4333
};
4334
4335
4336
template<class T0>
4337
struct NamedTuple<T0,NullTypeList>:
4338
        public Tuple<T0>
4339
{
4340
        typedef Tuple<T0> TupleType;
4341
        typedef typename Tuple<T0>::Type Type;
4342
4343
    typedef std::vector<std::string> NameVec; 
4344
    typedef SharedPtr<NameVec> NameVecPtr; 
4345
4346
    NamedTuple(): _pNames(0)
4347
    {
4348
        init();
4349
    }
4350
4351
    NamedTuple(const NameVecPtr& rNames) 
4352
    {
4353
        if (rNames->size() != TupleType::length)
4354
            throw InvalidArgumentException("Wrong names vector length."); 
4355
4356
        _pNames = rNames;
4357
    }
4358
4359
    NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0): 
4360
                TupleType(t0), 
4361
                _pNames(0)
4362
    {
4363
        init();
4364
    }
4365
4366
    NamedTuple(const NameVecPtr& rNames, 
4367
        typename TypeWrapper<T0>::CONSTTYPE& t0): 
4368
                TupleType(t0)
4369
    {
4370
                if (rNames->size() != TupleType::length)
4371
            throw InvalidArgumentException("Wrong names vector length."); 
4372
4373
        _pNames = rNames;
4374
    }
4375
4376
    NamedTuple(const std::string& n0, typename TypeWrapper<T0>::CONSTTYPE& t0): 
4377
                TupleType(t0), 
4378
                _pNames(0) 
4379
    {
4380
        init(n0);
4381
    }
4382
4383
    const DynamicAny get(const std::string& name) const
4384
    {
4385
        NameVec::const_iterator it = _pNames->begin(); 
4386
        NameVec::const_iterator itEnd = _pNames->end();
4387
4388
        for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
4389
        {
4390
            if (name == *it)
4391
            {
4392
                switch (counter)
4393
                { 
4394
                    case 0: return TupleType::template get<0>();
4395
                    default: throw RangeException();
4396
                }
4397
            }
4398
        } 
4399
4400
                throw NotFoundException("Name not found: " + name);
4401
    }
4402
4403
    const DynamicAny operator [] (const std::string& name) const
4404
    {
4405
        return get(name);
4406
    }
4407
4408
    template<int N>
4409
    typename TypeGetter<N, Type>::ConstHeadType& get() const 
4410
    {
4411
        return TupleType::template get<N>();
4412
    }
4413
4414
    template<int N>
4415
    typename TypeGetter<N, Type>::HeadType& get()
4416
    {
4417
        return TupleType::template get<N>();
4418
    }
4419
4420
    template<int N>
4421
    void set(typename TypeGetter<N, Type>::ConstHeadType& val)
4422
    {
4423
        return TupleType::template set<N>(val);
4424
    }
4425
4426
    const NameVecPtr& names()
4427
    {
4428
        return _pNames; 
4429
    }
4430
4431
    void setName(std::size_t index, const std::string& name)
4432
        {
4433
                if (index >= _pNames->size())
4434
                        throw InvalidArgumentException(format("Invalid index: %z", index));
4435
4436
                (*_pNames)[index] = name;
4437
        }
4438
4439
        const std::string& getName(std::size_t index)
4440
        {
4441
                if (index >= _pNames->size())
4442
                        throw InvalidArgumentException(format("Invalid index: %z", index));
4443
4444
                return (*_pNames)[index];
4445
        }
4446
4447
    bool operator == (const NamedTuple& other) const
4448
    {
4449
        return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
4450
    }
4451
4452
    bool operator != (const NamedTuple& other) const 
4453
    {
4454
        return !(*this == other);
4455
    }
4456
4457
    bool operator < (const NamedTuple& other) const
4458
    {
4459
        TupleType th(*this);
4460
        TupleType oth(other); 
4461
4462
        return (th < oth && _pNames == other._pNames) || 
4463
            (th == oth && _pNames < other._pNames) ||
4464
            (th < oth && _pNames < other._pNames);
4465
    }
4466
4467
private:
4468
    void init(const std::string& n0 = "A")
4469
    { 
4470
        if (!_pNames)
4471
        {
4472
            _pNames = new NameVec;
4473
            _pNames->push_back(n0);
4474
        }
4475
    }
4476
4477
    NameVecPtr _pNames;
4478
};
4479
4480
4481
} // namespace Poco
4482
4483
4484
#endif // Foundation_Tuple_INCLUDED