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
30 opt<Function> findFunction(
\r
32 const std::string & name,
\r
33 const std::vector<std::string> & namespacePrefixes)
\r
35 if (namespacePrefixes.empty())
\r
37 return find<Function>(p.functions, [&](Function f) { return f.name == name; });
\r
40 auto n = find<Namespace>(p.namespaces, [&](Namespace n) { return n.name == namespacePrefixes[0]; });
\r
45 std::vector<Namespace> namespaces = { n.value() };
\r
47 for (int i = 1; i < namespacePrefixes.size(); i++)
\r
49 n = find<Namespace>(n.value().namespaces, [&](Namespace n) { return n.name == namespacePrefixes[i]; });
\r
54 namespaces.push_back(n.value());
\r
57 for (int i = namespaces.size()-1; i >= 0; i--)
\r
59 auto f = find<Function>(namespaces[i].functions, [&](Function f) { return f.name == name; });
\r
64 return find<Function>(p.functions, [&](Function f) { return f.name == name; });
\r
67 opt<Function *> findFunctionPtr(
\r
69 const std::string & name,
\r
70 const std::vector<std::string> & namespacePrefixes)
\r
72 if (namespacePrefixes.empty())
\r
74 return findPtr<Function>(p.functions, [&](Function f) { return f.name == name; });
\r
77 auto n = find<Namespace>(p.namespaces, [&](Namespace n) { return n.name == namespacePrefixes[0]; });
\r
82 std::vector<Namespace> namespaces = { n.value() };
\r
84 for (int i = 1; i < namespacePrefixes.size(); i++)
\r
86 n = find<Namespace>(n.value().namespaces, [&](Namespace n) { return n.name == namespacePrefixes[i]; });
\r
91 namespaces.push_back(n.value());
\r
94 for (int i = namespaces.size()-1; i >= 0; i--)
\r
96 auto f = findPtr<Function>(namespaces[i].functions, [&](Function f) { return f.name == name; });
\r
101 return findPtr<Function>(p.functions, [&](Function f) { return f.name == name; });
\r
104 opt<Struct> findStruct(
\r
106 const std::string & name,
\r
107 const std::vector<std::string> & namespacePrefixes)
\r
109 if (namespacePrefixes.empty())
\r
111 return find<Struct>(p.structs, [&](Struct s) { return s.name == name; });
\r
114 auto n = find<Namespace>(p.namespaces, [&](Namespace n) { return n.name == namespacePrefixes[0]; });
\r
116 if (!n.has_value())
\r
119 std::vector<Namespace> namespaces = { n.value() };
\r
121 for (int i = 1; i < namespacePrefixes.size(); i++)
\r
123 n = find<Namespace>(n.value().namespaces, [&](Namespace n) { return n.name == namespacePrefixes[i]; });
\r
125 if (!n.has_value())
\r
128 namespaces.push_back(n.value());
\r
131 for (int i = namespaces.size()-1; i >= 0; i--)
\r
133 auto f = find<Struct>(namespaces[i].structs, [&](Struct f) { return f.name == name; });
\r
138 return find<Struct>(n.value().structs, [&](Struct s) { return s.name == name; });
\r
141 opt<Struct *> findStructPtr(
\r
143 const std::string & name,
\r
144 const std::vector<std::string> & namespacePrefixes)
\r
146 if (namespacePrefixes.empty())
\r
148 return findPtr<Struct>(p.structs, [&](Struct s) { return s.name == name; });
\r
151 auto n = find<Namespace>(p.namespaces, [&](Namespace n) { return n.name == namespacePrefixes[0]; });
\r
153 if (!n.has_value())
\r
156 std::vector<Namespace> namespaces = { n.value() };
\r
158 for (int i = 1; i < namespacePrefixes.size(); i++)
\r
160 n = find<Namespace>(n.value().namespaces, [&](Namespace n) { return n.name == namespacePrefixes[i]; });
\r
162 if (!n.has_value())
\r
165 namespaces.push_back(n.value());
\r
168 for (int i = namespaces.size()-1; i >= 0; i--)
\r
170 auto f = findPtr<Struct>(namespaces[i].structs, [&](Struct f) { return f.name == name; });
\r
175 return findPtr<Struct>(n.value().structs, [&](Struct s) { return s.name == name; });
\r
178 opt<Variable> findVariable(
\r
180 const std::string & name,
\r
181 std::shared_ptr<Context> ctx)
\r
184 while (it != nullptr)
\r
186 auto v = find<Variable>(it->variables, [&](Variable v) { return v.name == name; });
\r
194 opt<StructMember<Function>> findStructMethod(
\r
196 const std::string & name,
\r
201 auto s = findStruct(p, ti.type.name, ti.type.namespacePrefixes);
\r
202 if (!s.has_value())
\r
204 return find<StructMember<Function>>(s.value().methods, [&](Function f) { return f.name == name; });
\r
206 opt<StructMember<Function> *> findStructMethodPtr(
\r
208 const std::string & name,
\r
213 auto s = findStruct(p, ti.type.name, ti.type.namespacePrefixes);
\r
214 if (!s.has_value())
\r
216 return findPtr<StructMember<Function>>(s.value().methods, [&](Function f) { return f.name == name; });
\r
219 opt<StructMember<Variable>> findStructMember(
\r
222 const std::string & name)
\r
224 auto s = findStruct(p, ti.type.name, ti.type.namespacePrefixes);
\r
225 if (!s.has_value())
\r
227 return find<StructMember<Variable>>(s.value().members, [&](Variable v) { return v.name == name; });
\r