// MeCab -- Yet Another Part-of-Speech and Morphological Analyzer // // // Copyright(C) 2001-2006 Taku Kudo // Copyright(C) 2004-2006 Nippon Telegraph and Telephone Corporation #ifndef MECAB_PARAM_H #define MECAB_PARAM_H #include #include #include #include #include "scoped_ptr.h" #include "common.h" namespace { template Target lexical_cast(Source arg) { std::stringstream interpreter; Target result; if (!(interpreter << arg) || !(interpreter >> result) || !(interpreter >> std::ws).eof()) { MeCab::scoped_ptr r(new Target()); // return default value return *r; } return result; } template <> std::string lexical_cast(std::string arg) { return arg; } } namespace MeCab { struct Option { const char *name; char short_name; const char *default_value; const char *arg_description; const char *description; }; class Param { private: std::map conf_; std::vector rest_; std::string system_name_; std::string help_; std::string version_; whatlog what_; public: bool open(int argc, char **argv, const Option *opt); bool open(const char *arg, const Option *opt); bool load(const char *filename); void clear(); const std::vector& rest_args() const { return rest_; } const char* program_name() const { return system_name_.c_str(); } const char *what() { return what_.str(); } const char* help() const { return help_.c_str(); } const char* version() const { return version_.c_str(); } int help_version() const; template T get(const char *key) const { std::map::const_iterator it = conf_.find(key); if (it == conf_.end()) { scoped_ptr r(new T()); return *r; } return lexical_cast(it->second); } template void set(const char* key, const T &value, bool rewrite = true) { std::string key2 = std::string(key); if (rewrite || (!rewrite && conf_.find(key2) == conf_.end())) conf_[key2] = lexical_cast(value); } void dump_config(std::ostream *os) const; explicit Param() {} virtual ~Param() {} }; } #endif