+\r
+\r
+opt<std::tuple<Struct, std::vector<std::string>>> findStruct(\r
+ const std::string & name,\r
+ const std::vector<std::string> & namespacePrefix,\r
+ std::shared_ptr<Context> ctx)\r
+{\r
+ for (auto it = ctx; it != nullptr; it = it->parent)\r
+ {\r
+ auto n = getContext(it, namespacePrefix);\r
+ if (n.has_value())\r
+ {\r
+ auto x = find<Struct>(std::get<0>(*n)->structs, [&](Struct _) { return _.name == name; });\r
+ if (x.has_value())\r
+ return std::make_tuple(x.value(), std::get<1>(*n));\r
+ }\r
+ }\r
+ return nullopt;\r
+}\r
+\r
+opt<std::tuple<Struct *, std::vector<std::string>>> findStructPtr(\r
+ const std::string & name,\r
+ const std::vector<std::string> & namespacePrefix,\r
+ std::shared_ptr<Context> ctx)\r
+{\r
+ for (auto it = ctx; it != nullptr; it = it->parent)\r
+ {\r
+ auto n = getContext(it, namespacePrefix);\r
+ if (n.has_value())\r
+ {\r
+ auto x = findPtr<Struct>(std::get<0>(*n)->structs, [&](Struct _) { return _.name == name; });\r
+ if (x.has_value())\r
+ return std::make_tuple(x.value(), std::get<1>(*n));\r
+ }\r