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(), this, result(builder, operands, meta), \
18  std::move(operands), meta)}; \
19  } \
20  \
21  std::string name() const final { return hilti::util::replace(#cls, "_::", "::"); } \
22  std::string _typename() const final { return hilti::util::typename_(*this); }
23 
24 #define HILTI_OPERATOR_IMPLEMENTATION(cls) \
25  namespace { \
26  static hilti::operator_::Register<cls> _operator_##cls; \
27  }
28 
29 namespace hilti::operator_ {
30 
32 class Registry {
33 public:
38  const auto& byBuiltinFunctionID(const ID& id) { return _operators_by_builtin_function[id]; }
39 
43  const auto& byKind(Kind kind) { return _operators_by_kind[kind]; }
44 
49  const auto& byMethodID(const ID& id) { return _operators_by_method[id]; }
50 
52  const auto& byName(const std::string_view& name) { return _operators_by_name[std::string(name)]; }
53 
64  std::pair<bool, std::optional<std::vector<const Operator*>>> functionCallCandidates(
66 
68  const auto& operators() const { return _operators; }
69 
74  void register_(std::unique_ptr<Operator> op);
75 
85  void initPending(Builder* builder);
86 
88  bool havePending() const { return ! _pending.empty(); }
89 
91  void clear();
92 
99  void debugEnforceBuiltInsAreResolved(Builder* builder) const;
100 
102  static auto& singleton() {
103  static Registry instance;
104  return instance;
105  }
106 
107 private:
108  std::list<std::unique_ptr<Operator>> _pending; // all registered, but not yet initialized operators
109  std::vector<std::unique_ptr<Operator>> _operators; // all initialized operators
110  std::map<std::string, const Operator*> _operators_by_name; // initialized operators by name
111  std::map<Kind, std::vector<const Operator*>> _operators_by_kind; // initialized operators by kind
112  std::map<ID, std::vector<const Operator*>>
113  _operators_by_builtin_function; // initialized operators by builtin call operators; empty ID collect all without
114  // a static name
115  std::map<ID, std::vector<const Operator*>> _operators_by_method; // initialized operators by method
116 };
117 
122 inline auto get(std::string_view name) {
123  if ( const auto* op = Registry::singleton().byName(name) )
124  return op;
125  else
126  logger().internalError(util::fmt("unknown operator '%s'", name));
127 }
128 
130 template<typename T>
131 class Register {
132 public:
133  Register() { Registry::singleton().register_(std::make_unique<T>()); }
134 };
135 
136 inline auto& registry() { return Registry::singleton(); }
137 
138 } // namespace hilti::operator_
Definition: builder.h:36
Definition: id.h:15
Definition: unresolved-operator.h:15
Definition: operator-registry.h:131
Definition: operator-registry.h:32
const auto & byBuiltinFunctionID(const ID &id)
Definition: operator-registry.h:38
static auto & singleton()
Definition: operator-registry.h:102
bool havePending() const
Definition: operator-registry.h:88
std::pair< bool, std::optional< std::vector< const Operator * > > > functionCallCandidates(const expression::UnresolvedOperator *op)
Definition: operator-registry.cc:82
const auto & byName(const std::string_view &name)
Definition: operator-registry.h:52
void debugEnforceBuiltInsAreResolved(Builder *builder) const
Definition: operator-registry.cc:59
const auto & byKind(Kind kind)
Definition: operator-registry.h:43
const auto & byMethodID(const ID &id)
Definition: operator-registry.h:49
void initPending(Builder *builder)
Definition: operator-registry.cc:16
void clear()
Definition: operator-registry.cc:134
void register_(std::unique_ptr< Operator > op)
Definition: operator-registry.cc:14
const auto & operators() const
Definition: operator-registry.h:68