// file : cult/cli/options-spec.hxx // author : Boris Kolpackov // 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 #include namespace Cult { namespace CLI { template 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 struct OptionSpecType { typedef OptionSpec Type; }; template <> struct OptionSpecType { typedef Bits::Null Type; }; template Char const* const OptionSpec::key = k; template class OptionsSpec; template class OptionsSpec > { public: typedef CLI::Options Options; typedef typename OptionSpecType::Type o01; typedef typename OptionSpecType::Type o02; typedef typename OptionSpecType::Type o03; typedef typename OptionSpecType::Type o04; typedef typename OptionSpecType::Type o05; typedef typename OptionSpecType::Type o06; typedef typename OptionSpecType::Type o07; typedef typename OptionSpecType::Type o08; typedef typename OptionSpecType::Type o09; typedef typename OptionSpecType::Type o10; typedef typename OptionSpecType::Type o11; typedef typename OptionSpecType::Type o12; typedef typename OptionSpecType::Type o13; typedef typename OptionSpecType::Type o14; typedef typename OptionSpecType::Type o15; typedef typename OptionSpecType::Type o16; typedef typename OptionSpecType::Type o17; typedef typename OptionSpecType::Type o18; typedef typename OptionSpecType::Type o19; typedef typename OptionSpecType::Type o20; typedef typename OptionSpecType::Type o21; typedef typename OptionSpecType::Type o22; typedef typename OptionSpecType::Type o23; typedef typename OptionSpecType::Type o24; typedef typename OptionSpecType::Type o25; typedef typename OptionSpecType::Type o26; typedef typename OptionSpecType::Type o27; typedef typename OptionSpecType::Type o28; typedef typename OptionSpecType::Type o29; typedef typename OptionSpecType::Type o30; typedef typename OptionSpecType::Type o31; typedef typename OptionSpecType::Type o32; typedef typename OptionSpecType::Type o33; typedef typename OptionSpecType::Type o34; typedef typename OptionSpecType::Type o35; typedef typename OptionSpecType::Type o36; typedef typename OptionSpecType::Type o37; typedef typename OptionSpecType::Type o38; typedef typename OptionSpecType::Type o39; typedef typename OptionSpecType::Type o40; typedef typename OptionSpecType::Type o41; typedef typename OptionSpecType::Type o42; typedef typename OptionSpecType::Type o43; typedef typename OptionSpecType::Type o44; typedef typename OptionSpecType::Type o45; typedef typename OptionSpecType::Type o46; typedef typename OptionSpecType::Type o47; typedef typename OptionSpecType::Type o48; typedef typename OptionSpecType::Type o49; typedef typename OptionSpecType::Type o50; typedef typename OptionSpecType::Type o51; typedef typename OptionSpecType::Type o52; typedef typename OptionSpecType::Type o53; typedef typename OptionSpecType::Type o54; typedef typename OptionSpecType::Type o55; typedef typename OptionSpecType::Type o56; typedef typename OptionSpecType::Type o57; typedef typename OptionSpecType::Type o58; typedef typename OptionSpecType::Type o59; typedef typename OptionSpecType::Type o60; typedef typename OptionSpecType::Type o61; typedef typename OptionSpecType::Type o62; typedef typename OptionSpecType::Type o63; typedef typename OptionSpecType::Type o64; typedef typename OptionSpecType::Type o65; typedef typename OptionSpecType::Type o66; typedef typename OptionSpecType::Type o67; typedef typename OptionSpecType::Type o68; typedef typename OptionSpecType::Type o69; typedef typename OptionSpecType::Type o70; typedef typename OptionSpecType::Type o71; typedef typename OptionSpecType::Type o72; typedef typename OptionSpecType::Type o73; typedef typename OptionSpecType::Type o74; typedef typename OptionSpecType::Type o75; typedef typename OptionSpecType::Type o76; typedef typename OptionSpecType::Type o77; typedef typename OptionSpecType::Type o78; typedef typename OptionSpecType::Type o79; typedef typename OptionSpecType::Type o80; typedef typename OptionSpecType::Type o81; typedef typename OptionSpecType::Type o82; typedef typename OptionSpecType::Type o83; typedef typename OptionSpecType::Type o84; typedef typename OptionSpecType::Type o85; typedef typename OptionSpecType::Type o86; typedef typename OptionSpecType::Type o87; typedef typename OptionSpecType::Type o88; typedef typename OptionSpecType::Type o89; typedef typename OptionSpecType::Type o90; typedef typename OptionSpecType::Type o91; typedef typename OptionSpecType::Type o92; typedef typename OptionSpecType::Type o93; typedef typename OptionSpecType::Type o94; typedef typename OptionSpecType::Type o95; typedef typename OptionSpecType::Type o96; typedef typename OptionSpecType::Type o97; typedef typename OptionSpecType::Type o98; typedef typename OptionSpecType::Type o99; typedef typename OptionSpecType::Type o100; private: typedef Bits::Mapper Mapper; public: template typename Mapper::template Selector::Type& option () { typedef typename Mapper::template Selector::Type Type; return *reinterpret_cast (option (k)); } template typename Mapper::template Selector::Type const& option () const { typedef typename Mapper::template Selector::Type Type; return *reinterpret_cast (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 #include #endif // CULT_CLI_OPTIONS_SPEC_HXX