blob: fe2d5729a12a5f6bc3809fd3cbbc501bb62c3fd0 [file] [log] [blame]
/*
* 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,
kConstExprUnknown,
kConstExprUnary,
kConstExprBinary,
kConstExprTernary
};
/* Literals, identifiers */
ConstantExpression(const char *value, ConstExprType type);
/* 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);
/* Original expression. */
const char *expr() const;
/* Evaluated result in a string form. */
const char *value() const;
/* Evaluated result in a string form, with given contextual kind. */
const char *cppValue(ScalarType::Kind castKind) const;
/* Evaluated result in a string form, with given contextual kind. */
const char *javaValue(ScalarType::Kind castKind) const;
/* Original expression with type. */
const char *description() const;
private:
/* The formatted expression. */
std::string mFormatted;
/* The type of the expression. Hints on its original form. */
ConstExprType mType;
/* The kind of the result value.
* Is valid only when mType != kConstExprUnknown. */
ScalarType::Kind mValueKind;
/* The stored result value.
* Is valid only when mType != kConstExprUnknown. */
uint64_t mValue;
/* Return the value casted to the given type.
* First cast it according to mValueKind, then cast it to T.
* Assumes mType != kConstExprUnknown */
template <typename T> T cast() const;
/* Helper function for value(ScalarType::Kind) */
const char *value0(ScalarType::Kind castKind) const;
DISALLOW_COPY_AND_ASSIGN(ConstantExpression);
};
} // namespace android
#endif // CONSTANT_EXPRESSION_H_