Skip to content

Commit 442e850

Browse files
committed
Codegen: implement set in cppgen
1 parent eef140c commit 442e850

File tree

4 files changed

+60
-57
lines changed

4 files changed

+60
-57
lines changed

misc/codegen/generators/cppgen.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ def _get_field(cls: schema.Class, p: schema.Property, add_or_none_except: typing
4949
is_optional=p.is_optional,
5050
is_repeated=p.is_repeated,
5151
is_predicate=p.is_predicate,
52+
is_unordered=p.is_unordered,
5253
trap_name=trap_name,
5354
)
5455
args.update(cpp.get_field_override(p.name))

misc/codegen/lib/cpp.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class Field:
3636
base_type: str
3737
is_optional: bool = False
3838
is_repeated: bool = False
39+
is_unordered: bool = False
3940
is_predicate: bool = False
4041
trap_name: str = None
4142
first: bool = False

misc/codegen/templates/cpp_classes_cpp.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ void {{name}}::emit({{^final}}TrapLabel<{{name}}Tag> id, {{/final}}std::ostream&
2424
{{#is_repeated}}
2525
for (auto i = 0u; i < {{field_name}}.size(); ++i) {
2626
{{^is_optional}}
27-
out << {{trap_name}}Trap{id, i, {{field_name}}[i]} << '\n';
27+
out << {{trap_name}}Trap{id, {{^is_unordered}}i, {{/is_unordered}}{{field_name}}[i]} << '\n';
2828
{{/is_optional}}
2929
{{#is_optional}}
3030
if ({{field_name}}[i]) out << {{trap_name}}Trap{id, i, *{{field_name}}[i]} << '\n';

misc/codegen/test/test_cppgen.py

Lines changed: 57 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ def test_empty_class(generate):
4141
assert generate([
4242
schema.Class(name="MyClass"),
4343
]) == [
44-
cpp.Class(name="MyClass", final=True, trap_name="MyClasses")
45-
]
44+
cpp.Class(name="MyClass", final=True, trap_name="MyClasses")
45+
]
4646

4747

4848
def test_two_class_hierarchy(generate):
@@ -51,9 +51,9 @@ def test_two_class_hierarchy(generate):
5151
schema.Class(name="A", derived={"B"}),
5252
schema.Class(name="B", bases=["A"]),
5353
]) == [
54-
base,
55-
cpp.Class(name="B", bases=[base], final=True, trap_name="Bs"),
56-
]
54+
base,
55+
cpp.Class(name="B", bases=[base], final=True, trap_name="Bs"),
56+
]
5757

5858

5959
@pytest.mark.parametrize("type,expected", [
@@ -62,22 +62,23 @@ def test_two_class_hierarchy(generate):
6262
("boolean", "bool"),
6363
("MyClass", "TrapLabel<MyClassTag>"),
6464
])
65-
@pytest.mark.parametrize("property_cls,optional,repeated,trap_name", [
66-
(schema.SingleProperty, False, False, None),
67-
(schema.OptionalProperty, True, False, "MyClassProps"),
68-
(schema.RepeatedProperty, False, True, "MyClassProps"),
69-
(schema.RepeatedOptionalProperty, True, True, "MyClassProps"),
65+
@pytest.mark.parametrize("property_cls,optional,repeated,unordered,trap_name", [
66+
(schema.SingleProperty, False, False, False, None),
67+
(schema.OptionalProperty, True, False, False, "MyClassProps"),
68+
(schema.RepeatedProperty, False, True, False, "MyClassProps"),
69+
(schema.RepeatedOptionalProperty, True, True, False, "MyClassProps"),
70+
(schema.RepeatedUnorderedProperty, False, True, True, "MyClassProps"),
7071
])
71-
def test_class_with_field(generate, type, expected, property_cls, optional, repeated, trap_name):
72+
def test_class_with_field(generate, type, expected, property_cls, optional, repeated, unordered, trap_name):
7273
assert generate([
7374
schema.Class(name="MyClass", properties=[property_cls("prop", type)]),
7475
]) == [
75-
cpp.Class(name="MyClass",
76-
fields=[cpp.Field("prop", expected, is_optional=optional,
77-
is_repeated=repeated, trap_name=trap_name)],
78-
trap_name="MyClasses",
79-
final=True)
80-
]
76+
cpp.Class(name="MyClass",
77+
fields=[cpp.Field("prop", expected, is_optional=optional,
78+
is_repeated=repeated, is_unordered=unordered, trap_name=trap_name)],
79+
trap_name="MyClasses",
80+
final=True)
81+
]
8182

8283

8384
def test_class_field_with_null(generate, input):
@@ -90,26 +91,26 @@ def test_class_field_with_null(generate, input):
9091
schema.SingleProperty("y", "B"),
9192
])
9293
]) == [
93-
a,
94-
cpp.Class(name="B", bases=[a], final=True, trap_name="Bs",
95-
fields=[
96-
cpp.Field("x", "TrapLabel<ATag>"),
97-
cpp.Field("y", "TrapLabel<BOrNoneTag>"),
98-
]),
99-
]
94+
a,
95+
cpp.Class(name="B", bases=[a], final=True, trap_name="Bs",
96+
fields=[
97+
cpp.Field("x", "TrapLabel<ATag>"),
98+
cpp.Field("y", "TrapLabel<BOrNoneTag>"),
99+
]),
100+
]
100101

