Spicy
operator-registry.h
1 // Copyright (c) 2020-2021 by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <map>
6 #include <utility>
7 #include <vector>
8 
9 #include <hilti/ast/expression.h>
10 #include <hilti/ast/expressions/resolved-operator.h>
11 #include <hilti/ast/expressions/unresolved-operator.h>
12 #include <hilti/ast/operator.h>
13 #include <hilti/ast/types/struct.h>
14 
15 namespace hilti::operator_ {
16 
18 class Registry {
19 public:
20  using OperatorMap = std::map<Kind, std::vector<Operator>>;
21 
23  const auto& all() const { return _operators; }
24 
26  const auto& allOfKind(Kind kind) const { return _operators.at(kind); }
27 
29  void register_(Kind kind, Operator info) { _operators[kind].push_back(std::move(info)); }
30 
31  void printDebug() {
32 #if 0
33  // Can't print this at registratin time as that's happening through
34  // global constructors.
35  for ( auto a : _operators ) {
36  for ( const auto& info : a.second ) {
37  int status;
38  auto n = abi::__cxa_demangle(info.typename_().c_str(), nullptr, nullptr, &status);
39  HILTI_DEBUG(logging::debug::Overloads, hilti::util::fmt("registered %s for operator '%s'", (n ? n : info.typename_().c_str()), to_string(info.kind())));
40  }
41  }
42 #endif
43  }
44 
46  static auto& singleton() {
47  static Registry instance;
48  return instance;
49  }
50 
51 private:
52  OperatorMap _operators;
53 };
54 
56 class Register {
57 public:
58  Register(Kind k, Operator c) { Registry::singleton().register_(k, std::move(c)); }
59 };
60 
61 inline const auto& registry() { return Registry::singleton(); }
62 
63 } // namespace hilti::operator_
Definition: operator-registry.h:15
Definition: operator-registry.h:18
const auto & allOfKind(Kind kind) const
Definition: operator-registry.h:26
const auto & all() const
Definition: operator-registry.h:23
Definition: operator-registry.h:56
static auto & singleton()
Definition: operator-registry.h:46
void register_(Kind kind, Operator info)
Definition: operator-registry.h:29