/* * 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_