ICG 2
Electric Boogaloo
ICG_io_src_templates.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <map>
4 #include <string>
5 
6 std::string io_src = std::string(R"(
7 #include <stddef.h>
8 #include <stdlib.h>
9 #include <iostream>
10 #include "DataTypeInator.hpp"
11 #include "Type/SpecifiedCompositeType.hpp"
12 #include "Type/SpecifiedSequenceDataType.hpp"
13 
14 #include "{{filename}}"
15 
16 {{list_classes_class_type_decl}}
17 
18 void populate_type_dictionary(DataTypeInator * dataTypeInator) {
19  //
20  // Register class types
21  //
22  {{list_classes_call_class_decl}}
23 
24  //
25  // Register STL types
26  //
27  {{list_stls_stl_decl}}
28 
29  //
30  // Register typedef statements
31  //
32  {{list_typedefs_typedef_decl}}
33 
34  //
35  // Validate!
36  //
37  dataTypeInator->validateDictionary();
38 }
39 )");
40 
41 std::string call_class_decl = std::string(R"(dataTypeInator->addToDictionary("{{ClassName}}", new SpecifiedCompositeType<{{ClassName}}>);
42 )");
43 
44 std::string class_type_decl = std::string(R"(
45 //
46 // ICG generated definition of the DataType for {{ClassName}}
47 //
48 template <>
49 class SpecifiedCompositeType<{{ClassName}}> : public CompositeDataType {
50 
51  public:
52  SpecifiedCompositeType() : CompositeDataType("{{ClassName}}", sizeof({{ClassName}}), &construct_composite<{{ClassName}}>, &destruct_composite<{{ClassName}}>) {}
53 
54  template<typename Derived>
55  static MemberMap applyMembersToDerived () {
56  using type_to_add = {{ClassName}};
57 
58  MemberMap derived_member_map = {
59  {{list_fields_derived_field_decl}}
60  };
61 
62  {{list_bases_add_base_members_to_derived}}
63 
64  return derived_member_map;
65  }
66 
67  MemberMap& getMemberMap () {
68  using type_to_add = {{ClassName}};
69 
70  static bool initialized = false;
71  static MemberMap member_map = {
72  {{list_fields_field_decl}}
73  };
74 
75  if (!initialized) {
76  {{list_bases_add_base_members_to_self}}
77 
78  initialized = true;
79  }
80 
81  return member_map;
82  }
83 
84  const MemberMap& getMemberMap () const override {
85  return (const_cast<SpecifiedCompositeType<{{ClassName}}>*> (this))->getMemberMap();
86  }
87 };
88 )");
89 
90 
91 std::string derived_field_decl = std::string (R"({"{{FieldName}}", StructMember("{{FieldName}}", "{{FieldType}}", offsetof(Derived, type_to_add::{{FieldName}}))},
92 )");
93 
94 std::string field_decl = std::string(R"({"{{FieldName}}", StructMember("{{FieldName}}", "{{FieldType}}", offsetof(type_to_add, {{FieldName}}))},
95 )");
96 
97 std::string stl_decl = std::string(R"(dataTypeInator->addToDictionary("{{STLName}}", new SpecifiedSequenceDataType<{{STLName}}>("{{STLName}}"));
98 )");
99 
100 std::string typedef_decl = std::string(R"(dataTypeInator->addTypeDef("{{ExistingName}}", "{{AliasName}}");
101 )");
102 
103 std::string add_base_members_to_self = std::string(R"(
104 auto derived_members = SpecifiedCompositeType<{{BaseClassName}}>::applyMembersToDerived<{{ClassName}}>();
105 member_map.insert(derived_members.begin(), derived_members.end());
106 )");
107 
108 std::string add_base_members_to_derived = std::string(R"(
109 auto derived_members = SpecifiedCompositeType<{{BaseClassName}}>::applyMembersToDerived<Derived>();
110 derived_member_map.insert(derived_members.begin(), derived_members.end());
111 )");
112 
113 std::map<std::string, std::string> template_dictionary {
114  {"top", io_src},
115  {"call_class_decl", call_class_decl},
116  {"class_type_decl", class_type_decl},
117  {"field_decl", field_decl},
118  {"derived_field_decl", derived_field_decl},
119  {"add_base_members_to_self", add_base_members_to_self},
120  {"add_base_members_to_derived", add_base_members_to_derived},
121  {"stl_decl", stl_decl},
122  {"typedef_decl", typedef_decl}
123 };
std::string derived_field_decl
Definition: ICG_io_src_templates.hpp:91
std::string stl_decl
Definition: ICG_io_src_templates.hpp:97
std::map< std::string, std::string > template_dictionary
Definition: ICG_io_src_templates.hpp:113
std::string class_type_decl
Definition: ICG_io_src_templates.hpp:44
std::string add_base_members_to_self
Definition: ICG_io_src_templates.hpp:103
std::string call_class_decl
Definition: ICG_io_src_templates.hpp:41
std::string io_src
Definition: ICG_io_src_templates.hpp:6
std::string typedef_decl
Definition: ICG_io_src_templates.hpp:100
std::string field_decl
Definition: ICG_io_src_templates.hpp:94
std::string add_base_members_to_derived
Definition: ICG_io_src_templates.hpp:108