summaryrefslogtreecommitdiff
path: root/libcult/cult/cli/options-spec.hxx
blob: aff4541ae5475ea6aec70b33b408732c4f928c32 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
// file      : cult/cli/options-spec.hxx
// author    : Boris Kolpackov <boris@kolpackov.net>
// copyright : Copyright (c) 2005-2010 Boris Kolpackov
// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file

#ifndef CULT_CLI_OPTIONS_SPEC_HXX
#define CULT_CLI_OPTIONS_SPEC_HXX

#include <cult/types.hxx>

#include <cult/cli/options.hxx>

namespace Cult
{
  namespace CLI
  {
    template <Char const* k, typename T>
    class OptionSpec
    {
    public:
      static Char const* const key;
      typedef T Type;

    public:
      ~OptionSpec ()
      {
      }

      OptionSpec ()
          : default_value_ (),
            name_ ("--")
      {
        name_ += k;
      }

      T const&
      default_value () const
      {
        return default_value_;
      }

      Void
      default_value (T const& value)
      {
        default_value_ = value;
      }

      //@@ bad name
      //
      Char const*
      name () const
      {
        return name_.c_str ();
      }

    private:
      T default_value_;
      String name_;
    };

    template <Char const* k, typename T>
    struct OptionSpecType
    {
      typedef OptionSpec<k, T> Type;
    };

    template <>
    struct OptionSpecType<Bits::null, Bits::Null>
    {
      typedef Bits::Null Type;
    };


    template <Char const* k, typename T>
    Char const* const OptionSpec<k, T>::key = k;

    template <typename>
    class OptionsSpec;

    template <Char const* k01, typename T01,
              Char const* k02, typename T02,
              Char const* k03, typename T03,
              Char const* k04, typename T04,
              Char const* k05, typename T05,
              Char const* k06, typename T06,
              Char const* k07, typename T07,
              Char const* k08, typename T08,
              Char const* k09, typename T09,
              Char const* k10, typename T10,
              Char const* k11, typename T11,
              Char const* k12, typename T12,
              Char const* k13, typename T13,
              Char const* k14, typename T14,
              Char const* k15, typename T15,
              Char const* k16, typename T16,
              Char const* k17, typename T17,
              Char const* k18, typename T18,
              Char const* k19, typename T19,
              Char const* k20, typename T20,
              Char const* k21, typename T21,
              Char const* k22, typename T22,
              Char const* k23, typename T23,
              Char const* k24, typename T24,
              Char const* k25, typename T25,
              Char const* k26, typename T26,
              Char const* k27, typename T27,
              Char const* k28, typename T28,
              Char const* k29, typename T29,
              Char const* k30, typename T30,
              Char const* k31, typename T31,
              Char const* k32, typename T32,
              Char const* k33, typename T33,
              Char const* k34, typename T34,
              Char const* k35, typename T35,
              Char const* k36, typename T36,
              Char const* k37, typename T37,
              Char const* k38, typename T38,
              Char const* k39, typename T39,
              Char const* k40, typename T40,
              Char const* k41, typename T41,
              Char const* k42, typename T42,
              Char const* k43, typename T43,
              Char const* k44, typename T44,
              Char const* k45, typename T45,
              Char const* k46, typename T46,
              Char const* k47, typename T47,
              Char const* k48, typename T48,
              Char const* k49, typename T49,
              Char const* k50, typename T50,
              Char const* k51, typename T51,
              Char const* k52, typename T52,
              Char const* k53, typename T53,
              Char const* k54, typename T54,
              Char const* k55, typename T55,
              Char const* k56, typename T56,
              Char const* k57, typename T57,
              Char const* k58, typename T58,
              Char const* k59, typename T59,
              Char const* k60, typename T60,
              Char const* k61, typename T61,
              Char const* k62, typename T62,
              Char const* k63, typename T63,
              Char const* k64, typename T64,
              Char const* k65, typename T65,
              Char const* k66, typename T66,
              Char const* k67, typename T67,
              Char const* k68, typename T68,
              Char const* k69, typename T69,
              Char const* k70, typename T70,
              Char const* k71, typename T71,
              Char const* k72, typename T72,
              Char const* k73, typename T73,
              Char const* k74, typename T74,
              Char const* k75, typename T75,
              Char const* k76, typename T76,
              Char const* k77, typename T77,
              Char const* k78, typename T78,
              Char const* k79, typename T79,
              Char const* k80, typename T80,
              Char const* k81, typename T81,
              Char const* k82, typename T82,
              Char const* k83, typename T83,
              Char const* k84, typename T84,
              Char const* k85, typename T85,
              Char const* k86, typename T86,
              Char const* k87, typename T87,
              Char const* k88, typename T88,
              Char const* k89, typename T89,
              Char const* k90, typename T90,
              Char const* k91, typename T91,
              Char const* k92, typename T92,
              Char const* k93, typename T93,
              Char const* k94, typename T94,
              Char const* k95, typename T95,
              Char const* k96, typename T96,
              Char const* k97, typename T97,
              Char const* k98, typename T98,
              Char const* k99, typename T99,
              Char const* k100, typename T100>

