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 bool checkNamespace(std::shared_ptr<Context> ctx, const std::vector<std::string> & namespacePrefix)
\r
33 bool prefixMatches = true;
\r
36 for (int i = namespacePrefix.size() - 1; i >= 0; i--)
\r
38 const std::string & prefix = namespacePrefix[i];
\r
39 if (nIt == nullptr || ! nIt->name.has_value() || nIt->name.value() != prefix)
\r
41 prefixMatches = false;
\r
47 return prefixMatches;
\r
52 opt<Function> findFunction(
\r
53 const std::string & name,
\r
54 const std::vector<std::string> & namespacePrefix,
\r
55 std::shared_ptr<Context> ctx)
\r
57 for (auto it = ctx; it != nullptr; it = it->parent)
\r
59 auto f = find<Function>(it->functions, [&](Function f) { return f.name == name; });
\r
60 if (f.has_value() && checkNamespace(it, namespacePrefix))
\r
66 opt<Function *> findFunctionPtr(
\r
67 const std::string & name,
\r
68 const std::vector<std::string> & namespacePrefix,
\r
69 std::shared_ptr<Context> ctx)
\r
71 for (auto it = ctx; it != nullptr; it = it->parent)
\r
73 auto f = findPtr<Function>(it->functions, [&](Function f) { return f.name == name; });
\r
74 if (f.has_value() && checkNamespace(it, namespacePrefix))
\r
82 opt<Struct> findStruct(
\r
83 const std::string & name,
\r
84 const std::vector<std::string> & namespacePrefix,
\r
85 std::shared_ptr<Context> ctx)
\r
87 for (auto it = ctx; it != nullptr; it = it->parent)
\r
89 auto s = find<Struct>(it->structs, [&](Struct s) { return s.name == name; });
\r
90 if (s.has_value() && checkNamespace(it, namespacePrefix))
\r
96 opt<Struct *> findStructPtr(
\r
97 const std::string & name,
\r
98 const std::vector<std::string> & namespacePrefix,
\r
99 std::shared_ptr<Context> ctx)
\r
101 for (auto it = ctx; it != nullptr; it = it->parent)
\r
103 auto s = findPtr<Struct>(it->structs, [&](Struct s) { return s.name == name; });
\r
104 if (s.has_value() && checkNamespace(it, namespacePrefix))
\r
112 opt<Variable> findVariable(
\r
113 const std::string & name,
\r
114 const std::vector<std::string> & namespacePrefix,
\r
115 std::shared_ptr<Context> ctx)
\r
117 for (auto it = ctx; it != nullptr; it = it->parent)
\r
119 auto v = find<Variable>(it->variables, [&](Variable v) { return v.name == name; });
\r
120 if (v.has_value() && checkNamespace(it, namespacePrefix))
\r
128 opt<StructMember<Function>> findStructMethod(
\r
129 const std::string & name,
\r
132 return find<StructMember<Function>>(s.methods, [&](Function f) { return f.name == name; });
\r
134 opt<StructMember<Function> *> findStructMethodPtr(
\r
135 const std::string & name,
\r
138 return findPtr<StructMember<Function>>(s.methods, [&](Function f) { return f.name == name; });
\r
141 opt<StructMember<Variable>> findStructMember(
\r
142 const std::string & name,
\r
145 return find<StructMember<Variable>>(s.members, [&](Variable v) { return v.name == name; });
\r
148 opt<StructMember<Variable> *> findStructMemberPtr(
\r
149 const std::string & name,
\r
152 return findPtr<StructMember<Variable>>(s.members, [&](Variable v) { return v.name == name; });
\r