Skip to content

Commit eed674f

Browse files
committed
update
1 parent 5515809 commit eed674f

4 files changed

Lines changed: 62 additions & 49 deletions

File tree

app/generation/cpp-x/generator.py

Lines changed: 19 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,26 @@ def _generate_impl(self, schema: dict) -> None:
2323
self.ensure_path_exists()
2424

2525
for encoded_type in schema['types']:
26-
document_name = self.make_document_name(encoded_type['name'])
26+
type_class_name = self.env.filters['fmt_class_type'](encoded_type['name'])
27+
type_class_h_file = self.env.filters['fmt_header_name'](type_class_name)
2728
if encoded_type['token'] == 'type':
2829
pass
2930
elif encoded_type['token'] == 'composite':
30-
print(f'generating composite type (to {document_name})')
31-
self.generate_document(document_name, 'composite.tmpl', type=encoded_type, schema=schema)
31+
print(f'Cenerating composite type {type_class_name} (to {type_class_h_file})')
32+
self.generate_document(type_class_h_file, 'composite.tmpl', type=encoded_type, schema=schema)
3233
elif encoded_type['token'] == 'enum':
33-
print(f'generating enum type (to {document_name})')
34-
self.generate_document(document_name, 'enum.tmpl', type=encoded_type, schema=schema)
34+
print(f'Cenerating enum type {type_class_name} (to {type_class_h_file})')
35+
self.generate_document(type_class_h_file, 'enum.tmpl', type=encoded_type, schema=schema)
3536
elif encoded_type['token'] == 'set':
36-
print(f'generating set type (to {document_name})')
37-
self.generate_document(document_name, 'set.tmpl', type=encoded_type, schema=schema)
37+
print(f'Cenerating set type {type_class_name} (to {type_class_h_file})')
38+
self.generate_document(type_class_h_file, 'set.tmpl', type=encoded_type, schema=schema)
3839

3940
for message in schema['messages']:
40-
document_name = self.make_document_name(message['name'])
41-
print(f'generating message (to {document_name})')
42-
self.generate_document(document_name, 'message.tmpl', message=message, schema=schema,
43-
includes=self.generate_includes_for_message(message, schema))
41+
message_class_name = self.env.filters['fmt_class_message'](message['name'])
42+
message_class_h_file = self.env.filters['fmt_header_name'](message_class_name)
43+
print(f'Generating message {message_class_name} (to {message_class_h_file})')
44+
self.generate_document(message_class_h_file, 'message.tmpl', message=message, schema=schema)
4445

45-
self.generate_document('schema.h', 'schema.tmpl', schema=schema, includes=self.generate_includes(schema))
4646
self.generate_document('common.h', 'common.tmpl', schema=schema)
4747

4848
def make_document_name(self, name: str) -> str:
@@ -55,39 +55,6 @@ def generate_document(self, document_name: str, template_name: str, **kwargs) ->
5555
with open(document_path, mode='w', encoding='utf8') as document:
5656
document.write(document_content)
5757

58-
def generate_includes_for_message(self, message: dict, schema: dict = None) -> list:
59-
includes = set()
60-
for field in message['fields']:
61-
if field['token'] == 'field':
62-
if field['type']['token'] in ('composite', 'enum', 'set'):
63-
includes.add(self.make_document_name(field['type']['name']))
64-
elif field['token'] == 'group':
65-
includes.add(self.make_document_name(field['dimension_type']['name']))
66-
# this func could be used for iterate over group fields
67-
includes = includes.union(self.generate_includes_for_message(field))
68-
elif field['token'] == 'data':
69-
includes.add(self.make_document_name(field['type']['name']))
70-
71-
if schema != None:
72-
includes.add(self.make_document_name(schema['header_type']['name']))
73-
74-
return list(includes)
75-
76-
def generate_includes_for_composite(self, composite: dict) -> list:
77-
includes = set()
78-
for field in composite['contained_types']:
79-
if field['token'] in ('composite', 'enum', 'set'):
80-
includes.add(self.make_document_name(field['name']))
81-
82-
return list(includes)
83-
84-
def generate_includes(self, schema: dict) -> list:
85-
includes = set()
86-
for message in schema['messages']:
87-
includes.add(self.make_document_name(message['name']))
88-
89-
return list(includes)
90-
9158
def ensure_path_exists(self) -> None:
9259
if not os.path.exists(self.path):
9360
os.makedirs(self.path)
@@ -102,7 +69,13 @@ def add_filters(self) -> None:
10269
self.env.filters['fmt_field_ref'] = lambda value: value[0].upper() + value[1:] + 'Ref'
10370
self.env.filters['lower_first'] = lambda value: value[0].lower() + value[1:]
10471
self.env.filters['upper_first'] = lambda value: value[0].upper() + value[1:]
105-
self.env.filters['document_name'] = lambda value: self.make_document_name(value)
72+
73+
self.env.filters['fmt_class_type'] = lambda s: s[0].upper() + s[1:]
74+
self.env.filters['fmt_class_ref'] = lambda s: s[0].upper() + s[1:] + 'Ref'
75+
self.env.filters['fmt_class_message'] = lambda s: s[0].upper() + s[1:]
76+
self.env.filters['fmt_class_group'] = lambda s: s[0].upper() + s[1:] + 'Group'
77+
self.env.filters['fmt_class_data'] = lambda s: s[0].upper() + s[1:] + 'Data'
78+
self.env.filters['fmt_header_name'] = lambda s: s + '.h'
10679