    class OptionsSpec<Options<k01, T01,
                              k02, T02,
                              k03, T03,
                              k04, T04,
                              k05, T05,
                              k06, T06,
                              k07, T07,
                              k08, T08,
                              k09, T09,
                              k10, T10,
                              k11, T11,
                              k12, T12,
                              k13, T13,
                              k14, T14,
                              k15, T15,
                              k16, T16,
                              k17, T17,
                              k18, T18,
                              k19, T19,
                              k20, T20,
                              k21, T21,
                              k22, T22,
                              k23, T23,
                              k24, T24,
                              k25, T25,
                              k26, T26,
                              k27, T27,
                              k28, T28,
                              k29, T29,
                              k30, T30,
                              k31, T31,
                              k32, T32,
                              k33, T33,
                              k34, T34,
                              k35, T35,
                              k36, T36,
                              k37, T37,
                              k38, T38,
                              k39, T39,
                              k40, T40,
                              k41, T41,
                              k42, T42,
                              k43, T43,
                              k44, T44,
                              k45, T45,
                              k46, T46,
                              k47, T47,
                              k48, T48,
                              k49, T49,
                              k50, T50,
                              k51, T51,
                              k52, T52,
                              k53, T53,
                              k54, T54,
                              k55, T55,
                              k56, T56,
                              k57, T57,
                              k58, T58,
                              k59, T59,
                              k60, T60,
                              k61, T61,
                              k62, T62,
                              k63, T63,
                              k64, T64,
                              k65, T65,
                              k66, T66,
                              k67, T67,
                              k68, T68,
                              k69, T69,
                              k70, T70,
                              k71, T71,
                              k72, T72,
                              k73, T73,
                              k74, T74,
                              k75, T75,
                              k76, T76,
                              k77, T77,
                              k78, T78,
                              k79, T79,
                              k80, T80,
                              k81, T81,
                              k82, T82,
                              k83, T83,
                              k84, T84,
                              k85, T85,
                              k86, T86,
                              k87, T87,
                              k88, T88,
                              k89, T89,
                              k90, T90,
                              k91, T91,
                              k92, T92,
                              k93, T93,
                              k94, T94,
                              k95, T95,
                              k96, T96,
                              k97, T97,
                              k98, T98,
                              k99, T99,
                              k100, T100> >
    {
    public:
      typedef CLI::Options<k01, T01,
                           k02, T02,
                           k03, T03,
                           k04, T04,
                           k05, T05,
                           k06, T06,
                           k07, T07,
                           k08, T08,
                           k09, T09,
                           k10, T10,
                           k11, T11,
                           k12, T12,
                           k13, T13,
                           k14, T14,
                           k15, T15,
                           k16, T16,
                           k17, T17,
                           k18, T18,
                           k19, T19,
                           k20, T20,
                           k21, T21,
                           k22, T22,
                           k23, T23,
                           k24, T24,
                           k25, T25,
                           k26, T26,
                           k27, T27,
                           k28, T28,
                           k29, T29,
                           k30, T30,
                           k31, T31,
                           k32, T32,
                           k33, T33,
                           k34, T34,
                           k35, T35,
                           k36, T36,
                           k37, T37,
                           k38, T38,
                           k39, T39,
                           k40, T40,
                           k41, T41,
                           k42, T42,
                           k43, T43,
                           k44, T44,
                           k45, T45,
                           k46, T46,
                           k47, T47,
                           k48, T48,
                           k49, T49,
                           k50, T50,
                           k51, T51,
                           k52, T52,
                           k53, T53,
                           k54, T54,
                           k55, T55,
                           k56, T56,
                           k57, T57,
                           k58, T58,
                           k59, T59,
                           k60, T60,
                           k61, T61,
                           k62, T62,
                           k63, T63,
                           k64, T64,
                           k65, T65,
                           k66, T66,
                           k67, T67,
                           k68, T68,
                           k69, T69,
                           k70, T70,
                           k71, T71,
                           k72, T72,
                           k73, T73,
                           k74, T74,
                           k75, T75,
                           k76, T76,
                           k77, T77,
                           k78, T78,
                           k79, T79,
                           k80, T80,
                           k81, T81,
                           k82, T82,
                           k83, T83,
                           k84, T84,
                           k85, T85,
                           k86, T86,
                           k87, T87,
                           k88, T88,
                           k89, T89,
                           k90, T90,
                           k91, T91,
                           k92, T92,
                           k93, T93,
                           k94, T94,
                           k95, T95,
                           k96, T96,
                           k97, T97,
                           k98, T98,
                           k99, T99,
                           k100, T100> Options;

      typedef typename OptionSpecType<k01, T01>::Type o01;
      typedef typename OptionSpecType<k02, T02>::Type o02;
      typedef typename OptionSpecType<k03, T03>::Type o03;
      typedef typename OptionSpecType<k04, T04>::Type o04;
      typedef typename OptionSpecType<k05, T05>::Type o05;
      typedef typename OptionSpecType<k06, T06>::Type o06;
      typedef typename OptionSpecType<k07, T07>::Type o07;
      typedef typename OptionSpecType<k08, T08>::Type o08;
      typedef typename OptionSpecType<k09, T09>::Type o09;
      typedef typename OptionSpecType<k10, T10>::Type o10;
      typedef typename OptionSpecType<k11, T11>::Type o11;
      typedef typename OptionSpecType<k12, T12>::Type o12;
      typedef typename OptionSpecType<k13, T13>::Type o13;
      typedef typename OptionSpecType<k14, T14>::Type o14;
      typedef typename OptionSpecType<k15, T15>::Type o15;
      typedef typename OptionSpecType<k16, T16>::Type o16;
      typedef typename OptionSpecType<k17, T17>::Type o17;
      typedef typename OptionSpecType<k18, T18>::Type o18;
      typedef typename OptionSpecType<k19, T19>::Type o19;
      typedef typename OptionSpecType<k20, T20>::Type o20;
      typedef typename OptionSpecType<k21, T21>::Type o21;
      typedef typename OptionSpecType<k22, T22>::Type o22;
      typedef typename OptionSpecType<k23, T23>::Type o23;
      typedef typename OptionSpecType<k24, T24>::Type o24;
      typedef typename OptionSpecType<k25, T25>::Type o25;
      typedef typename OptionSpecType<k26, T26>::Type o26;
      typedef typename OptionSpecType<k27, T27>::Type o27;
      typedef typename OptionSpecType<k28, T28>::Type o28;
      typedef typename OptionSpecType<k29, T29>::Type o29;
      typedef typename OptionSpecType<k30, T30>::Type o30;
      typedef typename OptionSpecType<k31, T31>::Type o31;
      typedef typename OptionSpecType<k32, T32>::Type o32;
      typedef typename OptionSpecType<k33, T33>::Type o33;
      typedef typename OptionSpecType<k34, T34>::Type o34;
      typedef typename OptionSpecType<k35, T35>::Type o35;
      typedef typename OptionSpecType<k36, T36>::Type o36;
      typedef typename OptionSpecType<k37, T37>::Type o37;
      typedef typename OptionSpecType<k38, T38>::Type o38;
      typedef typename OptionSpecType<k39, T39>::Type o39;
      typedef typename OptionSpecType<k40, T40>::Type o40;
      typedef typename OptionSpecType<k41, T41>::Type o41;
      typedef typename OptionSpecType<k42, T42>::Type o42;
      typedef typename OptionSpecType<k43, T43>::Type o43;
      typedef typename OptionSpecType<k44, T44>::Type o44;
      typedef typename OptionSpecType<k45, T45>::Type o45;
      typedef typename OptionSpecType<k46, T46>::Type o46;
      typedef typename OptionSpecType<k47, T47>::Type o47;
      typedef typename OptionSpecType<k48, T48>::Type o48;
      typedef typename OptionSpecType<k49, T49>::Type o49;
      typedef typename OptionSpecType<k50, T50>::Type o50;
      typedef typename OptionSpecType<k51, T51>::Type o51;
      typedef typename OptionSpecType<k52, T52>::Type o52;
      typedef typename OptionSpecType<k53, T53>::Type o53;
      typedef typename OptionSpecType<k54, T54>::Type o54;
      typedef typename OptionSpecType<k55, T55>::Type o55;
      typedef typename OptionSpecType<k56, T56>::Type o56;
      typedef typename OptionSpecType<k57, T57>::Type o57;
      typedef typename OptionSpecType<k58, T58>::Type o58;
      typedef typename OptionSpecType<k59, T59>::Type o59;
      typedef typename OptionSpecType<k60, T60>::Type o60;
      typedef typename OptionSpecType<k61, T61>::Type o61;
      typedef typename OptionSpecType<k62, T62>::Type o62;
      typedef typename OptionSpecType<k63, T63>::Type o63;
      typedef typename OptionSpecType<k64, T64>::Type o64;
      typedef typename OptionSpecType<k65, T65>::Type o65;
      typedef typename OptionSpecType<k66, T66>::Type o66;
      typedef typename OptionSpecType<k67, T67>::Type o67;
      typedef typename OptionSpecType<k68, T68>::Type o68;
      typedef typename OptionSpecType<k69, T69>::Type o69;
      typedef typename OptionSpecType<k70, T70>::Type o70;
      typedef typename OptionSpecType<k71, T71>::Type o71;
      typedef typename OptionSpecType<k72, T72>::Type o72;
      typedef typename OptionSpecType<k73, T73>::Type o73;
      typedef typename OptionSpecType<k74, T74>::Type o74;
      typedef typename OptionSpecType<k75, T75>::Type o75;
      typedef typename OptionSpecType<k76, T76>::Type o76;
      typedef typename OptionSpecType<k77, T77>::Type o77;
      typedef typename OptionSpecType<k78, T78>::Type o78;
      typedef typename OptionSpecType<k79, T79>::Type o79;
      typedef typename OptionSpecType<k80, T80>::Type o80;
      typedef typename OptionSpecType<k81, T81>::Type o81;
      typedef typename OptionSpecType<k82, T82>::Type o82;
      typedef typename OptionSpecType<k83, T83>::Type o83;
      typedef typename OptionSpecType<k84, T84>::Type o84;
      typedef typename OptionSpecType<k85, T85>::Type o85;
      typedef typename OptionSpecType<k86, T86>::Type o86;
      typedef typename OptionSpecType<k87, T87>::Type o87;
      typedef typename OptionSpecType<k88, T88>::Type o88;
      typedef typename OptionSpecType<k89, T89>::Type o89;
      typedef typename OptionSpecType<k90, T90>::Type o90;
      typedef typename OptionSpecType<k91, T91>::Type o91;
      typedef typename OptionSpecType<k92, T92>::Type o92;
      typedef typename OptionSpecType<k93, T93>::Type o93;
      typedef typename OptionSpecType<k94, T94>::Type o94;
      typedef typename OptionSpecType<k95, T95>::Type o95;
      typedef typename OptionSpecType<k96, T96>::Type o96;
      typedef typename OptionSpecType<k97, T97>::Type o97;
      typedef typename OptionSpecType<k98, T98>::Type o98;
      typedef typename OptionSpecType<k99, T99>::Type o99;
      typedef typename OptionSpecType<k100, T100>::Type o100;


    private:
      typedef Bits::Mapper<k01, o01,
                           k02, o02,
                           k03, o03,
                           k04, o04,
                           k05, o05,
                           k06, o06,
                           k07, o07,
                           k08, o08,
                           k09, o09,
                           k10, o10,
                           k11, o11,
                           k12, o12,
                           k13, o13,
                           k14, o14,
                           k15, o15,
                           k16, o16,
                           k17, o17,
                           k18, o18,
                           k19, o19,
                           k20, o20,
                           k21, o21,
                           k22, o22,
                           k23, o23,
                           k24, o24,
                           k25, o25,
                           k26, o26,
                           k27, o27,
                           k28, o28,
                           k29, o29,
                           k30, o30,
                           k31, o31,
                           k32, o32,
                           k33, o33,
                           k34, o34,
                           k35, o35,
                           k36, o36,
                           k37, o37,
                           k38, o38,
                           k39, o39,
                           k40, o40,
                           k41, o41,
                           k42, o42,
                           k43, o43,
                           k44, o44,
                           k45, o45,
                           k46, o46,
                           k47, o47,
                           k48, o48,
                           k49, o49,
                           k50, o50,
                           k51, o51,
                           k52, o52,
                           k53, o53,
                           k54, o54,
                           k55, o55,
                           k56, o56,
                           k57, o57,
                           k58, o58,
                           k59, o59,
                           k60, o60,
                           k61, o61,
                           k62, o62,
                           k63, o63,
                           k64, o64,
                           k65, o65,
                           k66, o66,
                           k67, o67,
                           k68, o68,
                           k69, o69,
                           k70, o70,
                           k71, o71,
                           k72, o72,
                           k73, o73,
                           k74, o74,
                           k75, o75,
                           k76, o76,
                           k77, o77,
                           k78, o78,
                           k79, o79,
                           k80, o80,
                           k81, o81,
                           k82, o82,
                           k83, o83,
                           k84, o84,
                           k85, o85,
                           k86, o86,
                           k87, o87,
                           k88, o88,
                           k89, o89,
                           k90, o90,
                           k91, o91,
                           k92, o92,
                           k93, o93,
                           k94, o94,
                           k95, o95,
                           k96, o96,
                           k97, o97,
                           k98, o98,
                           k99, o99,
                           k100, o100> Mapper;

    public:
      template <Char const* k>
      typename Mapper::template Selector<k>::Type&
      option ()
      {
        typedef
        typename Mapper::template Selector<k>::Type
        Type;

        return *reinterpret_cast<Type*> (option (k));
      }

      template <Char const* k>
      typename Mapper::template Selector<k>::Type const&
      option () const
      {
        typedef
        typename Mapper::template Selector<k>::Type
        Type;

        return *reinterpret_cast<Type const*> (option (k));
      }

    private:
      Void*
      option (Char const*) const;

    private:
      o01 o01_;
      o02 o02_;
      o03 o03_;
      o04 o04_;
      o05 o05_;
      o06 o06_;
      o07 o07_;
      o08 o08_;
      o09 o09_;
      o10 o10_;
      o11 o11_;
      o12 o12_;
      o13 o13_;
      o14 o14_;
      o15 o15_;
      o16 o16_;
      o17 o17_;
      o18 o18_;
      o19 o19_;
      o20 o20_;
      o21 o21_;
      o22 o22_;
      o23 o23_;
      o24 o24_;
      o25 o25_;
      o26 o26_;
      o27 o27_;
      o28 o28_;
      o29 o29_;
      o30 o30_;
      o31 o31_;
      o32 o32_;
      o33 o33_;
      o34 o34_;
      o35 o35_;
      o36 o36_;
      o37 o37_;
      o38 o38_;
      o39 o39_;
      o40 o40_;
      o41 o41_;
      o42 o42_;
      o43 o43_;
      o44 o44_;
      o45 o45_;
      o46 o46_;
      o47 o47_;
      o48 o48_;
      o49 o49_;
      o50 o50_;
      o51 o51_;
      o52 o52_;
      o53 o53_;
      o54 o54_;
      o55 o55_;
      o56 o56_;
      o57 o57_;
      o58 o58_;
      o59 o59_;
      o60 o60_;
      o61 o61_;
      o62 o62_;
      o63 o63_;
      o64 o64_;
      o65 o65_;
      o66 o66_;
      o67 o67_;
      o68 o68_;
      o69 o69_;
      o70 o70_;
      o71 o71_;
      o72 o72_;
      o73 o73_;
      o74 o74_;
      o75 o75_;
      o76 o76_;
      o77 o77_;
      o78 o78_;
      o79 o79_;
      o80 o80_;
      o81 o81_;
      o82 o82_;
      o83 o83_;
      o84 o84_;
      o85 o85_;
      o86 o86_;
      o87 o87_;
      o88 o88_;
      o89 o89_;
      o90 o90_;
      o91 o91_;
      o92 o92_;
      o93 o93_;
      o94 o94_;
      o95 o95_;
      o96 o96_;
      o97 o97_;
      o98 o98_;
      o99 o99_;
      o100 o100_;
    };
  }
}

#include <cult/cli/options-spec.ixx>
#include <cult/cli/options-spec.txx>

#endif  // CULT_CLI_OPTIONS_SPEC_HXX