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