You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
3.9 KiB
115 lines
3.9 KiB
/* |
|
* 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); |
|
static ConstantExpression ValueOf(ScalarType::Kind kind, uint64_t value); |
|
|
|
/* 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 value(ScalarType::Kind castKind) 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; |
|
/* See mTrivialDescription */ |
|
bool descriptionIsTrivial() 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; |
|
/* true if description() does not offer more information than value(). */ |
|
bool mTrivialDescription = false; |
|
|
|
/* |
|
* 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_
|
|
|