/*
* Copyright 2020 The casbin Authors. All Rights Reserved.
*
* 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.
*/
#include <cvaluate/OperatorSymbol.h>

namespace Cvaluate {

OperatorPrecedence FindOperatorPrecedenceForSymbol(OperatorSymbol symbol)  {

	switch (symbol) {
        case OperatorSymbol::NOOP:
            return OperatorPrecedence::NoopPrecedence;
        case OperatorSymbol::VALUE:
            return OperatorPrecedence::ValuePrecedence;
        case OperatorSymbol::EQ:
        case OperatorSymbol::NEQ:
        case OperatorSymbol::GT:
        case OperatorSymbol::LT:
        case OperatorSymbol::GTE:
        case OperatorSymbol::LTE:
        case OperatorSymbol::REQ:
        case OperatorSymbol::NREQ:
        case OperatorSymbol::IN:
            return OperatorPrecedence::ComparatorPrecedence;
        case OperatorSymbol::AND:
            return OperatorPrecedence::LogicalAndPrecedence;
        case OperatorSymbol::OR:
            return OperatorPrecedence::LogicalOrPrecedence;
        case OperatorSymbol::BITWISE_AND:
        case OperatorSymbol::BITWISE_OR:
        case OperatorSymbol::BITWISE_XOR:
            return  OperatorPrecedence::BitwisePrecedence;
        case OperatorSymbol::BITWISE_LSHIFT:
        case OperatorSymbol::BITWISE_RSHIFT:
            return OperatorPrecedence::BitwiseShiftPrecedence;
        case OperatorSymbol::PLUS:
        case OperatorSymbol::MINUS:
            return OperatorPrecedence::AdditivePrecedence;
        case OperatorSymbol::MULTIPLY:
        case OperatorSymbol::DIVIDE:
        case OperatorSymbol::MODULUS:
            return OperatorPrecedence::MultiplicativePrecedence;
        case OperatorSymbol::EXPONENT:
            return OperatorPrecedence::ExponentialPrecedence;
        case OperatorSymbol::BITWISE_NOT:
        case OperatorSymbol::NEGATE:
        case OperatorSymbol::INVERT:
            return OperatorPrecedence::PrefixPrecedence;
        case OperatorSymbol::COALESCE:
        case OperatorSymbol::TERNARY_TRUE:
        case OperatorSymbol::TERNARY_FALSE:
            return OperatorPrecedence::TernaryPrecedence;
        case OperatorSymbol::ACCESS:
        case OperatorSymbol::FUNCTIONAL:
            return OperatorPrecedence::FunctionalPrecedence;
        case OperatorSymbol::SEPARATE:
            return OperatorPrecedence::SeparatePrecedence;
        default:
            return OperatorPrecedence::ValuePrecedence;
	}

}
} // cvaluate