1 /* *****************************************************************
2     MESQUITE -- The Mesh Quality Improvement Toolkit
3 
4     Copyright 2008 Sandia National Laboratories.  Developed at the
5     University of Wisconsin--Madison under SNL contract number
6     624796.  The U.S. Government and the University of Wisconsin
7     retain certain rights to this software.
8 
9     This library is free software; you can redistribute it and/or
10     modify it under the terms of the GNU Lesser General Public
11     License as published by the Free Software Foundation; either
12     version 2.1 of the License, or (at your option) any later version.
13 
14     This library is distributed in the hope that it will be useful,
15     but WITHOUT ANY WARRANTY; without even the implied warranty of
16     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17     Lesser General Public License for more details.
18 
19     You should have received a copy of the GNU Lesser General Public License
20     (lgpl.txt) along with this library; if not, write to the Free Software
21     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22 
23     (2008) kraftche@cae.wisc.edu
24 
25   ***************************************************************** */
26 
27 
28 /** \file CLArgFlag.hpp
29  *  \brief
30  *  \author Jason Kraftcheck
31  */
32 
33 #ifndef MSQ_CLARG_FLAG_HPP
34 #define MSQ_CLARG_FLAG_HPP
35 
36 #include "Mesquite.hpp"
37 #include "CLArgs.hpp"
38 #include <string>
39 #include <vector>
40 #include <iosfwd>
41 
42 class CLArgFlag
43 {
44   private:
45     char mFlag;
46     std::string mDesc;
47 
48   protected:
CLArgFlag(char pflag,const char * pdesc)49     CLArgFlag( char pflag, const char* pdesc )
50       : mFlag(pflag), mDesc(pdesc)
51       {}
52 
53   public:
54     virtual ~CLArgFlag();
55 
flag() const56     char flag() const { return mFlag; }
desc() const57     const char* desc() const { return mDesc.c_str(); }
58     virtual const CLArgs::ArgIBase* callback() const = 0;
59 
60     virtual bool is_toggle() const;
61     virtual bool parse( const char* string_value ) const = 0;
62 
63       /** Get brief format of option */
64     virtual std::string brief() const = 0;
65       /** Get UNIX man-page formated synposis of flag */
66     virtual std::string manstr() const = 0;
67 
68     virtual bool add_set( int size, const char* const* names );
69 
70     std::string make_man_string( int count, const char* names[] ) const;
make_man_string(const char * arg_name) const71     std::string make_man_string( const char* arg_name ) const
72       { return make_man_string( 1, &arg_name ); }
make_man_string() const73     std::string make_man_string( ) const
74       { return make_man_string( 0, 0 ); }
75     std::string make_literal_man_string( int count, const char* literal_args[] ) const;
make_literal_man_string(const char * literal_args) const76     std::string make_literal_man_string( const char* literal_args ) const
77       { return make_literal_man_string( 1, &literal_args ); }
78 };
79 
80 class CLArgToggle : public CLArgFlag
81 {
82   private:
83     bool mValue; //!< value to pass to callback when flag is encountered
84     CLArgs::ToggleArgI* mCallback;
85     CLArgToggle* mOpposite;
86   public:
CLArgToggle(char pflag,const char * pdesc,bool value,CLArgs::ToggleArgI * pcallback)87     CLArgToggle( char pflag,
88                  const char* pdesc,
89                  bool value,
90                  CLArgs::ToggleArgI* pcallback )
91       : CLArgFlag( pflag, pdesc ),
92         mValue( value ),
93         mCallback( pcallback ),
94         mOpposite( 0 )
95       { }
CLArgToggle(char pflag,const char * pdesc,CLArgToggle * opposite)96     CLArgToggle( char pflag,
97                  const char* pdesc,
98                  CLArgToggle* opposite )
99       : CLArgFlag( pflag, pdesc ),
100         mValue( !opposite->mValue ),
101         mCallback( opposite->mCallback ),
102         mOpposite( opposite )
103       {
104         mOpposite->mOpposite = this;
105       }
106 
callback() const107     virtual const CLArgs::ArgIBase* callback() const { return mCallback; }
108 
is_toggle() const109     virtual bool is_toggle() const
110       { return true; }
111     virtual bool parse( const char* option ) const;
112 
113     virtual std::string brief() const;
114     virtual std::string manstr() const;
115 };
116 
117 class CLArgString : public CLArgFlag
118 {
119   private:
120     std::string mName;
121     CLArgs::StringArgI* mCallback;
122 
123   public:
CLArgString(char fl,const char * name,const char * pdesc,CLArgs::StringArgI * pcallback)124     CLArgString( char fl, const char* name, const char* pdesc,
125                  CLArgs::StringArgI* pcallback )
126                 : CLArgFlag( fl, pdesc ),
127                   mName( name ),
128                   mCallback( pcallback )
129                   {}
130 
callback() const131     virtual const CLArgs::ArgIBase* callback() const { return mCallback; }
132 
133     virtual bool parse( const char* option ) const;
134 
135 
136     virtual std::string brief() const;
137     virtual std::string manstr() const;
138 };
139 
140 class CLArgLong : public CLArgFlag
141 {
142   private:
143     CLArgs::LongArgI* mCallback;
144     std::string mName;
145 
146   public:
CLArgLong(char fl,const char * name,const char * pdesc,CLArgs::LongArgI * pcallback)147     CLArgLong( char fl, const char* name, const char* pdesc,
148                CLArgs::LongArgI* pcallback )
149       : CLArgFlag( fl, pdesc ),
150         mCallback( pcallback ),
151         mName( name )
152     {}
153 
callback() const154     virtual const CLArgs::ArgIBase* callback() const { return mCallback; }
155 
156     virtual bool parse( const char* option ) const;
157 
158     virtual std::string brief() const;
159     virtual std::string manstr() const;
160 };
161 
162 class CLArgInt : public CLArgFlag
163 {
164   private:
165     CLArgs::IntArgI* mCallback;
166     std::string mName;
167 
168   public:
CLArgInt(char fl,const char * name,const char * pdesc,CLArgs::IntArgI * pcallback)169     CLArgInt(  char fl, const char* name, const char* pdesc,
170                CLArgs::IntArgI* pcallback )
171       : CLArgFlag( fl, pdesc ),
172         mCallback( pcallback ),
173         mName( name )
174     {}
175 
callback() const176     virtual const CLArgs::ArgIBase* callback() const { return mCallback; }
177 
178     virtual bool parse( const char* option ) const;
179 
180     virtual std::string brief() const;
181     virtual std::string manstr() const;
182 };
183 
184 class CLArgDouble : public CLArgFlag
185 {
186   private:
187     CLArgs::DoubleArgI* mCallback;
188     std::string mName;
189 
190   public:
CLArgDouble(char fl,const char * name,const char * pdesc,CLArgs::DoubleArgI * pcallback)191     CLArgDouble( char fl, const char* name, const char* pdesc,
192                  CLArgs::DoubleArgI* pcallback )
193       : CLArgFlag( fl, pdesc ),
194         mCallback( pcallback ),
195         mName( name )
196     {}
197 
callback() const198     virtual const CLArgs::ArgIBase* callback() const { return mCallback; }
199 
200     virtual bool parse( const char* option ) const;
201 
202     virtual std::string brief() const;
203     virtual std::string manstr() const;
204 };
205 
206 
207 class CLArgIDList : public CLArgFlag
208 {
209   public:
210     CLArgs::IntListArgI* mCallback;
211 
212   public:
CLArgIDList(char fl,const char * pdesc,CLArgs::IntListArgI * pcallback)213     CLArgIDList( char fl, const char* pdesc, CLArgs::IntListArgI* pcallback )
214       : CLArgFlag( fl, pdesc ), mCallback( pcallback )
215       {}
216 
callback() const217     virtual const CLArgs::ArgIBase* callback() const { return mCallback; }
218 
219     virtual bool parse( const char* str ) const;
220 
221     virtual std::string brief() const;
222     virtual std::string manstr() const;
223 };
224 
225 class CLArgListData
226 {
227   std::vector< std::vector< std::string > > mSets;
228 
229   public:
230 
231     bool add_set( int size, const char* const* names );
232     bool acceptable_length( unsigned len ) const;
accept_any_length() const233     bool accept_any_length() const
234       { return mSets.empty(); }
235 
236     std::string set_string( int set ) const;
237     std::string brief() const;
238     std::string manstr( char type_char, const CLArgFlag& f ) const;
239 };
240 
241 class CLArgIntList : public CLArgFlag
242 {
243   private:
244     CLArgListData listData;
245     CLArgs::IntListArgI* mCallback;
246 
247   public:
CLArgIntList(char fl,const char * pdesc,CLArgs::IntListArgI * pcallback)248     CLArgIntList( char fl, const char* pdesc, CLArgs::IntListArgI* pcallback )
249       : CLArgFlag( fl, pdesc ), mCallback( pcallback )
250     {}
251 
callback() const252     virtual const CLArgs::ArgIBase* callback() const { return mCallback; }
253 
254     virtual bool parse( const char* option ) const;
255 
256     virtual std::string brief() const;
257     virtual std::string manstr() const;
add_set(int size,const char * const * names)258     virtual bool add_set( int size, const char* const* names )
259       { return listData.add_set( size, names ); }
260 };
261 
262 class CLArgDoubleList : public CLArgFlag
263 {
264   private:
265     CLArgListData listData;
266     std::string mName;
267     CLArgs::DoubleListArgI* mCallback;
268 
269   public:
CLArgDoubleList(char fl,const char * pdesc,CLArgs::DoubleListArgI * pcallback)270     CLArgDoubleList( char fl,
271                      const char* pdesc,
272                      CLArgs::DoubleListArgI* pcallback )
273       : CLArgFlag( fl, pdesc ),
274         mCallback( pcallback )
275         {}
276 
callback() const277     virtual const CLArgs::ArgIBase* callback() const { return mCallback; }
278 
279     virtual bool parse( const char* option ) const;
280 
281     virtual std::string brief() const;
282     virtual std::string manstr() const;
add_set(int size,const char * const * names)283     virtual bool add_set( int size, const char* const* names )
284       { return listData.add_set( size, names ); }
285 };
286 
287 #endif
288