Spicy
expression.h
1 // Copyright (c) 2020-2021 by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <list>
6 #include <utility>
7 #include <vector>
8 
9 #include <hilti/ast/node.h>
10 #include <hilti/ast/type.h>
11 #include <hilti/base/type_erase.h>
12 
13 namespace hilti {
14 
15 namespace trait {
17 class isExpression : public isNode {};
18 } // namespace trait
19 
20 namespace expression {
21 namespace detail {
22 #include <hilti/autogen/__expression.h>
23 
25 inline Node to_node(Expression t) { return Node(std::move(t)); }
26 
28 inline std::ostream& operator<<(std::ostream& out, Expression e) { return out << to_node(std::move(e)); }
29 
30 inline bool operator==(const Expression& x, const Expression& y) {
31  if ( &x == &y )
32  return true;
33 
34  assert(x.isEqual(y) == y.isEqual(x)); // Expected to be symmetric.
35  return x.isEqual(y);
36 }
37 
38 inline bool operator!=(const Expression& e1, const Expression& e2) { return ! (e1 == e2); }
39 
40 } // namespace detail
41 
48 inline bool isResolved(const detail::Expression& e, type::ResolvedState* rstate = nullptr) {
49  return type::detail::isResolved(e.type(), rstate);
50 }
51 
58 inline bool isResolved(const std::vector<detail::Expression>& exprs, type::ResolvedState* rstate = nullptr) {
59  for ( const auto& e : exprs ) {
60  if ( ! type::detail::isResolved(e.type(), rstate) )
61  return false;
62  }
63 
64  return true;
65 }
66 
73 inline bool isResolved(const hilti::node::Range<detail::Expression>& exprs, type::ResolvedState* rstate = nullptr) {
74  for ( const auto& e : exprs ) {
75  if ( ! type::detail::isResolved(e.type(), rstate) )
76  return false;
77  }
78 
79  return true;
80 }
81 
88 inline bool isResolved(const hilti::node::Set<detail::Expression>& exprs, type::ResolvedState* rstate = nullptr) {
89  for ( const auto& e : exprs ) {
90  if ( ! type::detail::isResolved(e.type(), rstate) )
91  return false;
92  }
93 
94  return true;
95 }
96 
97 } // namespace expression
98 
99 using Expression = expression::detail::Expression;
100 using expression::detail::to_node;
101 
103 template<typename T, typename std::enable_if_t<std::is_base_of<trait::isExpression, T>::value>* = nullptr>
104 inline Node to_node(T t) {
105  return Node(Expression(std::move(t)));
106 }
107 
108 } // namespace hilti
Definition: node.h:39
Definition: expression.h:17
Definition: node.h:42
Definition: node.h:113
Definition: node.h:22