1 #ifndef jb_config_recurse_hpp 2 #define jb_config_recurse_hpp 19 #ifndef jb_config_attribute_hpp 20 #error "This file should only be included from jb/config_attribute.hpp" 21 #endif // !jb_config_attribute_hpp 24 #include <type_traits> 29 template <
typename C,
typename T>
30 class config_attribute;
52 template <
typename T,
typename... Args>
56 if (not by_name or not by_name.IsDefined() or by_name.IsNull()) {
60 lhs = std::move(by_name.as<T>());
67 static typename std::enable_if<
68 std::is_base_of<config_object, T>::value,
void>::type
71 lhs.apply_overrides(by_name, by_class);
77 template <
typename C,
typename T>
86 template <
typename Sequence>
87 static typename std::enable_if<
88 std::is_base_of<config_object, typename Sequence::value_type>::value,
91 Sequence& lhs, YAML::Node
const& by_name,
95 for (
auto i : by_name) {
96 typename Sequence::value_type v;
97 if (idx < lhs.size()) {
98 v = std::move(lhs[idx]);
101 tmp.push_back(std::move(v));
104 for (; idx < lhs.size(); ++idx) {
105 tmp.push_back(std::move(lhs[idx]));
114 template <
typename T,
typename... Args>
116 boost::program_options::options_description& options, T
const&
object,
119 options.add_options()(
121 boost::program_options::value<T>(), d.
helpmsg.c_str());
127 template <
typename T>
128 static typename std::enable_if<
129 std::is_base_of<config_object, T>::value,
void>::type
131 boost::program_options::options_description& options, T
const&
object,
140 template <
typename C,
typename T>
142 boost::program_options::options_description& options,
150 template <
typename Sequence>
151 static typename std::enable_if<
152 std::is_base_of<config_object, typename Sequence::value_type>::value,
155 boost::program_options::options_description& options,
156 Sequence
const&
object, std::string
const& prefix,
158 if (
object.
size() == 0) {
159 typedef typename Sequence::value_type child;
166 for (
auto const& i :
object) {
167 std::ostringstream os;
179 template <
typename U,
typename V>
181 boost::program_options::options_description& options,
182 std::pair<U, V>
const&
object, std::string
const& prefix,
185 options,
object.first,
188 d.
helpmsg +
". Set the first field"));
190 options,
object.second,
193 d.
helpmsg +
". Set the second field"));
199 template <
typename T,
typename... Args>
201 T& rhs, boost::program_options::variables_map
const& vm,
202 std::string
const& name, Args...) {
203 if (vm.count(name)) {
204 rhs = vm[name].as<T>();
211 template <
typename T>
212 static typename std::enable_if<
213 std::is_base_of<config_object, T>::value,
void>::type
215 T& rhs, boost::program_options::variables_map
const& vm,
216 std::string
const& name) {
217 rhs.apply_cmdline_values(vm, name);
223 template <
typename C,
typename T>
226 boost::program_options::variables_map
const& vm, std::string
const& name);
232 template <
typename Sequence>
233 static typename std::enable_if<
234 std::is_base_of<config_object, typename Sequence::value_type>::value,
237 Sequence& rhs, boost::program_options::variables_map
const& vm,
238 std::string
const& name) {
240 if (rhs.size() == 0) {
244 for (
auto& i : rhs) {
245 std::ostringstream os;
256 template <
typename U,
typename V>
258 std::pair<U, V>& rhs, boost::program_options::variables_map
const& vm,
259 std::string
const& name) {
267 template <
typename T,
typename... Args>
277 template <
typename T>
278 static typename std::enable_if<
279 std::is_base_of<config_object, T>::value,
void>::type
281 object.validate_all();
288 template <
typename C,
typename T>
295 template <
typename Sequence>
296 static typename std::enable_if<
297 std::is_base_of<config_object, typename Sequence::value_type>::value,
300 for (
auto const& i : seq) {
308 template <
typename U,
typename V>
309 static void validate(std::pair<U, V>
const&
object) {
315 template <
typename T,
typename... Args>
316 static YAML::Node
to_yaml(T
const& x, Args...) {
326 template <
typename T>
327 static typename std::enable_if<
328 std::is_base_of<config_object, T>::value, YAML::Node>::type
330 return object.to_yaml();
337 template <
typename C,
typename T>
344 template <
typename Sequence>
345 static typename std::enable_if<
346 std::is_base_of<config_object, typename Sequence::value_type>::value,
350 for (
auto const& i : seq) {
359 template <
typename U,
typename V>
360 static YAML::Node
to_yaml(std::pair<U, V>
const&
object) {
362 doc[
"first"] =
object.first;
363 doc[
"second"] =
object.second;
369 #endif // jb_config_recurse_hpp static void validate(T const &, Args...)
Validate an arbitrary object.
static std::enable_if< std::is_base_of< config_object, typename Sequence::value_type >::value, void >::type validate(Sequence const &seq)
Partial specialization of validate() for anything looking like a sequence of jb::config_object.
static std::enable_if< std::is_base_of< config_object, T >::value, YAML::Node >::type to_yaml(T const &object)
Partial specialization of to_yaml() for jb::config_object and derived classes.
static void validate(std::pair< U, V > const &object)
Partial specialization of validate() for std::pair<>.
static std::enable_if< std::is_base_of< config_object, T >::value, void >::type apply_cmdline_values(T &rhs, boost::program_options::variables_map const &vm, std::string const &name)
Partial specialization for jb::config_object and derived classes.
static YAML::Node to_yaml(std::pair< U, V > const &object)
Partial specialization of to_yaml() for std::pair<>.
static std::enable_if< std::is_base_of< config_object, T >::value, void >::type add_options(boost::program_options::options_description &options, T const &object, std::string const &prefix, config_object::attribute_descriptor const &d)
Partial specialization for classes derived from jb::config_object.
std::map< std::string, YAML::Node > class_overrides
Store the overrides for each class.
static std::enable_if< std::is_base_of< config_object, typename Sequence::value_type >::value, void >::type add_options(boost::program_options::options_description &options, Sequence const &object, std::string const &prefix, config_object::attribute_descriptor const &d)
Partial specialization for anything looking like a sequence of jb::config_object. ...
static void apply_cmdline_values(std::pair< U, V > &rhs, boost::program_options::variables_map const &vm, std::string const &name)
Partial specialization for std::pair<>.
static std::enable_if< std::is_base_of< config_object, T >::value, void >::type apply_overrides(T &lhs, YAML::Node const &by_name, class_overrides const &by_class)
Partial specialization for classes derived from jb::config_object.
Helper class to easily define configuration attributes.
static YAML::Node to_yaml(T const &x, Args...)
Convert an arbitrary type to a YAML representation.
static std::enable_if< std::is_base_of< config_object, typename Sequence::value_type >::value, YAML::Node >::type to_yaml(Sequence const &seq)
Partial specialization of to_yaml() for anything looking like a sequence of jb::config_object.
Recursively apply functions to config_object, attributes, and sequences of config objects...
static void apply_cmdline_values(T &rhs, boost::program_options::variables_map const &vm, std::string const &name, Args...)
Get a value from the cmdline values and apply it to the object.
static std::enable_if< std::is_base_of< config_object, typename Sequence::value_type >::value, void >::type apply_overrides(Sequence &lhs, YAML::Node const &by_name, class_overrides const &by_class)
Partial specialization for anything looking like a sequence of jb::config_object. ...
static std::enable_if< std::is_base_of< config_object, T >::value, void >::type validate(T const &object)
Partial specialization of validate() for jb::config_object and derived classes.
static void add_options(boost::program_options::options_description &options, std::pair< U, V > const &object, std::string const &prefix, config_object::attribute_descriptor const &d)
Partial specialization for things that look like pairs.
static void apply_overrides(T &lhs, YAML::Node const &by_name, class_overrides const &by_class, Args...)
Override a value with the configuration contained in a YAML::Node.
attribute_descriptor & help(std::string const &h)
static void add_options(boost::program_options::options_description &options, T const &object, std::string const &prefix, config_object::attribute_descriptor const &d, Args...)
Implement the basic construct to create command-line options ased on a config_object.
static std::string cmdline_arg_name(std::string const &prefix, std::string const &name)
Compute the full name of a command-line argument, given its prefix and short name.
static std::enable_if< std::is_base_of< config_object, typename Sequence::value_type >::value, void >::type apply_cmdline_values(Sequence &rhs, boost::program_options::variables_map const &vm, std::string const &name)
Partial specialization for anything looking like a sequence of jb::config_object. ...
The top-level namespace for the JayBeams library.