vconfig::child_list vconfig::get_children(const std::string& key) const { vconfig::child_list res; BOOST_FOREACH(const config::any_child &child, cfg_->all_children_range()) { if (child.key == key) { res.push_back(vconfig(child.cfg, cache_)); } else if (child.key == "insert_tag") { vconfig insert_cfg(child.cfg); if(insert_cfg["name"] == key) { variable_info vinfo(insert_cfg["variable"], false, variable_info::TYPE_CONTAINER); if(!vinfo.is_valid) { //push back an empty tag res.push_back(empty_vconfig()); } else if(vinfo.explicit_index) { res.push_back(vconfig(vinfo.as_container(), true)); } else { variable_info::array_range range = vinfo.as_array(); if(range.first == range.second) { //push back an empty tag res.push_back(empty_vconfig()); } while(range.first != range.second) { res.push_back(vconfig(*range.first++, true)); } } } } } return res; }
vconfig::child_list vconfig::get_children(const std::string& key) const { vconfig::child_list res; for (const config::any_child &child : cfg_->all_children_range()) { if (child.key == key) { res.push_back(vconfig(child.cfg, cache_)); } else if (child.key == "insert_tag") { vconfig insert_cfg(child.cfg); if(insert_cfg["name"] == key) { try { config::const_child_itors range = as_nonempty_range(insert_cfg["variable"]); for (const config& child : range) { res.push_back(vconfig(child, true)); } } catch(const invalid_variablename_exception&) { res.push_back(empty_vconfig()); } } } } return res; }
vconfig vconfig::all_children_iterator::get_child() const { if (inner_index_ >= 0 && i_->key == "insert_tag") { variable_info vinfo(vconfig(i_->cfg)["variable"], false, variable_info::TYPE_CONTAINER); if(!vinfo.is_valid) { return empty_vconfig(); } else if(inner_index_ == 0) { return vconfig(vinfo.as_container(), true); } variable_info::array_range r = vinfo.as_array(); std::advance(r.first, inner_index_); return vconfig(*r.first, true); } return vconfig(i_->cfg, cache_); }
/** * Returns a child of *this whose key is @a key. * If no such child exists, returns an unconstructed vconfig (use null() to test * for this). */ vconfig vconfig::child(const std::string& key) const { if (const config &natural = cfg_->child(key)) { return vconfig(natural, cache_); } BOOST_FOREACH(const config &ins, cfg_->child_range("insert_tag")) { vconfig insert_cfg(ins); if(insert_cfg["name"] == key) { variable_info vinfo(insert_cfg["variable"], false, variable_info::TYPE_CONTAINER); if(!vinfo.is_valid) { return empty_vconfig(); } return vconfig(vinfo.as_container(), true); } } return unconstructed_vconfig(); }
vconfig vconfig::all_children_iterator::get_child() const { if (inner_index_ >= 0 && i_->key == "insert_tag") { try { config::const_child_itors range = as_nonempty_range(vconfig(i_->cfg)["variable"]); std::advance(range.first, inner_index_); return vconfig(*range.first, true); } catch(const invalid_variablename_exception&) { return empty_vconfig(); } } return vconfig(i_->cfg, cache_); }
/** * Returns a child of *this whose key is @a key. * If no such child exists, returns an unconstructed vconfig (use null() to test * for this). */ vconfig vconfig::child(const std::string& key) const { if (const config &natural = cfg_->child(key)) { return vconfig(natural, cache_); } for (const config &ins : cfg_->child_range("insert_tag")) { vconfig insert_cfg(ins); if(insert_cfg["name"] == key) { try { config::const_child_itors range = as_nonempty_range(insert_cfg["variable"]); return vconfig(*range.first, true); } catch(const invalid_variablename_exception&) { return empty_vconfig(); } } } return unconstructed_vconfig(); }