Spicy
operator-registry.h
1 // Copyright (c) 2020-now by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <list>
6 #include <map>
7 #include <memory>
8 #include <string>
9 #include <utility>
10 #include <vector>
11 
12 #include <hilti/ast/operator.h>
13 
14 #define HILTI_OPERATOR(ns, cls) \
15  Result<hilti::expression::ResolvedOperator*> instantiate(hilti::Builder* builder, Expressions operands, Meta meta) \
16  const final { \
17  return {ns::operator_::cls::create(builder->context(), \
18  this, \
19  result(builder, operands, meta), \
20  std::move(operands), \
21  meta)}; \
22  } \
23  \
24  std::string name() const final { return hilti::util::replace(#cls, "_::", "::"); } \
25  std::string _typename() const final { return hilti::util::typename_(*this); }
26 
27 #define HILTI_OPERATOR_IMPLEMENTATION(cls) \
28  namespace { \
29  static hilti::operator_::Register<cls> _operator_##cls; \
30  }
31 
32 namespace hilti::operator_ {
33 
35 class Registry {
36 public:
41  const auto& byBuiltinFunctionID(const ID& id) { return _operators_by_builtin_function[id]; }
42 
46  const auto& byKind(Kind kind) { return _operators_by_kind[kind]; }
47 
52  const auto& byMethodID(const ID& id) { return _operators_by_method[id]; }
53 
55  const auto& byName(const std::string_view& name) { return _operators_by_name[std::string(name)]; }
56 
67  std::pair<bool, std::optional<std::vector<const Operator*>>> functionCallCandidates(
69 
71  const auto& operators() const { return _operators; }
72 
77  void register_(std::unique_ptr<Operator> op);
78 
88  void initPending(Builder* builder);
89 
91  bool havePending() const { return ! _pending.empty(); }
92 
94  void clear();
95 
102  void debugEnforceBuiltInsAreResolved(Builder* builder) const;
103 
105  static auto& singleton() {
106  static Registry instance;
107  return instance;
108  }
109 
110 private:
111  std::list<std::unique_ptr<Operator>> _pending; // all registered, but not yet initialized operators
112  std::vector<std::unique_ptr<Operator>> _operators; // all initialized operators
113  std::map<std::string, const Operator*> _operators_by_name; // initialized operators by name
114  std::map<Kind, std::vector<const Operator*>> _operators_by_kind; // initialized operators by kind
115  std::map<ID, std::vector<const Operator*>>
116  _operators_by_builtin_function; // initialized operators by builtin call operators; empty ID collect all without
117  // a static name
118  std::map<ID, std::vector<const Operator*>> _operators_by_method; // initialized operators by method
119 };
120 
125 inline auto get(std::string_view name) {
126  if ( const auto* op = Registry::singleton().byName(name) )
127  return op;
128  else
129  logger().internalError(util::fmt("unknown operator '%s'", name));
130 }
131 
133 template<typename T>
134 class Register {
135 public:
136  Register() { Registry::singleton().register_(std::make_unique<T>()); }
137 };
138 
139 inline auto& registry() { return Registry::singleton(); }
140 
141 } // namespace hilti::operator_
Definition: builder.h:36
Definition: id.h:15
Definition: unresolved-operator.h:15
Definition: operator-registry.h:134
Definition: operator-registry.h:35
const auto & byBuiltinFunctionID(const ID &id)
Definition: operator-registry.h:41
static auto & singleton()
Definition: operator-registry.h:105
bool havePending() const
Definition: operator-registry.h:91
std::pair< bool, std::optional< std::vector< const Operator * > > > functionCallCandidates(const expression::UnresolvedOperator *op)
Definition: operator-registry.cc:81
const auto & byName(const std::string_view &name)
Definition: operator-registry.h:55
void debugEnforceBuiltInsAreResolved(Builder *builder) const
Definition: operator-registry.cc:59
const auto & byKind(Kind kind)
Definition: operator-registry.h:46
const auto & byMethodID(const ID &id)
Definition: operator-registry.h:52
void initPending(Builder *builder)
Definition: operator-registry.cc:16
void clear()
Definition: operator-registry.cc:133
void register_(std::unique_ptr< Operator > op)
Definition: operator-registry.cc:14
const auto & operators() const
Definition: operator-registry.h:71