101102

102103
def test_class_with_predicate(generate):
103104
assert generate([
104105
schema.Class(name="MyClass", properties=[
105106
schema.PredicateProperty("prop")]),
106107
]) == [
107-
cpp.Class(name="MyClass",
108-
fields=[
109-
cpp.Field("prop", "bool", trap_name="MyClassProp", is_predicate=True)],
110-
trap_name="MyClasses",
111-
final=True)
112-
]
108+
cpp.Class(name="MyClass",
109+
fields=[
110+
cpp.Field("prop", "bool", trap_name="MyClassProp", is_predicate=True)],
111+
trap_name="MyClasses",
112+
final=True)
113+
]
113114

114115

115116
@pytest.mark.parametrize("name",
@@ -119,23 +120,23 @@ def test_class_with_overridden_unsigned_field(generate, name):
119120
schema.Class(name="MyClass", properties=[
120121
schema.SingleProperty(name, "bar")]),
121122
]) == [
122-
cpp.Class(name="MyClass",
123-
fields=[cpp.Field(name, "unsigned")],
124-
trap_name="MyClasses",
125-
final=True)
126-
]
123+
cpp.Class(name="MyClass",
124+
fields=[cpp.Field(name, "unsigned")],
125+
trap_name="MyClasses",
126+
final=True)
127+
]
127128

128129

129130
def test_class_with_overridden_underscore_field(generate):
130131
assert generate([
131132
schema.Class(name="MyClass", properties=[
132133
schema.SingleProperty("something_", "bar")]),
133134
]) == [
134-
cpp.Class(name="MyClass",
135-
fields=[cpp.Field("something", "bar")],
136-
trap_name="MyClasses",
137-
final=True)
138-
]
135+
cpp.Class(name="MyClass",
136+
fields=[cpp.Field("something", "bar")],
137+
trap_name="MyClasses",
138+
final=True)
139+
]
139140

140141

141142
@pytest.mark.parametrize("name", cpp.cpp_keywords)
@@ -144,11 +145,11 @@ def test_class_with_keyword_field(generate, name):
144145
schema.Class(name="MyClass", properties=[
145146
schema.SingleProperty(name, "bar")]),
146147
]) == [
147-
cpp.Class(name="MyClass",
148-
fields=[cpp.Field(name + "_", "bar")],
149-
trap_name="MyClasses",
150-
final=True)
151-
]
148+
cpp.Class(name="MyClass",
149+
fields=[cpp.Field(name + "_", "bar")],
150+
trap_name="MyClasses",
151+
final=True)
152+
]
152153

153154

154155
def test_classes_with_dirs(generate_grouped):
@@ -160,11 +161,11 @@ def test_classes_with_dirs(generate_grouped):
160161
schema.Class(name="C", bases=["CBase"], group="bar"),
161162
schema.Class(name="D", group="foo/bar/baz"),
162163
]) == {
163-
".": [cpp.Class(name="A", trap_name="As", final=True)],
164-
"foo": [cpp.Class(name="B", trap_name="Bs", final=True)],
165-
"bar": [cbase, cpp.Class(name="C", bases=[cbase], trap_name="Cs", final=True)],
166-
"foo/bar/baz": [cpp.Class(name="D", trap_name="Ds", final=True)],
167-
}
164+
".": [cpp.Class(name="A", trap_name="As", final=True)],
165+
"foo": [cpp.Class(name="B", trap_name="Bs", final=True)],
166+
"bar": [cbase, cpp.Class(name="C", bases=[cbase], trap_name="Cs", final=True)],
167+
"foo/bar/baz": [cpp.Class(name="D", trap_name="Ds", final=True)],
168+
}
168169

169170

170171
def test_cpp_skip_pragma(generate):
@@ -174,10 +175,10 @@ def test_cpp_skip_pragma(generate):
174175
schema.SingleProperty("y", "bar", pragmas=["x", "cpp_skip", "y"]),
175176
])
176177
]) == [
177-
cpp.Class(name="A", final=True, trap_name="As", fields=[
178-
cpp.Field("x", "foo"),
179-
]),
180-
]
178+
cpp.Class(name="A", final=True, trap_name="As", fields=[
179+
cpp.Field("x", "foo"),
180+
]),
181+
]
181182

182183

183184
def test_ipa_classes_ignored(generate):
@@ -198,8 +199,8 @@ def test_ipa_classes_ignored(generate):
198199
name="Z",
199200
),
200201
]) == [
201-
cpp.Class(name="Z", final=True, trap_name="Zs"),
202-
]
202+
cpp.Class(name="Z", final=True, trap_name="Zs"),
203+
]
203204

204205

205206
if __name__ == '__main__':

0 commit comments

Comments
 (0)