GEL
2
GEL is a library for Geometry and Linear Algebra
|
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