diff options
Diffstat (limited to 'src/optparser.h')
-rw-r--r-- | src/optparser.h | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/optparser.h b/src/optparser.h index ed32e45..acfb35d 100644 --- a/src/optparser.h +++ b/src/optparser.h | |||
@@ -6,6 +6,8 @@ | |||
6 | #include "bu/hash.h" | 6 | #include "bu/hash.h" |
7 | #include "bu/signals.h" | 7 | #include "bu/signals.h" |
8 | #include "bu/array.h" | 8 | #include "bu/array.h" |
9 | #include "bu/membuf.h" | ||
10 | #include "bu/formatter.h" | ||
9 | 11 | ||
10 | namespace Bu | 12 | namespace Bu |
11 | { | 13 | { |
@@ -13,11 +15,51 @@ namespace Bu | |||
13 | class OptParser | 15 | class OptParser |
14 | { | 16 | { |
15 | public: | 17 | public: |
18 | class _ValueProxy | ||
19 | { | ||
20 | public: | ||
21 | _ValueProxy(); | ||
22 | virtual ~_ValueProxy(); | ||
23 | |||
24 | virtual void setValue( const Bu::FString & )=0; | ||
25 | virtual _ValueProxy *clone()=0; | ||
26 | }; | ||
27 | |||
28 | template<typename ptype> | ||
29 | class ValueProxy : public _ValueProxy | ||
30 | { | ||
31 | public: | ||
32 | ValueProxy( ptype &v ) : | ||
33 | v( v ) | ||
34 | { | ||
35 | } | ||
36 | |||
37 | virtual ~ValueProxy() | ||
38 | { | ||
39 | } | ||
40 | |||
41 | virtual void setValue( const Bu::FString &sVal ) | ||
42 | { | ||
43 | Bu::MemBuf mb( sVal ); | ||
44 | Bu::Formatter f( mb ); | ||
45 | f >> v; | ||
46 | } | ||
47 | |||
48 | virtual _ValueProxy *clone() | ||
49 | { | ||
50 | return new ValueProxy<ptype>( v ); | ||
51 | } | ||
52 | |||
53 | private: | ||
54 | ptype &v; | ||
55 | }; | ||
56 | |||
16 | typedef Signal1<int, StrArray> OptionSignal; | 57 | typedef Signal1<int, StrArray> OptionSignal; |
17 | class Option | 58 | class Option |
18 | { | 59 | { |
19 | public: | 60 | public: |
20 | Option(); | 61 | Option(); |
62 | Option( const Option &rSrc ); | ||
21 | virtual ~Option(); | 63 | virtual ~Option(); |
22 | 64 | ||
23 | char cOpt; | 65 | char cOpt; |
@@ -25,6 +67,8 @@ namespace Bu | |||
25 | Bu::FString sHelp; | 67 | Bu::FString sHelp; |
26 | OptionSignal sUsed; | 68 | OptionSignal sUsed; |
27 | bool bShortHasParams; | 69 | bool bShortHasParams; |
70 | _ValueProxy *pProxy; | ||
71 | Bu::FString sOverride; | ||
28 | }; | 72 | }; |
29 | 73 | ||
30 | public: | 74 | public: |
@@ -34,6 +78,21 @@ namespace Bu | |||
34 | void parse( int argc, char **argv ); | 78 | void parse( int argc, char **argv ); |
35 | 79 | ||
36 | void addOption( const Option &opt ); | 80 | void addOption( const Option &opt ); |
81 | |||
82 | template<typename vtype> | ||
83 | void addOption( char cOpt, const Bu::FString &sOpt, vtype &var, | ||
84 | const Bu::FString &sHelp="", const Bu::FString &sOverride="" ) | ||
85 | { | ||
86 | Option o; | ||
87 | o.cOpt = cOpt; | ||
88 | o.sOpt = sOpt; | ||
89 | o.pProxy = new ValueProxy<vtype>( var ); | ||
90 | o.bShortHasParams = true; | ||
91 | o.sHelp = sHelp; | ||
92 | o.sOverride = sOverride; | ||
93 | addOption( o ); | ||
94 | } | ||
95 | |||
37 | void addHelpOption( char c, const Bu::FString &s, const Bu::FString &sHelp ); | 96 | void addHelpOption( char c, const Bu::FString &s, const Bu::FString &sHelp ); |
38 | 97 | ||
39 | int optHelp( StrArray aParams ); | 98 | int optHelp( StrArray aParams ); |