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/auto.h>
11 #include <hilti/ast/types/optional.h>
12 
13 namespace hilti::ctor {
14 
16 class Optional : public NodeBase, public hilti::trait::isCtor {
17 public:
19  Optional(Expression e, Meta m = Meta())
20  : NodeBase(nodes(type::Optional(type::auto_), std::move(e)), std::move(m)) {}
21 
23  Optional(Type t, const Meta& m = Meta()) : NodeBase(nodes(type::Optional(std::move(t), m), node::none), m) {}
24 
25  const Type& dereferencedType() const { return children()[0].as<type::Optional>().dereferencedType(); }
26  hilti::optional_ref<const Expression> value() const { return children()[1].tryAs<Expression>(); }
27 
28  void setDereferencedType(Type x) { children()[0] = type::Optional(std::move(x)); }
29 
30  bool operator==(const Optional& other) const { return value() == other.value(); }
31 
33  const auto& type() const { return child<Type>(0); }
34 
36  bool isConstant() const {
37  if ( auto e = value() )
38  return e->isConstant();
39 
40  return true;
41  }
42 
44  bool isLhs() const { return false; }
46  auto isTemporary() const { return true; }
47 
49  auto isEqual(const Ctor& other) const { return node::isEqual(this, other); }
50 
52  auto properties() const { return node::Properties{}; }
53 };
54 
55 } // namespace hilti::ctor
bool isLhs() const
Definition: optional.h:44
Optional(Expression e, Meta m=Meta())
Definition: optional.h:19
Definition: optional.h:79
const auto & children() const
Definition: node.h:472
Definition: optional.h:13
Definition: meta.h:19
auto isTemporary() const
Definition: optional.h:46
Definition: type.h:160
auto isEqual(const Ctor &other) const
Definition: optional.h:49
bool isConstant() const
Definition: optional.h:36
Definition: optional-ref.h:22
const auto & type() const
Definition: optional.h:33
Optional(Type t, const Meta &m=Meta())
Definition: optional.h:23
std::map< std::string, node::detail::PropertyValue > Properties
Definition: node.h:98
Definition: ctor.h:15
Definition: optional.h:16
auto properties() const
Definition: optional.h:52
Definition: node.h:360