Line data Source code
1 : //
2 : // DUNE DAQ modification notice:
3 : // This file has been modified from the original ATLAS genconfig source for the DUNE DAQ project.
4 : // Fork baseline commit: genconfig-03-10-00 (2021-04-26).
5 : // Renamed since fork: yes (from src/class_info.h to apps/class_info.hpp).
6 : //
7 :
8 : #ifndef __OKSDALGEN_CLASS_INFO__
9 : #define __OKSDALGEN_CLASS_INFO__
10 :
11 : #include "oks/class.hpp"
12 :
13 : #include <map>
14 : #include <ostream>
15 : #include <set>
16 : #include <string>
17 :
18 : namespace dunedaq {
19 : namespace oksdalgen {
20 :
21 : class ClassInfo {
22 :
23 : public:
24 :
25 : struct SortByName {
26 0 : bool operator() (const oks::OksClass * c1, const oks::OksClass * c2) const {
27 0 : return c1->get_name() < c2->get_name();
28 : }
29 : };
30 :
31 : typedef std::map<const oks::OksClass *, ClassInfo, SortByName> Map;
32 :
33 0 : ClassInfo() {};
34 :
35 0 : ClassInfo(const std::string& cpp_ns_name, const std::string& dir_prefix) :
36 0 : p_namespace (cpp_ns_name), p_include_prefix (dir_prefix) {};
37 :
38 0 : const std::string& get_namespace() const {return p_namespace;}
39 0 : const std::string& get_include_prefix() const {return p_include_prefix;}
40 :
41 :
42 : private:
43 :
44 : std::string p_namespace;
45 : std::string p_include_prefix;
46 :
47 : };
48 :
49 : struct NameSpaceInfo
50 : {
51 : std::set<std::string> m_classes;
52 : std::map<std::string, NameSpaceInfo> m_nested;
53 :
54 : bool
55 0 : empty() const
56 : {
57 0 : return (m_classes.empty() && m_nested.empty());
58 : }
59 :
60 : void
61 0 : add(const std::string &ns_name, const std::string &class_name)
62 : {
63 0 : if (!ns_name.empty())
64 : {
65 0 : std::string::size_type idx = ns_name.find_first_of(':');
66 0 : NameSpaceInfo &ns = m_nested[ns_name.substr(0, idx)];
67 0 : if (idx != std::string::npos)
68 0 : ns.add(ns_name.substr(ns_name.find_first_not_of(':', idx)), class_name);
69 : else
70 0 : ns.add("", class_name);
71 : }
72 : else
73 0 : m_classes.insert(class_name);
74 0 : }
75 :
76 : void
77 0 : print(std::ostream &s, int level) const
78 : {
79 0 : std::string dx(level * 2, ' ');
80 :
81 0 : for (const auto &x : m_nested)
82 : {
83 0 : s << dx << "namespace " << x.first << " {\n";
84 0 : x.second.print(s, level + 1);
85 0 : s << dx << "}\n";
86 : }
87 :
88 0 : for (const auto &x : m_classes)
89 0 : s << dx << "class " << x << ";\n";
90 0 : }
91 : };
92 :
93 : } // namespace oksdalgen
94 : } // namespace dunedaq
95 : #endif
|