]> gitweb.ps.run Git - toc/blobdiff - src/find.h
pre change
[toc] / src / find.h
diff --git a/src/find.h b/src/find.h
new file mode 100644 (file)
index 0000000..31400ab
--- /dev/null
@@ -0,0 +1,121 @@
+#pragma once\r
+\r
+#include "repr.h"\r
+#include "typeInfo.h"\r
+\r
+#include <functional>\r
+#include <optional>\r
+\r
+template<typename T>\r
+using opt = std::optional<T>;\r
+\r
+template<typename T>\r
+opt<T> find(const std::vector<T> & ts, std::function<bool(T)> f)\r
+{\r
+  for (auto t : ts)\r
+    if (f(t))\r
+      return t;\r
+  return nullopt;\r
+}\r
+\r
+opt<Function> findFunction(\r
+  const Program & p,\r
+  const std::string & name,\r
+  const std::vector<std::string> & namespacePrefixes)\r
+{\r
+  if (namespacePrefixes.empty())\r
+  {\r
+    return find<Function>(p.functions, [&](Function f) { return f.name == name; });\r
+  }\r
+  \r
+  auto n = find<Namespace>(p.namespaces, [&](Namespace n) { return n.name == namespacePrefixes[0]; });\r
+\r
+  if (!n.has_value())\r
+    return nullopt;\r
+\r
+  for (int i = 1; i < namespacePrefixes.size(); i++)\r
+  {\r
+    n = find<Namespace>(n.value().namespaces, [&](Namespace n) { return n.name == namespacePrefixes[i]; });\r
+    \r
+    if (!n.has_value())\r
+      return nullopt;\r
+  }\r
+\r
+  return find<Function>(n.value().functions, [&](Function f) { return f.name == name; });\r
+}\r
+\r
+opt<Struct> findStruct(\r
+  const Program & p,\r
+  const std::string & name,\r
+  const std::vector<std::string> & namespacePrefixes)\r
+{\r
+  if (namespacePrefixes.empty())\r
+  {\r
+    return find<Struct>(p.structs, [&](Struct s) { return s.name == name; });\r
+  }\r
+  \r
+  auto n = find<Namespace>(p.namespaces, [&](Namespace n) { return n.name == namespacePrefixes[0]; });\r
+  \r
+  if (!n.has_value())\r
+    return nullopt;\r
+    \r
+  for (int i = 1; i < namespacePrefixes.size(); i++)\r
+  {\r
+    n = find<Namespace>(n.value().namespaces, [&](Namespace n) { return n.name == namespacePrefixes[i]; });\r
+\r
+    if (!n.has_value())\r
+      return nullopt;\r
+  }\r
+  return find<Struct>(n.value().structs, [&](Struct s) { return s.name == name; });\r
+}\r
+\r
+opt<Variable> findVariable(\r
+  const Program & p,\r
+  const std::string & name,\r
+  const std::vector<std::string> & namespacePrefixes)\r
+{\r
+  for (auto n : namespacePrefixes)\r
+    std::cout << n << std::endl;\r
+  if (namespacePrefixes.empty())\r
+  {\r
+    return find<Variable>(p.variables, [&](Variable v) { return v.name == name; });\r
+  }\r
+  \r
+  auto n = find<Namespace>(p.namespaces, [&](Namespace n) { return n.name == namespacePrefixes[0]; });\r
+  \r
+  if (!n.has_value())\r
+    return nullopt;\r
+      \r
+  for (int i = 1; i < namespacePrefixes.size(); i++)\r
+  {\r
+    n = find<Namespace>(n.value().namespaces, [&](Namespace n) { return n.name == namespacePrefixes[i]; });\r
+    \r
+    if (!n.has_value())\r
+      return nullopt;\r
+  }\r
+  return find<Variable>(n.value().variables, [&](Variable v) { return v.name == name; });\r
+}\r
+\r
+opt<Function> findStructMethod(\r
+  const Program & p,\r
+  const std::string & name,\r
+  TypeInfo ti)\r
+{\r
+  if (!ti.isStruct)\r
+    return nullopt;\r
+  auto s = findStruct(p, ti.type.name, ti.type.namespacePrefixes);\r
+  if (!s.has_value())\r
+    return nullopt;\r
+  return find<StructMember<Function>>(s.value().methods, [&](Function f) { return f.name == name; });\r
+}\r
+\r
+opt<Variable> findStructMember(\r
+  const Program & p,\r
+  TypeInfo ti,\r
+  const std::string & name)\r
+{\r
+  auto s = findStruct(p, ti.type.name, ti.type.namespacePrefixes);\r
+  if (!s.has_value())\r
+    return nullopt;\r
+  return find<StructMember<Variable>>(s.value().members, [&](Variable v) { return v.name == name; });\r
+}
\ No newline at end of file