GEL  2
GEL is a library for Geometry and Linear Algebra
/Users/jab/Documents/Teaching/02585/GEL2_and_demos/GEL/src/Util/ArgExtracter.h
00001 #ifndef __UTIL_ARG_EXTRACTER__
00002 #define __UTIL_ARG_EXTRACTER__
00003 #include <vector>
00004 #include <algorithm>
00005 #include <cstdlib>
00006 #include <list>
00007 #include <string>
00008 #include <cassert>
00009 
00010 namespace Util
00011 {
00012     template<class T>
00013     inline T string_convert(const std::string& x)
00014     {
00015         assert(0);
00016         T t;
00017         return t;
00018     }
00019     template<> 
00020     inline int string_convert(const std::string& x){ 
00021         return std::atoi(x.c_str());}
00022     template<> 
00023     inline float string_convert(const std::string& x){ 
00024         return static_cast<float>(std::atof(x.c_str()));}
00025     template<> 
00026     inline double string_convert(const std::string& x){ 
00027         return std::atof(x.c_str());}
00028     template<> 
00029     inline std::string string_convert(const std::string& x){ 
00030         return x;}
00031 
00032 
00033     struct UpCase {void operator()(char& x) {x=toupper(x);}};
00034 
00035     inline void up_case_string(std::string& s)
00036     {
00037         std::for_each(s.begin(), s.end(), UpCase());
00038     }
00039 
00040 
00041 
00042 
00043     class ArgExtracter
00044     {   
00045         std::list<std::string> avec;
00046         typedef std::list<std::string>::iterator LSI;
00047 
00048         bool extract(const std::string& argname, LSI& iter)
00049         {
00050             for(iter = avec.begin();iter != avec.end(); ++iter)
00051             {
00052                 if((*iter)==argname)
00053                 {
00054                     iter = avec.erase(iter);
00055                     return true;
00056                 }
00057             }
00058             return false;
00059         }
00060 
00061     public:
00062 
00063         ArgExtracter(int argc, char **argv)
00064         {
00065             for(int i=0;i<argc; ++i)
00066                 avec.push_back(std::string(argv[i]));
00067         }
00068 
00069         bool extract(const std::string& argname)
00070         {
00071             LSI iter;
00072             return extract(argname, iter);
00073         }
00074 
00075         template<class T>
00076         bool extract(const std::string& argname, T& val)
00077         {
00078             LSI iter;
00079             if(extract(argname, iter))
00080             {
00081                 val = string_convert<T>(iter->c_str());
00082                 avec.erase(iter);
00083                 return true;
00084             }
00085             return false;
00086         }
00087 
00088         int no_remaining_args() const
00089         {
00090             return avec.size();
00091         }
00092 
00093         const std::string& get_last_arg() const
00094         {
00095             static const std::string emptystring("");
00096             if(no_remaining_args() > 0)
00097                 return avec.back();
00098             return emptystring;
00099         }
00100 
00101         void get_all_args(std::vector<std::string>& args)
00102         {
00103             args = std::vector<std::string>(avec.begin(), avec.end());
00104         }
00105     };
00106 
00107 }
00108 
00109 
00110 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations