00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021  
00022 
00023 #ifndef TCLAP_VALUESCONSTRAINT_H
00024 #define TCLAP_VALUESCONSTRAINT_H
00025 
00026 #include <string>
00027 #include <vector>
00028 #include <tclap/Constraint.h>
00029 
00030 #ifdef HAVE_CONFIG_H
00031 #include <config.h>
00032 #else
00033 #define HAVE_SSTREAM
00034 #endif
00035 
00036 #if defined(HAVE_SSTREAM)
00037 #include <sstream>
00038 #elif defined(HAVE_STRSTREAM)
00039 #include <strstream>
00040 #else
00041 #error "Need a stringstream (sstream or strstream) to compile!"
00042 #endif
00043 
00044 namespace TCLAP {
00045 
00050 template<class T>
00051 class ValuesConstraint : public Constraint<T>
00052 {
00053 
00054     public:
00055 
00060         ValuesConstraint(std::vector<T>& allowed);  
00061 
00065         virtual ~ValuesConstraint() {}
00066 
00070         virtual std::string description() const;
00071 
00075         virtual std::string shortID() const;
00076 
00082         virtual bool check(const T& value) const;
00083     
00084     protected:
00085 
00089         std::vector<T> _allowed;
00090 
00094         std::string _typeDesc;
00095 
00096 };
00097 
00098 template<class T>
00099 ValuesConstraint<T>::ValuesConstraint(std::vector<T>& allowed)
00100 : _allowed(allowed),
00101   _typeDesc("")
00102 { 
00103     for ( unsigned int i = 0; i < _allowed.size(); i++ )
00104     {
00105 
00106 #if defined(HAVE_SSTREAM)
00107         std::ostringstream os;
00108 #elif defined(HAVE_STRSTREAM)
00109         std::ostrstream os;
00110 #else
00111 #error "Need a stringstream (sstream or strstream) to compile!"
00112 #endif
00113 
00114         os << _allowed[i];
00115 
00116         std::string temp( os.str() ); 
00117 
00118         if ( i > 0 )
00119             _typeDesc += "|";
00120         _typeDesc += temp;
00121     }
00122 }
00123 
00124 template<class T>
00125 bool ValuesConstraint<T>::check( const T& val ) const
00126 {
00127     if ( std::find(_allowed.begin(),_allowed.end(),val) == _allowed.end() )
00128         return false;
00129     else 
00130         return true;
00131 }
00132 
00133 template<class T>
00134 std::string ValuesConstraint<T>::shortID() const
00135 {
00136     return _typeDesc;   
00137 }
00138 
00139 template<class T>
00140 std::string ValuesConstraint<T>::description() const
00141 {
00142     return _typeDesc;   
00143 }
00144 
00145 
00146 } 
00147 #endif 
00148