// Copyright 2020 The Tint Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SRC_AST_RELATIONAL_EXPRESSION_H_ #define SRC_AST_RELATIONAL_EXPRESSION_H_ #include #include #include "src/ast/expression.h" #include "src/ast/literal.h" namespace tint { namespace ast { /// The relation type enum class Relation { kNone = 0, kAnd, kOr, kXor, kLogicalAnd, kLogicalOr, kEqual, kNotEqual, kLessThan, kGreaterThan, kLessThanEqual, kGreaterThanEqual, kUnordGreaterThan, kUnordGreaterThanEqual, kUnordLessThan, kUnordLessThanEqual, kUnordEqual, kUnordNotEqual, kSignedGreaterThan, kSignedGreaterThanEqual, kSignedLessThan, kSignedLessThanEqual, kShiftLeft, kShiftRight, kShiftRightArith, kAdd, kSubtract, kMultiply, kDivide, kModulo, }; /// An xor expression class RelationalExpression : public Expression { public: /// Constructor /// @param relation the relation type /// @param lhs the left side of the expression /// @param rhs the right side of the expression RelationalExpression(Relation relation, std::unique_ptr lhs, std::unique_ptr rhs); /// Constructor /// @param source the initializer source /// @param relation the relation type /// @param lhs the left side of the expression /// @param rhs the right side of the expression RelationalExpression(const Source& source, Relation relation, std::unique_ptr lhs, std::unique_ptr rhs); /// Move constructor RelationalExpression(RelationalExpression&&) = default; ~RelationalExpression() override; /// Sets the relation type /// @param relation the relation type void set_relation(Relation relation) { relation_ = relation; } /// @returns the relation Relation relation() const { return relation_; } /// Sets the left side of the expression /// @param lhs the left side to set void set_lhs(std::unique_ptr lhs) { lhs_ = std::move(lhs); } /// @returns the left side expression Expression* lhs() const { return lhs_.get(); } /// Sets the right side of the expression /// @param rhs the right side to set void set_rhs(std::unique_ptr rhs) { rhs_ = std::move(rhs); } /// @returns the right side expression Expression* rhs() const { return rhs_.get(); } /// @returns true if this is a relational expression bool IsRelational() const override { return true; } /// @returns true if the node is valid bool IsValid() const override; /// Writes a representation of the node to the output stream /// @param out the stream to write to /// @param indent number of spaces to indent the node when writing void to_str(std::ostream& out, size_t indent) const override; private: RelationalExpression(const RelationalExpression&) = delete; Relation relation_ = Relation::kNone; std::unique_ptr lhs_; std::unique_ptr rhs_; }; inline std::ostream& operator<<(std::ostream& out, Relation relation) { switch (relation) { case Relation::kNone: out << "none"; break; case Relation::kAnd: out << "and"; break; case Relation::kOr: out << "or"; break; case Relation::kXor: out << "xor"; break; case Relation::kLogicalAnd: out << "logical_and"; break; case Relation::kLogicalOr: out << "logical_or"; break; case Relation::kEqual: out << "equal"; break; case Relation::kNotEqual: out << "not_equal"; break; case Relation::kLessThan: out << "less_than"; break; case Relation::kGreaterThan: out << "greater_than"; break; case Relation::kLessThanEqual: out << "less_than_equal"; break; case Relation::kGreaterThanEqual: out << "greater_than_equal"; break; case Relation::kUnordGreaterThan: out << "unord_greater_than"; break; case Relation::kUnordGreaterThanEqual: out << "unord_greater_than_equal"; break; case Relation::kUnordLessThan: out << "unord_less_than"; break; case Relation::kUnordLessThanEqual: out << "unord_less_than_equal"; break; case Relation::kUnordEqual: out << "unord_equal"; break; case Relation::kUnordNotEqual: out << "unord_not_equal"; break; case Relation::kSignedGreaterThan: out << "signed_greateR_than"; break; case Relation::kSignedGreaterThanEqual: out << "signed_greater_than_equal"; break; case Relation::kSignedLessThan: out << "signed_less_than"; break; case Relation::kSignedLessThanEqual: out << "signed_less_than_equal"; break; case Relation::kShiftLeft: out << "shift_left"; break; case Relation::kShiftRight: out << "shift_right"; break; case Relation::kShiftRightArith: out << "shift_right_arith"; break; case Relation::kAdd: out << "add"; break; case Relation::kSubtract: out << "subtract"; break; case Relation::kMultiply: out << "multiply"; break; case Relation::kDivide: out << "divide"; break; case Relation::kModulo: out << "modulo"; break; } return out; } } // namespace ast } // namespace tint #endif // SRC_AST_RELATIONAL_EXPRESSION_H_