10780
@staticmethod
10881
def filter_replace_keyword(value: str) -> str:

app/generation/cpp-x/templates/common.tmpl

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,37 @@ constexpr void swapByteOrder(T& value) noexcept {
8989
template <typename... Ts>
9090
struct MP_List {};
9191

92+
template <std::size_t N>
93+
using MP_SizeT = std::integral_constant<std::size_t, N>;
94+
95+
namespace detail {
96+
97+
template <typename L>
98+
struct MP_SizeImpl;
99+
100+
template <template <typename...> typename L, typename... T>
101+
struct MP_SizeImpl<L<T...>> {
102+
using type = MP_SizeT<sizeof...(T)>;
103+
};
104+
105+
} // namespace detail
106+
107+
template <typename L>
108+
using MP_Size = typename detail::MP_SizeImpl<L>::type;
109+
110+
namespace detail {
111+
112+
template <typename L, typename I>
113+
struct MP_AtImpl;
114+
115+
template <template <typename...> typename L, typename... T, typename I>
116+
struct MP_AtImpl<L<T...>, I> {
117+
using type = typename std::tuple_element<I::value, std::tuple<T...>>::type;
118+
};
119+
120+
} // namespace detail
121+
122+
template <typename L, typename I>
123+
using MP_At = typename detail::MP_AtImpl<L, I>::type;
124+
92125
{% endblock %}

app/generation/cpp-x/templates/composite.tmpl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,14 @@ public:
103103

104104
using Fields = MP_List<
105105
{% for contained_type in type.contained_types %}
106-
MPField<"{{ contained_type.reference_name }}", {{ contained_type.reference_name | fmt_field_ref }}>,
106+
{{ contained_type.reference_name | fmt_field_ref }}{% if not loop.last %},{% endif +%}
107107
{% endfor %}
108108
>;
109+
110+
template<std::size_t N>
111+
constexpr auto field() noexcept -> MP_At<Fields, std::integral_constant<std::size_t, N>> {
112+
return MP_At<Fields, std::integral_constant<std::size_t, N>>{buffer_, actingVersion_};
113+
}
109114
};
110115

111116
{% endblock %}

app/generation/cpp-x/templates/generate.tmpl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
{% set schemaId = (messageHeader.contained_types | selectattr('name', 'equalto', 'schemaId') | first ) %}
55
{% set version = (messageHeader.contained_types | selectattr('name', 'equalto', 'version') | first ) %}
66

7+
{% set version_cpp_t = version.primitive_type.name | replace_keyword %}
8+
79
{# ------------------------------------ #}
810

911
{% macro enum(type) %}
@@ -112,11 +114,11 @@ struct {{ field_ref_class_name }} {
112114
{% if entry.presence == 'required' or entry.presence == 'optional' %}
113115
std::byte* buffer = nullptr;
114116

115-
constexpr {{ field_ref_class_name }}(std::byte* blockBuffer) noexcept
117+
constexpr {{ field_ref_class_name }}(std::byte* blockBuffer, [[maybe_unused]] {{ version_cpp_t }} version) noexcept
116118
: buffer{blockBuffer + {{ entry.offset }}}
117119
{}
118120
{% elif entry.presence == 'constant' %}
119-
constexpr {{ field_ref_class_name }}([[maybe_unused]] std::byte* blockBuffer) noexcept
121+
constexpr {{ field_ref_class_name }}([[maybe_unused]] std::byte* blockBuffer, [[maybe_unused]] {{ version_cpp_t }} version) noexcept
120122
{}
121123
{% endif %}
122124

0 commit comments

Comments
 (0)