Spicy
optional.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/types/optional.h>
11 
12 namespace hilti {
13 namespace ctor {
14 
16 class Optional : public NodeBase, public hilti::trait::isCtor {
17 public:
19  Optional(Expression e, Meta m = Meta()) : NodeBase({std::move(e)}, std::move(m)) {}
20 
22  Optional(Type t, Meta m = Meta()) : NodeBase({std::move(t)}, std::move(m)) {}
23 
24  std::optional<Expression> value() const { return childs()[0].tryAs<Expression>(); }
25 
26  Type dereferencedType() const {
27  if ( auto x = childs()[0].tryAs<Expression>() )
28  return x->type();
29 
30  return type::effectiveType(child<Type>(0));
31  }
32 
33  bool operator==(const Optional& other) const { return value() == other.value(); }
34 
36  Type type() const { return type::Optional(dereferencedType(), meta()); }
37 
39  bool isConstant() const {
40  if ( auto e = value() )
41  return e->isConstant();
42 
43  return true;
44  }
45 
47  bool isLhs() const { return false; }
49  auto isTemporary() const { return true; }
50 
52  auto isEqual(const Ctor& other) const { return node::isEqual(this, other); }
53 
55  auto properties() const { return node::Properties{}; }
56 };
57 
58 } // namespace ctor
59 } // namespace hilti
Type type() const
Definition: optional.h:36
bool isLhs() const
Definition: optional.h:47
auto & childs() const
Definition: node.h:445
Optional(Expression e, Meta m=Meta())
Definition: optional.h:19
Definition: optional.h:13
Definition: meta.h:18
auto isTemporary() const
Definition: optional.h:49
auto isEqual(const Ctor &other) const
Definition: optional.h:52
bool isConstant() const
Definition: optional.h:39
std::map< std::string, node::detail::PropertyValue > Properties
Definition: node.h:83
Optional(Type t, Meta m=Meta())
Definition: optional.h:22
Definition: ctor.h:15
Definition: optional.h:16
auto properties() const
Definition: optional.h:55
auto & meta() const
Definition: node.h:449
Definition: node.h:318