123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- /*
- * Copyright 2002, LifeLine Networks BV (www.lifeline.nl). All rights reserved.
- * Copyright 2002, Bastiaan Bakker. All rights reserved.
- *
- * See the COPYING file for the terms of usage and distribution.
- */
- #if !defined(h_3e645482_ae6a_43e5_8f81_abbc4200212d)
- #define h_3e645482_ae6a_43e5_8f81_abbc4200212d
- #include <map>
- #include <string>
- #include <sstream>
- #include <stdexcept>
- #include "Portability.hh"
- namespace log4cpp
- {
- class FactoryParams;
- namespace details
- {
- class base_validator_data
- {
- public:
- base_validator_data(const char* tag, const FactoryParams* params) : tag_(tag), params_(params){}
- protected:
- const char* tag_;
- const FactoryParams* params_;
- template<typename T>
- void assign(const std::string& param_value, T& value) const
- {
- assign_impl(param_value, value);
- }
- template<typename T>
- void assign_impl(const std::string& param_value, T& value) const
- {
- std::stringstream s;
- s << param_value;
- s >> value;
- }
- void assign_impl(const std::string& param_value, std::string& value) const
- {
- value = param_value;
- }
- void throw_error(const char* param_name) const
- {
- std::stringstream s;
- s << "Property '" << param_name << "' required to configure " << tag_;
- throw std::runtime_error(s.str());
- }
- };
- class parameter_validator;
- }
- class LOG4CPP_EXPORT FactoryParams
- {
- typedef std::map<std::string, std::string> storage_t;
-
- storage_t storage_;
-
- public:
- typedef storage_t::const_iterator const_iterator;
- const std::string& operator[](const std::string& v) const;
- std::string& operator[](const std::string& v) { return storage_[v]; }
- details::parameter_validator get_for(const char* tag) const;
- const_iterator find(const std::string& t) const;
- const_iterator begin() const { return storage_.begin(); }
- const_iterator end() const { return storage_.end(); }
- };
- namespace details
- {
- class optional_params_validator;
- class required_params_validator : public base_validator_data
- {
- public:
- required_params_validator(const char* tag, const FactoryParams* params) : base_validator_data(tag, params) {}
- #if defined(_MSC_VER) && _MSC_VER < 1300
- template<typename T>
- optional_params_validator optional(const char* param, T& value) const { optional_params_validator v(tag_, params_); v(param, value); return v; }
- #else
- template<typename T>
- optional_params_validator optional(const char* param, T& value) const;
- #endif
-
- template<typename T>
- const required_params_validator& operator()(const char* param, T& value) const
- {
- FactoryParams::const_iterator i = params_->find(param);
- if (i != params_->end())
- assign(i->second, value);
- else
- throw_error(param);
- return *this;
- }
- };
-
- class optional_params_validator : public base_validator_data
- {
- public:
- optional_params_validator(const char* tag, const FactoryParams* params) : base_validator_data(tag, params) {}
- template<typename T>
- required_params_validator required(const char* param, T& value) const { required_params_validator v(tag_, params_); v(param, value); return v; }
- template<typename T>
- const optional_params_validator& operator()(const char* param, T& value) const
- {
- FactoryParams::const_iterator i = params_->find(param);
- if (i != params_->end())
- assign(i->second, value);
- return *this;
- }
- };
- class parameter_validator : public base_validator_data
- {
- public:
- parameter_validator(const char* tag, const FactoryParams* params) : base_validator_data(tag, params) {}
- template<typename T>
- required_params_validator required(const char* param, T& value) const { required_params_validator v(tag_, params_); v(param, value); return v; }
- template<typename T>
- optional_params_validator optional(const char* param, T& value) const { optional_params_validator v(tag_, params_); v(param, value); return v; }
- };
- #if !(defined(_MSC_VER) && _MSC_VER < 1300)
- template<typename T>
- optional_params_validator
- required_params_validator::optional(const char* param, T& value) const
- {
- optional_params_validator v(tag_, params_);
- v(param, value);
- return v;
- }
- #endif
- }
- inline details::parameter_validator FactoryParams::get_for(const char* tag) const
- {
- return details::parameter_validator(tag, this);
- }
- }
- #endif // h_3e645482_ae6a_43e5_8f81_abbc4200212d
|