blob: 1f0524bec9551d99cc416fd4ff8444ed9fe1e8a1 [file] [log] [blame]
Andreas Huber1aec3972016-08-26 09:26:32 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Yifan Hong52165692016-08-12 18:06:40 -070017#ifndef CONSTANT_EXPRESSION_H_
18
19#define CONSTANT_EXPRESSION_H_
20
21#include <android-base/macros.h>
22#include <string>
Yifan Hong57886972016-08-17 10:42:15 -070023#include "ScalarType.h"
Yifan Hong52165692016-08-12 18:06:40 -070024
25namespace android {
26
Yifan Hong52165692016-08-12 18:06:40 -070027/**
28 * A constant expression is represented by a tree.
29 */
30struct ConstantExpression {
Yifan Hong57886972016-08-17 10:42:15 -070031
32 enum ConstExprType {
33 kConstExprLiteral,
Yifan Hong57886972016-08-17 10:42:15 -070034 kConstExprUnary,
35 kConstExprBinary,
36 kConstExprTernary
37 };
38
Yifan Hongf24fa852016-09-23 11:03:15 -070039 /* Default constructor. */
40 ConstantExpression();
41 /* Copy constructor. */
42 ConstantExpression(const ConstantExpression& other);
43 /* Copy constructor, with the expr overriden. */
44 ConstantExpression(const ConstantExpression& other, std::string expr);
45 /* Literals */
46 ConstantExpression(const char *value);
Yifan Hong52165692016-08-12 18:06:40 -070047 /* binary operations */
48 ConstantExpression(const ConstantExpression *value1,
49 const char *op, const ConstantExpression* value2);
50 /* unary operations */
51 ConstantExpression(const char *op, const ConstantExpression *value);
52 /* ternary ?: */
53 ConstantExpression(const ConstantExpression *cond,
54 const ConstantExpression *trueVal,
55 const ConstantExpression *falseVal);
56
Yifan Hongf24fa852016-09-23 11:03:15 -070057 static ConstantExpression Zero(ScalarType::Kind kind);
58 static ConstantExpression One(ScalarType::Kind kind);
59
Yifan Hong57886972016-08-17 10:42:15 -070060 /* Evaluated result in a string form. */
Yifan Hongfc610cd2016-09-22 13:34:45 -070061 std::string value() const;
Yifan Hongf24fa852016-09-23 11:03:15 -070062 /* Evaluated result in a string form. */
63 std::string cppValue() const;
64 /* Evaluated result in a string form. */
65 std::string javaValue() const;
Yifan Hong57886972016-08-17 10:42:15 -070066 /* Evaluated result in a string form, with given contextual kind. */
Yifan Hongc07b2022016-11-08 12:44:24 -080067 std::string value(ScalarType::Kind castKind) const;
68 /* Evaluated result in a string form, with given contextual kind. */
Yifan Hongfc610cd2016-09-22 13:34:45 -070069 std::string cppValue(ScalarType::Kind castKind) const;
Yifan Hong19ca75a2016-08-31 10:20:03 -070070 /* Evaluated result in a string form, with given contextual kind. */
Yifan Hongfc610cd2016-09-22 13:34:45 -070071 std::string javaValue(ScalarType::Kind castKind) const;
Yifan Hong57886972016-08-17 10:42:15 -070072 /* Original expression with type. */
Yifan Hongf24fa852016-09-23 11:03:15 -070073 const std::string &description() const;
Yifan Hong5706a432016-11-02 09:44:18 -070074 /* See mTrivialDescription */
75 bool descriptionIsTrivial() const;
Yifan Hongf24fa852016-09-23 11:03:15 -070076 /* Return a ConstantExpression that is 1 plus the original. */
77 ConstantExpression addOne() const;
78 /* Assignment operator. */
79 ConstantExpression& operator=(const ConstantExpression& other);
Yifan Honge77ca132016-09-27 10:49:05 -070080
81 size_t castSizeT() const;
Yifan Hong52165692016-08-12 18:06:40 -070082
83private:
Yifan Hong57886972016-08-17 10:42:15 -070084 /* The formatted expression. */
Yifan Hongf24fa852016-09-23 11:03:15 -070085 std::string mExpr;
Yifan Hong57886972016-08-17 10:42:15 -070086 /* The type of the expression. Hints on its original form. */
87 ConstExprType mType;
Yifan Hongf24fa852016-09-23 11:03:15 -070088 /* The kind of the result value. */
Yifan Hong57886972016-08-17 10:42:15 -070089 ScalarType::Kind mValueKind;
Yifan Hongf24fa852016-09-23 11:03:15 -070090 /* The stored result value. */
Yifan Hong57886972016-08-17 10:42:15 -070091 uint64_t mValue;
Yifan Hong5706a432016-11-02 09:44:18 -070092 /* true if description() does not offer more information than value(). */
93 bool mTrivialDescription = false;
Yifan Hong52165692016-08-12 18:06:40 -070094
Yifan Hongf24fa852016-09-23 11:03:15 -070095 /*
96 * Helper function for all cpp/javaValue methods.
97 * Returns a plain string (without any prefixes or suffixes, just the
98 * digits) converted from mValue.
99 */
100 std::string rawValue(ScalarType::Kind castKind) const;
101 /* Trim unnecessary information. Only mValue and mValueKind is kept. */
102 ConstantExpression &toLiteral();
Yifan Honge77ca132016-09-27 10:49:05 -0700103
104 /*
105 * Return the value casted to the given type.
106 * First cast it according to mValueKind, then cast it to T.
107 * Assumes !containsIdentifiers()
108 */
109 template <typename T> T cast() const;
Yifan Hong52165692016-08-12 18:06:40 -0700110};
111
112} // namespace android
113
114#endif // CONSTANT_EXPRESSION_H_