config.hpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /**
  2. * @file
  3. * @author Caleb Fangmeier <caleb@fangmeier.tech>
  4. * @version 0.1
  5. *
  6. * @section LICENSE
  7. *
  8. *
  9. * MIT License
  10. *
  11. * Copyright (c) 2017 Caleb Fangmeier
  12. *
  13. * Permission is hereby granted, free of charge, to any person obtaining a copy
  14. * of this software and associated documentation files (the "Software"), to deal
  15. * in the Software without restriction, including without limitation the rights
  16. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  17. * copies of the Software, and to permit persons to whom the Software is
  18. * furnished to do so, subject to the following conditions:
  19. *
  20. * The above copyright notice and this permission notice shall be included in all
  21. * copies or substantial portions of the Software.
  22. *
  23. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  24. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  25. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  26. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  27. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  28. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  29. * SOFTWARE.
  30. *
  31. */
  32. #ifndef config_hpp
  33. #define config_hpp
  34. #include <string>
  35. #include <fstream>
  36. #include <sstream>
  37. #include "yaml-cpp/yaml.h"
  38. namespace fv_util {
  39. struct DataFileDescriptor{
  40. std::string filename;
  41. std::string label;
  42. std::string category;
  43. int file_number;
  44. int n_events;
  45. DataFileDescriptor():filename(""), label(""),category(""),file_number(-1), n_events(-1){ }
  46. DataFileDescriptor(const std::string filename, const std::string label, const std::string category, const int n_events)
  47. :filename(filename), label(label),category(category),file_number(-1), n_events(n_events) { }
  48. DataFileDescriptor(const std::string filename, const std::string label, const std::string category, const int file_number, const int n_events)
  49. :filename(filename), label(label),category(category),file_number(file_number), n_events(n_events) { }
  50. };
  51. }
  52. namespace YAML {
  53. template<>
  54. struct convert<fv_util::DataFileDescriptor> {
  55. static Node encode(const fv_util::DataFileDescriptor &rhs) {
  56. Node node;
  57. node["filename"] = rhs.filename;
  58. node["label"] = rhs.label;
  59. node["category"] = rhs.category;
  60. node["n_events"] = rhs.n_events;
  61. return node;
  62. }
  63. static bool decode(const Node &node, fv_util::DataFileDescriptor &rhs) {
  64. if (!node.IsMap()) {
  65. return false;
  66. }
  67. if (!node["filename"]) return false;
  68. rhs.filename = node["filename"].as<std::string>();
  69. if (node["label"]) rhs.label = node["label"].as<std::string>();
  70. if (node["category"]) rhs.category = node["category"].as<std::string>();
  71. if (node["n_events"]) rhs.n_events = node["n_events"].as<int>();
  72. return true;
  73. }
  74. };
  75. }
  76. namespace fv_util {
  77. class Config{
  78. private:
  79. std::string input_filename;
  80. YAML::Node root;
  81. public:
  82. Config ()
  83. :root(), input_filename("") { }
  84. Config (const Config& c)
  85. :root(c.root), input_filename(c.input_filename) { }
  86. Config (const std::string& input_filename)
  87. :root(YAML::LoadFile(input_filename)),
  88. input_filename(input_filename) { }
  89. template <typename KEY_TYPE>
  90. YAML::Node get(const KEY_TYPE& key) {
  91. auto val = root[key];
  92. return val;
  93. }
  94. std::string as_string() {
  95. std::stringstream config;
  96. std::ifstream s(input_filename);
  97. for (std::string line; std::getline(s, line);) {
  98. config << line << std::endl;
  99. }
  100. return config.str();
  101. }
  102. size_t get_max_events() {
  103. YAML::Node max_events = root["max-events"];
  104. if(!max_events) {
  105. return 0;
  106. }
  107. return max_events.as<size_t>();
  108. }
  109. bool get_debug() {
  110. YAML::Node debug_node = root["debug"];
  111. if(!debug_node) {
  112. return false;
  113. }
  114. return debug_node.as<bool>();
  115. }
  116. std::string get_output_filename() {
  117. YAML::Node output_file = root["output-file"];
  118. if(output_file) {
  119. return output_file.as<std::string>();
  120. } else {
  121. std::cout << "Must specify output-file in config file." << std::endl;
  122. return "";
  123. }
  124. }
  125. std::vector<DataFileDescriptor> get_source_files() {
  126. std::vector<DataFileDescriptor> source_files;
  127. std::string source_file_key = "source-files";
  128. if (root["source-file-key"]) {
  129. source_file_key = root["source-file-key"].as<std::string>();
  130. }
  131. YAML::Node source_files_nd = root[source_file_key];
  132. if(source_files_nd.IsSequence()) {
  133. for (const auto& f : source_files_nd) {
  134. source_files.push_back(f.as<DataFileDescriptor>());
  135. }
  136. } else {
  137. std::cout << "source-files missing or not a sequence" << std::endl;
  138. }
  139. return source_files;
  140. }
  141. };
  142. Config* the_config = nullptr;
  143. bool debug_on = false;
  144. void init_config(const std::string& input_filename){
  145. if(the_config) delete the_config;
  146. the_config = new Config(input_filename);
  147. debug_on = the_config->get_debug();
  148. }
  149. }
  150. #endif // config_hpp