70 static std::vector<T> ParseValue(std::string value)
72 std::vector<T> result;
73 size_t string_offset = 0;
75 while((comma = value.find(
',', string_offset)) != std::string::npos)
77 result.push_back(Linker::ParseValue<T>(value.substr(string_offset, comma - string_offset)));
78 string_offset = comma + 1;
80 result.push_back(Linker::ParseValue<T>(value.substr(string_offset)));
84 static std::string GetTypeName()
86 std::ostringstream oss;
115 std::map<std::string, std::string> * options;
118 std::string description;
120 Option(std::string name, std::string description)
121 : name(name), description(description)
125 virtual std::string type_name() = 0;
136 Option(std::string name, std::string description, T default_value = T())
137 :
Option<void>(name, description), default_value(default_value)
141 std::string type_name()
override
148 auto option_it = options->find(name);
149 if(option_it != options->end())
151 return ParseValue<T>(option_it->second);
155 return default_value;
184 Option(std::string name, std::string description)
189 std::string type_name()
override
194 std::vector<T> operator()()
196 auto option_it = options->find(name);
197 if(option_it == options->end())
199 return std::vector<T>();
202 return ParseValue<std::vector<T>>(option_it->second);
210 Option(std::string name, std::string description)
215 std::string type_name()
override
220 std::optional<T> operator()()
222 auto option = options->find(name);
223 if(option != options->end())
225 return ParseValue<T>(option->second);
229 return std::optional<T>();
237 std::vector<Option<void> *> option_list;
242 void InitializeFields()
246 template <
typename ... Args>
247 void InitializeFields(
Option<void>& option, Args ... args)
249 option_list.push_back(&option);
250 InitializeFields(args...);
254 void ConsiderOptions(std::map<std::string, std::string>& option_map)
256 for(
auto option : option_list)
258 option->options = &option_map;