EnumType.cpp revision 85eabdbe56720dcdcf130e5ca83129d47b143768
1c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include "EnumType.h"
2c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
3c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include "Formatter.h"
41c8580863620f425188e86ec60b90cf269b5201cIliyan Malchev#include <inttypes.h>
5881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber#include "ScalarType.h"
6c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
7737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber#include <android-base/logging.h>
8737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
9c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android {
10c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
11c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas HuberEnumType::EnumType(
129ed827c8cd6e8eddb1ad9987ab9413c1de8a27dfAndreas Huber        const char *localName,
139ed827c8cd6e8eddb1ad9987ab9413c1de8a27dfAndreas Huber        std::vector<EnumValue *> *values,
149ed827c8cd6e8eddb1ad9987ab9413c1de8a27dfAndreas Huber        Type *storageType)
159ed827c8cd6e8eddb1ad9987ab9413c1de8a27dfAndreas Huber    : NamedType(localName),
169ed827c8cd6e8eddb1ad9987ab9413c1de8a27dfAndreas Huber      mValues(values),
17881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber      mStorageType(
18881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber              storageType != NULL
19881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber                ? storageType
20881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber                : new ScalarType(ScalarType::KIND_INT32)) {
21c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}
22c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
238d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberconst Type *EnumType::storageType() const {
248d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    return mStorageType;
258d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber}
268d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
278d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberconst std::vector<EnumValue *> &EnumType::values() const {
288d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    return *mValues;
298d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber}
308d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
31737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huberconst ScalarType *EnumType::resolveToScalarType() const {
32737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    return mStorageType->resolveToScalarType();
33737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber}
34737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
358d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool EnumType::isEnum() const {
368d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    return true;
378d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber}
388d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
39881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstd::string EnumType::getCppType(StorageMode, std::string *extra) const {
40881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    extra->clear();
41881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
420e00de41d11a83ce3becb0dbd20b799acceb19a7Andreas Huber    return fullName();
43881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
44881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
452831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstd::string EnumType::getJavaType() const {
462831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return mStorageType->resolveToScalarType()->getJavaType();
472831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
482831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
492831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstd::string EnumType::getJavaSuffix() const {
502831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return mStorageType->resolveToScalarType()->getJavaSuffix();
512831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
522831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
53881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid EnumType::emitReaderWriter(
54881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &out,
55881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &name,
56881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &parcelObj,
57881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool parcelObjIsPointer,
58881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool isReader,
59881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode mode) const {
60737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    const ScalarType *scalarType = mStorageType->resolveToScalarType();
61737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    CHECK(scalarType != NULL);
62737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
63737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    scalarType->emitReaderWriterWithCast(
64737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            out,
65737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            name,
66737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            parcelObj,
67737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            parcelObjIsPointer,
68737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            isReader,
69737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            mode,
70737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            true /* needsCast */);
71881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
72881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
7385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid EnumType::emitJavaFieldReaderWriter(
7485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        Formatter &out,
7585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &blobName,
7685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &fieldName,
7785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &offset,
7885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        bool isReader) const {
7985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    return mStorageType->emitJavaFieldReaderWriter(
8085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            out, blobName, fieldName, offset, isReader);
8185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
8285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
83881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstatus_t EnumType::emitTypeDeclarations(Formatter &out) const {
84737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    const ScalarType *scalarType = mStorageType->resolveToScalarType();
85737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    CHECK(scalarType != NULL);
86737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
87881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    std::string extra;
88881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
89881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out << "enum class "
900e00de41d11a83ce3becb0dbd20b799acceb19a7Andreas Huber        << localName()
91881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << " : "
92737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        << ((Type *)scalarType)->getCppType(&extra)
93881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << " {\n";
94881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
95881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.indent();
96881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
978d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    std::vector<const EnumType *> chain;
98864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    getTypeChain(&chain);
998d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
1008d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    for (auto it = chain.rbegin(); it != chain.rend(); ++it) {
1018d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber        const auto &type = *it;
1028d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
1038d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber        for (const auto &entry : type->values()) {
1048d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber            out << entry->name();
1058d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
1068d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber            const char *value = entry->value();
1078d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber            if (value != NULL) {
1088d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber                out << " = " << value;
1098d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber            }
1108d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
1118d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber            out << ",\n";
1128d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber        }
113881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
114881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
115881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.unindent();
116881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out << "};\n\n";
117881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
118881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return OK;
119881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
120881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
1212831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber// Attempt to convert enum value literals into their signed equivalents,
1222831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber// i.e. if an enum value is stored in typeName 'byte', the value "192"
1232831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber// will be converted to the output "-64".
1242831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstatic bool MakeSignedIntegerValue(
1252831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &typeName, const char *value, std::string *output) {
1262831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    output->clear();
1272831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1282831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    char *end;
1292831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    long long x = strtoll(value, &end, 10);
1302831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1312831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    if (end > value && *end == '\0' && errno != ERANGE) {
1322831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        char out[32];
1332831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        if (typeName == "byte") {
1342831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            sprintf(out, "%d", (int)(int8_t)x);
1352831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        } else if (typeName == "short") {
1362831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            sprintf(out, "%d", (int)(int16_t)x);
1372831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        } else if (typeName == "int") {
1382831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            sprintf(out, "%d", (int)(int32_t)x);
1392831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        } else {
1402831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            assert(typeName == "long");
1411c8580863620f425188e86ec60b90cf269b5201cIliyan Malchev            sprintf(out, "%" PRId64 "L", (int64_t)x);
1422831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        }
1432831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1442831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        *output = out;
1452831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        return true;
1462831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    }
1472831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1482831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return false;
1492831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
1502831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
15185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huberstatus_t EnumType::emitJavaTypeDeclarations(Formatter &out, bool) const {
1522831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    const ScalarType *scalarType = mStorageType->resolveToScalarType();
1532831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    CHECK(scalarType != NULL);
1542831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1552831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out << "public final class "
1562831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << localName()
1572831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << " {\n";
1582831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1592831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out.indent();
1602831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1612831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    const std::string typeName = scalarType->getJavaType();
1622831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1632831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    std::vector<const EnumType *> chain;
164864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    getTypeChain(&chain);
1652831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1662831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    for (auto it = chain.rbegin(); it != chain.rend(); ++it) {
1672831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const auto &type = *it;
1682831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1692831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        for (const auto &entry : type->values()) {
1702831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            out << "public static final "
1712831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                << typeName
1722831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                << " "
1732831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                << entry->name();
1742831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1752831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const char *value = entry->value();
1762831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            if (value != NULL) {
1772831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                out << " = ";
1782831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1792831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                std::string convertedValue;
1802831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                if (MakeSignedIntegerValue(typeName, value, &convertedValue)) {
1812831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                    out << convertedValue;
1822831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                } else {
1832831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                    // The value is not an integer, but some other string,
1842831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                    // hopefully referring to some other enum name.
1852831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                    out << value;
1862831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                }
1872831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            }
1882831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1892831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            out << ";\n";
1902831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        }
1912831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    }
1922831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1932831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out.unindent();
1942831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out << "};\n\n";
1952831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1962831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return OK;
1972831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
1982831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1995158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhangstatus_t EnumType::emitVtsTypeDeclarations(Formatter &out) const {
200864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    out << "name: \"" << localName() << "\"\n"
2015158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        << "type: TYPE_ENUM\n"
2025158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        << "enum_value: {\n";
2035158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out.indent();
204864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
205864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    std::vector<const EnumType *> chain;
206864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    getTypeChain(&chain);
207864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
208864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    for (auto it = chain.rbegin(); it != chain.rend(); ++it) {
209864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        const auto &type = *it;
210864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
211864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        for (const auto &entry : type->values()) {
212864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            out << "enumerator: \"" << entry->name() << "\"\n";
213864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
214864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            const char *value = entry->value();
215864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            if (value != NULL) {
216864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang                out << "value: " << value << "\n";
217864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            }
218864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        }
2195158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    }
220864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
2215158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out.unindent();
2225158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out << "}\n";
2235158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return OK;
2245158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
2255158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
226864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangstatus_t EnumType::emitVtsAttributeType(Formatter &out) const {
2275158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out << "type: TYPE_ENUM\n" << "predefined_type:\"" << localName() << "\"\n";
2285158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return OK;
2295158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
2305158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
231864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangvoid EnumType::getTypeChain(std::vector<const EnumType *> *out) const {
232864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    out->clear();
233864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    const EnumType *type = this;
234864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    for (;;) {
235864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        out->push_back(type);
236864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
237864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        const Type *superType = type->storageType();
238864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        if (superType == NULL || !superType->isEnum()) {
239864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            break;
240864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        }
241864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
242864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        type = static_cast<const EnumType *>(superType);
243864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    }
244864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang}
245864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
24685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid EnumType::getAlignmentAndSize(size_t *align, size_t *size) const {
24785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    mStorageType->getAlignmentAndSize(align, size);
24885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
24985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
25031629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber////////////////////////////////////////////////////////////////////////////////
25131629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber
25231629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas HuberEnumValue::EnumValue(const char *name, const char *value)
25331629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber    : mName(name),
25431629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber      mValue(value) {
25531629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber}
25631629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber
25731629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huberstd::string EnumValue::name() const {
25831629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber    return mName;
25931629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber}
26031629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber
26131629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huberconst char *EnumValue::value() const {
26231629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber    return mValue;
26331629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber}
26431629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber
265c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
266c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
267