+ template<typename T>
+ struct data_reader2 {
+ static T read_parameter(const int index, const std::string &type,
+ const std::string &subsection_name,
+ const std::string ¶meter_name)
+ {
+ return conf[test_type][index][type][subsection_name][parameter_name];
+ }
+ };
+
+ template<typename T>
+ struct data_reader2<std::vector<T>> {
+ static std::vector<T> read_parameter(const int index, const std::string &type,
+ const std::string &subsection_name,
+ const std::string ¶meter_name)
+ {
+ auto array_size = conf[test_type][index][type][subsection_name][parameter_name].size();
+
+ std::vector<T> result(array_size);
+
+ for(unsigned number = 0; number < array_size; number++)
+ result.at(number) = conf[test_type][index][type][subsection_name][parameter_name][number];
+
+ return result;
+ }
+ };
+
+ template<typename T>
+ struct data_reader2<T*> {
+ static T* read_parameter(const int index, const std::string &type,
+ const std::string &subsection_name,
+ const std::string ¶meter_name)
+ {
+ return (T*) read_data_to_aligned_array(conf[test_type][index][type][subsection_name][parameter_name]);
+ }
+ };
+ template <typename T>
+ T get_parameter(const std::string &type, const std::string &subsection_name, const std::string ¶meter_name)
+ {
+ return data_reader2<T>::read_parameter(GetParam(), type, subsection_name, parameter_name);
+ }
+
+ template<typename T>
+ struct data_reader3 {
+ static T read_parameter(const int index, const std::string &type,
+ const std::string &subsection_name,
+ const int subindex,
+ const std::string ¶meter_name)
+ {
+ return conf[test_type][index][type][subsection_name][subindex][parameter_name];
+ }
+ };
+
+ template<typename T>
+ struct data_reader3<std::vector<T>> {
+ static std::vector<T> read_parameter(const int index, const std::string &type,
+ const std::string &subsection_name,
+ const int subindex,
+ const std::string ¶meter_name)
+ {
+ auto array_size = conf[test_type][index][type][subsection_name][subindex][parameter_name].size();
+
+ std::vector<T> result(array_size);
+
+ for(unsigned number = 0; number < array_size; number++)
+ result.at(number) = conf[test_type][index][type][subsection_name][subindex][parameter_name][number];
+
+ return result;
+ }
+ };
+
+ template<typename T>
+ struct data_reader3<T*> {
+ static T* read_parameter(const int index, const std::string &type,
+ const std::string &subsection_name,
+ const int subindex,
+ const std::string ¶meter_name)
+ {
+ return (T*) read_data_to_aligned_array(conf[test_type][index][type][subsection_name][subindex][parameter_name]);
+ }
+ };
+ template <typename T>
+ T get_parameter(const std::string &type, const std::string &subsection_name, const int subindex, const std::string ¶meter_name)
+ {
+ return data_reader3<T>::read_parameter(GetParam(), type, subsection_name, subindex, parameter_name);
+ }
+