/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * 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 CONSTANT_EXPRESSION_H_

#define CONSTANT_EXPRESSION_H_

#include <android-base/macros.h>
#include <string>
#include "ScalarType.h"

namespace android {

/**
 * A constant expression is represented by a tree.
 */
struct ConstantExpression {

    enum ConstExprType {
        kConstExprLiteral,
        kConstExprUnary,
        kConstExprBinary,
        kConstExprTernary
    };

    /* Default constructor. */
    ConstantExpression();
    /* Copy constructor. */
    ConstantExpression(const ConstantExpression& other);
    /* Copy constructor, with the expr overriden. */
    ConstantExpression(const ConstantExpression& other, std::string expr);
    /* Literals */
    ConstantExpression(const char *value);
    /* binary operations */
    ConstantExpression(const ConstantExpression *value1,
        const char *op, const ConstantExpression* value2);
    /* unary operations */
    ConstantExpression(const char *op, const ConstantExpression *value);
    /* ternary ?: */
    ConstantExpression(const ConstantExpression *cond,
                       const ConstantExpression *trueVal,
                       const ConstantExpression *falseVal);

    static ConstantExpression Zero(ScalarType::Kind kind);
    static ConstantExpression One(ScalarType::Kind kind);

    /* Evaluated result in a string form. */
    std::string value() const;
    /* Evaluated result in a string form. */
    std::string cppValue() const;
    /* Evaluated result in a string form. */
    std::string javaValue() const;
    /* Evaluated result in a string form, with given contextual kind. */
    std::string cppValue(ScalarType::Kind castKind) const;
    /* Evaluated result in a string form, with given contextual kind. */
    std::string javaValue(ScalarType::Kind castKind) const;
    /* Original expression with type. */
    const std::string &description() const;
    /* Return a ConstantExpression that is 1 plus the original. */
    ConstantExpression addOne() const;
    /* Assignment operator. */
    ConstantExpression& operator=(const ConstantExpression& other);

    size_t castSizeT() const;

private:
    /* The formatted expression. */
    std::string mExpr;
    /* The type of the expression. Hints on its original form. */
    ConstExprType mType;
    /* The kind of the result value. */
    ScalarType::Kind mValueKind;
    /* The stored result value. */
    uint64_t mValue;

    /*
     * Helper function for all cpp/javaValue methods.
     * Returns a plain string (without any prefixes or suffixes, just the
     * digits) converted from mValue.
     */
    std::string rawValue(ScalarType::Kind castKind) const;
    /* Trim unnecessary information. Only mValue and mValueKind is kept. */
    ConstantExpression &toLiteral();

    /*
     * Return the value casted to the given type.
     * First cast it according to mValueKind, then cast it to T.
     * Assumes !containsIdentifiers()
     */
    template <typename T> T cast() const;
};

}  // namespace android

#endif  // CONSTANT_EXPRESSION_H_
