FactoryParams.hh 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. /*
  2. * Copyright 2002, LifeLine Networks BV (www.lifeline.nl). All rights reserved.
  3. * Copyright 2002, Bastiaan Bakker. All rights reserved.
  4. *
  5. * See the COPYING file for the terms of usage and distribution.
  6. */
  7. #if !defined(h_3e645482_ae6a_43e5_8f81_abbc4200212d)
  8. #define h_3e645482_ae6a_43e5_8f81_abbc4200212d
  9. #include <map>
  10. #include <string>
  11. #include <sstream>
  12. #include <stdexcept>
  13. #include "Portability.hh"
  14. namespace log4cpp
  15. {
  16. class FactoryParams;
  17. namespace details
  18. {
  19. class base_validator_data
  20. {
  21. public:
  22. base_validator_data(const char* tag, const FactoryParams* params) : tag_(tag), params_(params){}
  23. protected:
  24. const char* tag_;
  25. const FactoryParams* params_;
  26. template<typename T>
  27. void assign(const std::string& param_value, T& value) const
  28. {
  29. assign_impl(param_value, value);
  30. }
  31. template<typename T>
  32. void assign_impl(const std::string& param_value, T& value) const
  33. {
  34. std::stringstream s;
  35. s << param_value;
  36. s >> value;
  37. }
  38. void assign_impl(const std::string& param_value, std::string& value) const
  39. {
  40. value = param_value;
  41. }
  42. void throw_error(const char* param_name) const
  43. {
  44. std::stringstream s;
  45. s << "Property '" << param_name << "' required to configure " << tag_;
  46. throw std::runtime_error(s.str());
  47. }
  48. };
  49. class parameter_validator;
  50. }
  51. class LOG4CPP_EXPORT FactoryParams
  52. {
  53. typedef std::map<std::string, std::string> storage_t;
  54. storage_t storage_;
  55. public:
  56. typedef storage_t::const_iterator const_iterator;
  57. const std::string& operator[](const std::string& v) const;
  58. std::string& operator[](const std::string& v) { return storage_[v]; }
  59. details::parameter_validator get_for(const char* tag) const;
  60. const_iterator find(const std::string& t) const;
  61. const_iterator begin() const { return storage_.begin(); }
  62. const_iterator end() const { return storage_.end(); }
  63. };
  64. namespace details
  65. {
  66. class optional_params_validator;
  67. class required_params_validator : public base_validator_data
  68. {
  69. public:
  70. required_params_validator(const char* tag, const FactoryParams* params) : base_validator_data(tag, params) {}
  71. #if defined(_MSC_VER) && _MSC_VER < 1300
  72. template<typename T>
  73. optional_params_validator optional(const char* param, T& value) const { optional_params_validator v(tag_, params_); v(param, value); return v; }
  74. #else
  75. template<typename T>
  76. optional_params_validator optional(const char* param, T& value) const;
  77. #endif
  78. template<typename T>
  79. const required_params_validator& operator()(const char* param, T& value) const
  80. {
  81. FactoryParams::const_iterator i = params_->find(param);
  82. if (i != params_->end())
  83. assign(i->second, value);
  84. else
  85. throw_error(param);
  86. return *this;
  87. }
  88. };
  89. class optional_params_validator : public base_validator_data
  90. {
  91. public:
  92. optional_params_validator(const char* tag, const FactoryParams* params) : base_validator_data(tag, params) {}
  93. template<typename T>
  94. required_params_validator required(const char* param, T& value) const { required_params_validator v(tag_, params_); v(param, value); return v; }
  95. template<typename T>
  96. const optional_params_validator& operator()(const char* param, T& value) const
  97. {
  98. FactoryParams::const_iterator i = params_->find(param);
  99. if (i != params_->end())
  100. assign(i->second, value);
  101. return *this;
  102. }
  103. };
  104. class parameter_validator : public base_validator_data
  105. {
  106. public:
  107. parameter_validator(const char* tag, const FactoryParams* params) : base_validator_data(tag, params) {}
  108. template<typename T>
  109. required_params_validator required(const char* param, T& value) const { required_params_validator v(tag_, params_); v(param, value); return v; }
  110. template<typename T>
  111. optional_params_validator optional(const char* param, T& value) const { optional_params_validator v(tag_, params_); v(param, value); return v; }
  112. };
  113. #if !(defined(_MSC_VER) && _MSC_VER < 1300)
  114. template<typename T>
  115. optional_params_validator
  116. required_params_validator::optional(const char* param, T& value) const
  117. {
  118. optional_params_validator v(tag_, params_);
  119. v(param, value);
  120. return v;
  121. }
  122. #endif
  123. }
  124. inline details::parameter_validator FactoryParams::get_for(const char* tag) const
  125. {
  126. return details::parameter_validator(tag, this);
  127. }
  128. }
  129. #endif // h_3e645482_ae6a_43e5_8f81_abbc4200212d