Spicy
reference.h
1 // Copyright (c) 2020-2021 by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <utility>
6 
7 #include <hilti/ast/ctor.h>
8 #include <hilti/ast/ctors/null.h>
9 #include <hilti/ast/expressions/ctor.h>
10 #include <hilti/ast/type.h>
11 #include <hilti/ast/types/auto.h>
12 #include <hilti/ast/types/reference.h>
13 
14 namespace hilti {
15 namespace ctor {
16 
19 public:
21  StrongReference(Type t, Meta m = Meta()) : NodeBase(nodes(t, type::StrongReference(t, m)), m) {}
22 
23  const Type& dereferencedType() const { return child<Type>(0); }
24 
25  bool operator==(const StrongReference& other) const { return dereferencedType() == other.dereferencedType(); }
26 
28  const Type& type() const { return child<Type>(1); }
29 
31  bool isConstant() const { return true; }
33  bool isLhs() const { return false; }
35  auto isTemporary() const { return true; }
36 
38  auto isEqual(const Ctor& other) const { return node::isEqual(this, other); }
39 
41  auto properties() const { return node::Properties{}; }
42 };
43 
46 public:
48  WeakReference(Type t, Meta m = Meta()) : NodeBase(nodes(t, type::WeakReference(t, m)), m) {}
49 
50  const Type& dereferencedType() const { return child<Type>(0); }
51 
52  bool operator==(const WeakReference& other) const { return dereferencedType() == other.dereferencedType(); }
53 
55  const Type& type() const { return child<Type>(1); }
56 
58  bool isConstant() const { return true; }
60  bool isLhs() const { return false; }
62  auto isTemporary() const { return true; }
63 
65  auto isEqual(const Ctor& other) const { return node::isEqual(this, other); }
66 
68  auto properties() const { return node::Properties{}; }
69 };
70 
73 public:
75  ValueReference(Expression e, Meta m = Meta())
76  : NodeBase(nodes(type::ValueReference(type::auto_, m), e), std::move(m)) {}
77 
78  const Type& dereferencedType() const { return child<type::ValueReference>(0).dereferencedType(); }
79  const Expression& expression() const { return child<Expression>(1); }
80 
81  void setDereferencedType(Type x) { children()[0] = type::ValueReference(std::move(x)); }
82 
83  bool operator==(const ValueReference& other) const { return dereferencedType() == other.dereferencedType(); }
84 
86  const Type& type() const { return child<Type>(0); }
88  bool isConstant() const { return true; }
90  bool isLhs() const { return false; }
92  auto isTemporary() const { return true; }
93 
95  auto isEqual(const Ctor& other) const { return node::isEqual(this, other); }
96 
98  auto properties() const { return node::Properties{}; }
99 };
100 
101 } // namespace ctor
102 } // namespace hilti
Definition: reference.h:18
WeakReference(Type t, Meta m=Meta())
Definition: reference.h:48
StrongReference(Type t, Meta m=Meta())
Definition: reference.h:21
bool isConstant() const
Definition: reference.h:31
const Type & type() const
Definition: reference.h:55
Definition: optional.h:79
auto properties() const
Definition: reference.h:98
const auto & children() const
Definition: node.h:470
const Type & type() const
Definition: reference.h:86
auto isEqual(const Ctor &other) const
Definition: reference.h:95
auto properties() const
Definition: reference.h:68
Definition: meta.h:18
auto isTemporary() const
Definition: reference.h:62
auto isEqual(const Ctor &other) const
Definition: reference.h:65
bool isConstant() const
Definition: reference.h:88
Definition: reference.h:83
Definition: type.h:159
auto isTemporary() const
Definition: reference.h:35
const Type & type() const
Definition: reference.h:28
bool isLhs() const
Definition: reference.h:33
auto isEqual(const Ctor &other) const
Definition: reference.h:38
std::map< std::string, node::detail::PropertyValue > Properties
Definition: node.h:99
ValueReference(Expression e, Meta m=Meta())
Definition: reference.h:75
auto isTemporary() const
Definition: reference.h:92
auto properties() const
Definition: reference.h:41
Definition: ctor.h:15
bool isLhs() const
Definition: reference.h:60
bool isLhs() const
Definition: reference.h:90
bool isConstant() const
Definition: reference.h:58
Definition: reference.h:72
Definition: reference.h:45
Definition: node.h:358