1 #include "section_schema.h" 2 #include "string_utils.h" 7 : name_(source.name_), requirement_(source.requirement_), comment_(source.comment_)
10 options_.reserve(source.options_.size());
11 for (
auto &opt : source.options_) {
12 options_.push_back(std::make_shared<option_schema>(*opt));
16 for (
auto &opt : options_) {
17 options_map_.insert(opt_schema_map_pair(opt->get_name(), opt));
23 if (
this != &source) {
25 std::swap(*
this, new_src);
33 *
this = std::move(source);
38 if (
this != &source) {
39 name_ = std::move(source.name_);
40 requirement_ = std::move(source.requirement_);
41 comment_ = std::move(source.comment_);
42 options_ = std::move(source.options_);
43 options_map_ = std::move(source.options_map_);
50 : name_(arguments.name), requirement_(arguments.requirement), comment_(arguments.comment)
66 return (requirement_ == item_requirement::mandatory ?
true :
false);
71 auto add_it = options_map_.find(opt.
get_name());
72 if (add_it == options_map_.end()) {
73 std::shared_ptr<option_schema> add = std::make_shared<option_schema>(opt);
74 options_.push_back(add);
75 options_map_.insert(opt_schema_map_pair(add->get_name(), add));
83 auto del_it = options_map_.find(option_name);
84 if (del_it != options_map_.end()) {
86 options_map_.erase(del_it);
88 options_.erase(std::remove_if(options_.begin(),
90 [&](std::shared_ptr<option_schema> opt) {
91 return (opt->get_name() == option_name ?
true :
false);
101 return options_.size();
106 if (index >=
size()) {
110 return *options_[index];
115 if (index >=
size()) {
119 return *options_[index];
131 std::shared_ptr<option_schema> result;
133 result = options_map_.at(option_name);
134 }
catch (std::out_of_range) {
143 options_map_.at(option_name);
145 }
catch (std::out_of_range) {
161 for (
auto &opt : options_) {
166 opt->validate_option(sect[opt->get_name()]);
167 }
else if (opt->is_mandatory()) {
170 "Mandatory option '" + opt->get_name() +
"' is missing in section '" + sect.
get_name() +
"'");
174 sect.
add_option(opt->get_name(), opt->get_default_value());
176 opt->validate_option(sect[opt->get_name()]);
181 for (
auto &opt : sect) {
190 if (mode == schema_mode::strict) {
200 for (
auto &comment_line : comment_lines) {
201 os <<
";" << comment_line << std::endl;
205 std::string info_line =
is_mandatory() ?
"mandatory" :
"optional";
206 os <<
";<" << info_line <<
">" << std::endl;
213 os <<
"[" <<
get_name() <<
"]" << std::endl;
226 for (
auto &opt : sect_schema.options_) {
bool contains(const std::string &option_name) const
void remove_option(const std::string &name)
std::ostream & write_additional_info(std::ostream &os) const
option_schema & operator[](size_t index)
const std::string & get_name() const
INICPP_API friend std::ostream & operator<<(std::ostream &os, const section_schema §_schema)
std::ostream & write_section_name(std::ostream &os) const
void add_option(const std::string &option_name, ValueType value)
const std::string & get_comment() const
void validate_section(section §, schema_mode mode) const
bool contains(const std::string &option_name) const
section_schema & operator=(const section_schema &source)
std::vector< std::string > split(const std::string &str, char delim)
bool is_mandatory() const
const std::string & get_name() const
void add_option(const option_schema &opt)
const std::string & get_name() const