Skip to content

Commit 62ef6fe

Browse files
SGSSGenemr-c
andauthored
cppgen: improved support of fields of type 'any' (#893)
Currently, types of 'any' are simply ignored when generating output. This improves the handling of 'any' by adding explicit conversions to: - float - double - char - int8_t - uint8_t - int16_t - uint16_t - int32_t - uint32_t - int64_t - uint64_t and - std::string required to fix deNBI-cibi/tool_description_lib#59 --------- Co-authored-by: Michael R. Crusoe <[email protected]>
1 parent 7e6d44d commit 62ef6fe

File tree

7 files changed

+239
-108
lines changed

7 files changed

+239
-108
lines changed

Makefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,11 @@ flake8: FORCE
228228
schema_salad/metaschema.py: schema_salad/codegen_base.py schema_salad/python_codegen_support.py schema_salad/python_codegen.py schema_salad/metaschema/*.yml
229229
schema-salad-tool --codegen python schema_salad/metaschema/metaschema.yml > $@
230230

231+
vpath %.yml schema_salad/tests/cpp_tests
232+
233+
schema_salad/tests/cpp_tests/%.h: %.yml
234+
schema-salad-tool --codegen cpp --codegen-target $@ $<
235+
231236
FORCE:
232237

233238
# Use this to print the value of a Makefile variable

schema_salad/cpp_codegen.py

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -700,31 +700,52 @@ def epilogue(self, root_loader: Optional[TypeDef]) -> None:
700700
}
701701
702702
// declaring toYaml
703-
inline auto toYaml(bool v) {
704-
return YAML::Node{v};
705-
}
706-
inline auto toYaml(float v) {
707-
return YAML::Node{v};
708-
}
709-
inline auto toYaml(double v) {
710-
return YAML::Node{v};
711-
}
712-
inline auto toYaml(int32_t v) {
713-
return YAML::Node{v};
714-
}
715-
inline auto toYaml(int64_t v) {
716-
return YAML::Node{v};
717-
}
718-
inline auto toYaml(std::any const&) {
719-
return YAML::Node{};
720-
}
703+
inline auto toYaml(bool v) { return YAML::Node{v}; }
704+
inline auto toYaml(float v) { return YAML::Node{v}; }
705+
inline auto toYaml(double v) { return YAML::Node{v}; }
706+
inline auto toYaml(char v) { return YAML::Node{v}; }
707+
inline auto toYaml(int8_t v) { return YAML::Node{v}; }
708+
inline auto toYaml(uint8_t v) { return YAML::Node{v}; }
709+
inline auto toYaml(int16_t v) { return YAML::Node{v}; }
710+
inline auto toYaml(uint16_t v) { return YAML::Node{v}; }
711+
inline auto toYaml(int32_t v) { return YAML::Node{v}; }
712+
inline auto toYaml(uint32_t v) { return YAML::Node{v}; }
713+
inline auto toYaml(int64_t v) { return YAML::Node{v}; }
714+
inline auto toYaml(uint64_t v) { return YAML::Node{v}; }
721715
inline auto toYaml(std::monostate const&) {
722716
return YAML::Node(YAML::NodeType::Undefined);
723717
}
724718
inline auto toYaml(std::string const& v) {
725719
return YAML::Node{v};
726720
}
727721
722+
template <typename T, typename ...Args>
723+
auto anyToYaml_impl(std::any const& a) {
724+
if (auto v = std::any_cast<T const>(&a)) {
725+
return toYaml(*v);
726+
}
727+
if constexpr (sizeof...(Args) > 0) {
728+
return anyToYaml_impl<Args...>(a);
729+
}
730+
return toYaml(std::monostate{});
731+
}
732+
733+
inline auto toYaml(std::any const& a) {
734+
return anyToYaml_impl<bool,
735+
float,
736+
double,
737+
char,
738+
int8_t,
739+
uint8_t,
740+
int16_t,
741+
uint16_t,
742+
int32_t,
743+
uint32_t,
744+
int64_t,
745+
uint64_t,
746+
std::string>(a);
747+
}
748+
728749
// declaring fromYaml
729750
inline void fromYaml(YAML::Node const& n, bool& v) {
730751
v = n.as<bool>();

schema_salad/tests/cpp_tests/01_single_record.h

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,31 +25,52 @@ inline auto mergeYaml(YAML::Node n1, YAML::Node n2) {
2525
}
2626

2727
// declaring toYaml
28-
inline auto toYaml(bool v) {
29-
return YAML::Node{v};
30-
}
31-
inline auto toYaml(float v) {
32-
return YAML::Node{v};
33-
}
34-
inline auto toYaml(double v) {
35-
return YAML::Node{v};
36-
}
37-
inline auto toYaml(int32_t v) {
38-
return YAML::Node{v};
39-
}
40-
inline auto toYaml(int64_t v) {
41-
return YAML::Node{v};
42-
}
43-
inline auto toYaml(std::any const&) {
44-
return YAML::Node{};
45-
}
28+
inline auto toYaml(bool v) { return YAML::Node{v}; }
29+
inline auto toYaml(float v) { return YAML::Node{v}; }
30+
inline auto toYaml(double v) { return YAML::Node{v}; }
31+
inline auto toYaml(char v) { return YAML::Node{v}; }
32+
inline auto toYaml(int8_t v) { return YAML::Node{v}; }
33+
inline auto toYaml(uint8_t v) { return YAML::Node{v}; }
34+
inline auto toYaml(int16_t v) { return YAML::Node{v}; }
35+
inline auto toYaml(uint16_t v) { return YAML::Node{v}; }
36+
inline auto toYaml(int32_t v) { return YAML::Node{v}; }
37+
inline auto toYaml(uint32_t v) { return YAML::Node{v}; }
38+
inline auto toYaml(int64_t v) { return YAML::Node{v}; }
39+
inline auto toYaml(uint64_t v) { return YAML::Node{v}; }
4640
inline auto toYaml(std::monostate const&) {
4741
return YAML::Node(YAML::NodeType::Undefined);
4842
}
4943
inline auto toYaml(std::string const& v) {
5044
return YAML::Node{v};
5145
}
5246

47+
template <typename T, typename ...Args>
48+
auto anyToYaml_impl(std::any const& a) {
49+
if (auto v = std::any_cast<T const>(&a)) {
50+
return toYaml(*v);
51+
}
52+
if constexpr (sizeof...(Args) > 0) {
53+
return anyToYaml_impl<Args...>(a);
54+
}
55+
return toYaml(std::monostate{});
56+
}
57+
58+
inline auto toYaml(std::any const& a) {
59+
return anyToYaml_impl<bool,
60+
float,
61+
double,
62+
char,
63+
int8_t,
64+
uint8_t,
65+
int16_t,
66+
uint16_t,
67+
int32_t,
68+
uint32_t,
69+
int64_t,
70+
uint64_t,
71+
std::string>(a);
72+
}
73+
5374
// declaring fromYaml
5475
inline void fromYaml(YAML::Node const& n, bool& v) {
5576
v = n.as<bool>();

schema_salad/tests/cpp_tests/02_two_records.h

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,31 +25,52 @@ inline auto mergeYaml(YAML::Node n1, YAML::Node n2) {
2525
}
2626

2727
// declaring toYaml
28-
inline auto toYaml(bool v) {
29-
return YAML::Node{v};
30-
}
31-
inline auto toYaml(float v) {
32-
return YAML::Node{v};
33-
}
34-
inline auto toYaml(double v) {
35-
return YAML::Node{v};
36-
}
37-
inline auto toYaml(int32_t v) {
38-
return YAML::Node{v};
39-
}
40-
inline auto toYaml(int64_t v) {
41-
return YAML::Node{v};
42-
}
43-
inline auto toYaml(std::any const&) {
44-
return YAML::Node{};
45-
}
28+
inline auto toYaml(bool v) { return YAML::Node{v}; }
29+
inline auto toYaml(float v) { return YAML::Node{v}; }
30+
inline auto toYaml(double v) { return YAML::Node{v}; }
31+
inline auto toYaml(char v) { return YAML::Node{v}; }
32+
inline auto toYaml(int8_t v) { return YAML::Node{v}; }
33+
inline auto toYaml(uint8_t v) { return YAML::Node{v}; }
34+
inline auto toYaml(int16_t v) { return YAML::Node{v}; }
35+
inline auto toYaml(uint16_t v) { return YAML::Node{v}; }
36+
inline auto toYaml(int32_t v) { return YAML::Node{v}; }
37+
inline auto toYaml(uint32_t v) { return YAML::Node{v}; }
38+
inline auto toYaml(int64_t v) { return YAML::Node{v}; }
39+
inline auto toYaml(uint64_t v) { return YAML::Node{v}; }
4640
inline auto toYaml(std::monostate const&) {
4741
return YAML::Node(YAML::NodeType::Undefined);
4842
}
4943
inline auto toYaml(std::string const& v) {
5044
return YAML::Node{v};
5145
}
5246

47+
template <typename T, typename ...Args>
48+
auto anyToYaml_impl(std::any const& a) {
49+
if (auto v = std::any_cast<T const>(&a)) {
50+
return toYaml(*v);
51+
}
52+
if constexpr (sizeof...(Args) > 0) {
53+
return anyToYaml_impl<Args...>(a);
54+
}
55+
return toYaml(std::monostate{});
56+
}
57+
58+
inline auto toYaml(std::any const& a) {
59+
return anyToYaml_impl<bool,
60+
float,
61+
double,
62+
char,
63+
int8_t,
64+
uint8_t,
65+
int16_t,
66+
uint16_t,
67+
int32_t,
68+
uint32_t,
69+
int64_t,
70+
uint64_t,
71+
std::string>(a);
72+
}
73+
5374
// declaring fromYaml
5475
inline void fromYaml(YAML::Node const& n, bool& v) {
5576
v = n.as<bool>();

schema_salad/tests/cpp_tests/03_simple_inheritance.h

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,31 +25,52 @@ inline auto mergeYaml(YAML::Node n1, YAML::Node n2) {
2525
}
2626

2727
// declaring toYaml
28-
inline auto toYaml(bool v) {
29-
return YAML::Node{v};
30-
}
31-
inline auto toYaml(float v) {
32-
return YAML::Node{v};
33-
}
34-
inline auto toYaml(double v) {
35-
return YAML::Node{v};
36-
}
37-
inline auto toYaml(int32_t v) {
38-
return YAML::Node{v};
39-
}
40-
inline auto toYaml(int64_t v) {
41-
return YAML::Node{v};
42-
}
43-
inline auto toYaml(std::any const&) {
44-
return YAML::Node{};
45-
}
28+
inline auto toYaml(bool v) { return YAML::Node{v}; }
29+
inline auto toYaml(float v) { return YAML::Node{v}; }
30+
inline auto toYaml(double v) { return YAML::Node{v}; }
31+
inline auto toYaml(char v) { return YAML::Node{v}; }
32+
inline auto toYaml(int8_t v) { return YAML::Node{v}; }
33+
inline auto toYaml(uint8_t v) { return YAML::Node{v}; }
34+
inline auto toYaml(int16_t v) { return YAML::Node{v}; }
35+
inline auto toYaml(uint16_t v) { return YAML::Node{v}; }
36+
inline auto toYaml(int32_t v) { return YAML::Node{v}; }
37+
inline auto toYaml(uint32_t v) { return YAML::Node{v}; }
38+
inline auto toYaml(int64_t v) { return YAML::Node{v}; }
39+
inline auto toYaml(uint64_t v) { return YAML::Node{v}; }
4640
inline auto toYaml(std::monostate const&) {
4741
return YAML::Node(YAML::NodeType::Undefined);
4842
}
4943
inline auto toYaml(std::string const& v) {
5044
return YAML::Node{v};
5145
}
5246

47+
template <typename T, typename ...Args>
48+
auto anyToYaml_impl(std::any const& a) {
49+
if (auto v = std::any_cast<T const>(&a)) {
50+
return toYaml(*v);
51+
}
52+
if constexpr (sizeof...(Args) > 0) {
53+
return anyToYaml_impl<Args...>(a);
54+
}
55+
return toYaml(std::monostate{});
56+
}
57+
58+
inline auto toYaml(std::any const& a) {
59+
return anyToYaml_impl<bool,
60+
float,
61+
double,
62+
char,
63+
int8_t,
64+
uint8_t,
65+
int16_t,
66+
uint16_t,
67+
int32_t,
68+
uint32_t,
69+
int64_t,
70+
uint64_t,
71+
std::string>(a);
72+
}
73+
5374
// declaring fromYaml
5475
inline void fromYaml(YAML::Node const& n, bool& v) {
5576
v = n.as<bool>();

schema_salad/tests/cpp_tests/04_abstract_inheritance.h

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,31 +25,52 @@ inline auto mergeYaml(YAML::Node n1, YAML::Node n2) {
2525
}
2626

2727
// declaring toYaml
28-
inline auto toYaml(bool v) {
29-
return YAML::Node{v};
30-
}
31-
inline auto toYaml(float v) {
32-
return YAML::Node{v};
33-
}
34-
inline auto toYaml(double v) {
35-
return YAML::Node{v};
36-
}
37-
inline auto toYaml(int32_t v) {
38-
return YAML::Node{v};
39-
}
40-
inline auto toYaml(int64_t v) {
41-
return YAML::Node{v};
42-
}
43-
inline auto toYaml(std::any const&) {
44-
return YAML::Node{};
45-
}
28+
inline auto toYaml(bool v) { return YAML::Node{v}; }
29+
inline auto toYaml(float v) { return YAML::Node{v}; }
30+
inline auto toYaml(double v) { return YAML::Node{v}; }
31+
inline auto toYaml(char v) { return YAML::Node{v}; }
32+
inline auto toYaml(int8_t v) { return YAML::Node{v}; }
33+
inline auto toYaml(uint8_t v) { return YAML::Node{v}; }
34+
inline auto toYaml(int16_t v) { return YAML::Node{v}; }
35+
inline auto toYaml(uint16_t v) { return YAML::Node{v}; }
36+
inline auto toYaml(int32_t v) { return YAML::Node{v}; }
37+
inline auto toYaml(uint32_t v) { return YAML::Node{v}; }
38+
inline auto toYaml(int64_t v) { return YAML::Node{v}; }
39+
inline auto toYaml(uint64_t v) { return YAML::Node{v}; }
4640
inline auto toYaml(std::monostate const&) {
4741
return YAML::Node(YAML::NodeType::Undefined);
4842
}
4943
inline auto toYaml(std::string const& v) {
5044
return YAML::Node{v};
5145
}
5246

47+
template <typename T, typename ...Args>
48+
auto anyToYaml_impl(std::any const& a) {
49+
if (auto v = std::any_cast<T const>(&a)) {
50+
return toYaml(*v);
51+
}
52+
if constexpr (sizeof...(Args) > 0) {
53+
return anyToYaml_impl<Args...>(a);
54+
}
55+
return toYaml(std::monostate{});
56+
}
57+
58+
inline auto toYaml(std::any const& a) {
59+
return anyToYaml_impl<bool,
60+
float,
61+
double,
62+
char,
63+
int8_t,
64+
uint8_t,
65+
int16_t,
66+
uint16_t,
67+
int32_t,
68+
uint32_t,
69+
int64_t,
70+
uint64_t,
71+
std::string>(a);
72+
}
73+
5374
// declaring fromYaml
5475
inline void fromYaml(YAML::Node const& n, bool& v) {
5576
v = n.as<bool>();

0 commit comments

Comments
 (0)