Spicy
statement.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/node.h>
8 #include <hilti/base/type_erase.h>
9 
10 namespace hilti {
11 
12 namespace trait {
14 class isStatement : public isNode {};
15 } // namespace trait
16 
17 namespace statement {
18 namespace detail {
19 #include <hilti/autogen/__statement.h>
20 
22 inline Node to_node(Statement t) { return Node(std::move(t)); }
23 
25 inline std::ostream& operator<<(std::ostream& out, Statement s) { return out << to_node(std::move(s)); }
26 
27 inline bool operator==(const Statement& x, const Statement& y) {
28  if ( &x == &y )
29  return true;
30 
31  assert(x.isEqual(y) == y.isEqual(x)); // Expected to be symmetric.
32  return x.isEqual(y);
33 }
34 
35 inline bool operator!=(const Statement& s1, const Statement& s2) { return ! (s1 == s2); }
36 
37 } // namespace detail
38 } // namespace statement
39 
40 using Statement = statement::detail::Statement;
41 using statement::detail::to_node;
42 
44 template<typename T, typename std::enable_if_t<std::is_base_of<trait::isStatement, T>::value>* = nullptr>
45 inline Node to_node(T t) {
46  return Node(Statement(std::move(t)));
47 }
48 
49 } // namespace hilti
Definition: statement.h:14
Definition: node.h:113
Definition: node.h:22