diff options
Diffstat (limited to 'libcult/cult/cli/options-spec.hxx')
-rw-r--r-- | libcult/cult/cli/options-spec.hxx | 723 |
1 files changed, 723 insertions, 0 deletions
diff --git a/libcult/cult/cli/options-spec.hxx b/libcult/cult/cli/options-spec.hxx new file mode 100644 index 0000000..aff4541 --- /dev/null +++ b/libcult/cult/cli/options-spec.hxx @@ -0,0 +1,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 |