4 #include "typeInfo.h"
\r
6 #include <functional>
\r
10 using opt = std::optional<T>;
\r
12 template<typename T>
\r
13 opt<T> find(const std::vector<T> & ts, std::function<bool(T)> f)
\r
21 template<typename T>
\r
22 opt<T *> findPtr(const std::vector<T> & ts, std::function<bool(T)> f)
\r
24 for (int i = 0; i < ts.size(); i++)
\r
26 return &((T *)ts.data())[i];
\r
32 std::shared_ptr<Context>,
\r
33 std::vector<std::string>>>
\r
34 getContext(std::shared_ptr<Context> ctx, const std::vector<std::string> & namespacePrefix)
\r
38 for (auto name : namespacePrefix)
\r
40 auto newResult = find<Namespace>(result->namespaces, [&](Namespace n) { return n.name == name; });
\r
41 if (newResult.has_value())
\r
43 result = newResult->ctx;
\r
51 std::vector<std::string> namespaces;
\r
52 for (auto it = result; it != nullptr; it = it->parent)
\r
54 if (it->name.has_value())
\r
56 namespaces.insert(namespaces.begin(), it->name.value());
\r
58 else if (it->parent != nullptr)
\r
65 return std::make_tuple(result, namespaces);
\r
70 opt<std::tuple<Function, std::vector<std::string>>> findFunction(
\r
71 const std::string & name,
\r
72 const std::vector<std::string> & namespacePrefix,
\r
73 std::shared_ptr<Context> ctx)
\r
75 for (auto it = ctx; it != nullptr; it = it->parent)
\r
77 auto n = getContext(it, namespacePrefix);
\r
80 auto x = find<Function>(std::get<0>(*n)->functions, [&](Function _) { return _.name == name; });
\r
82 return std::make_tuple(x.value(), std::get<1>(*n));
\r
88 opt<std::tuple<Function *, std::vector<std::string>>> findFunctionPtr(
\r
89 const std::string & name,
\r
90 const std::vector<std::string> & namespacePrefix,
\r
91 std::shared_ptr<Context> ctx)
\r
93 for (auto it = ctx; it != nullptr; it = it->parent)
\r
95 auto n = getContext(it, namespacePrefix);
\r
98 auto x = findPtr<Function>(std::get<0>(*n)->functions, [&](Function _) { return _.name == name; });
\r
100 return std::make_tuple(x.value(), std::get<1>(*n));
\r
108 opt<std::tuple<Struct, std::vector<std::string>>> findStruct(
\r
109 const std::string & name,
\r
110 const std::vector<std::string> & namespacePrefix,
\r
111 std::shared_ptr<Context> ctx)
\r
113 for (auto it = ctx; it != nullptr; it = it->parent)
\r
115 auto n = getContext(it, namespacePrefix);
\r
118 auto x = find<Struct>(std::get<0>(*n)->structs, [&](Struct _) { return _.name == name; });
\r
120 return std::make_tuple(x.value(), std::get<1>(*n));
\r
126 opt<std::tuple<Struct *, std::vector<std::string>>> findStructPtr(
\r
127 const std::string & name,
\r
128 const std::vector<std::string> & namespacePrefix,
\r
129 std::shared_ptr<Context> ctx)
\r
131 for (auto it = ctx; it != nullptr; it = it->parent)
\r
133 auto n = getContext(it, namespacePrefix);
\r
136 auto x = findPtr<Struct>(std::get<0>(*n)->structs, [&](Struct _) { return _.name == name; });
\r
138 return std::make_tuple(x.value(), std::get<1>(*n));
\r
146 opt<std::tuple<Variable, std::vector<std::string>>> findVariable(
\r
147 const std::string & name,
\r
148 const std::vector<std::string> & namespacePrefix,
\r
149 std::shared_ptr<Context> ctx)
\r
151 for (auto it = ctx; it != nullptr; it = it->parent)
\r
153 auto n = getContext(it, namespacePrefix);
\r
156 auto x = find<Variable>(std::get<0>(*n)->variables, [&](Variable _) { return _.name == name; });
\r
158 return std::make_tuple(x.value(), std::get<1>(*n));
\r
166 opt<StructMember<Function>> findStructMethod(
\r
167 const std::string & name,
\r
170 return find<StructMember<Function>>(s.methods, [&](Function f) { return f.name == name; });
\r
172 opt<StructMember<Function> *> findStructMethodPtr(
\r
173 const std::string & name,
\r
176 return findPtr<StructMember<Function>>(s.methods, [&](Function f) { return f.name == name; });
\r
179 opt<StructMember<Variable>> findStructMember(
\r
180 const std::string & name,
\r
183 return find<StructMember<Variable>>(s.members, [&](Variable v) { return v.name == name; });
\r
186 opt<StructMember<Variable> *> findStructMemberPtr(
\r
187 const std::string & name,
\r
190 return findPtr<StructMember<Variable>>(s.members, [&](Variable v) { return v.name == name; });
\r