EnumType.cpp revision 1c8580863620f425188e86ec60b90cf269b5201c
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
73881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstatus_t EnumType::emitTypeDeclarations(Formatter &out) const {
74737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    const ScalarType *scalarType = mStorageType->resolveToScalarType();
75737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    CHECK(scalarType != NULL);
76737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
77881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    std::string extra;
78881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
79881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out << "enum class "
800e00de41d11a83ce3becb0dbd20b799acceb19a7Andreas Huber        << localName()
81881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << " : "
82737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        << ((Type *)scalarType)->getCppType(&extra)
83881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << " {\n";
84881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
85881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.indent();
86881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
878d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    std::vector<const EnumType *> chain;
88864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    getTypeChain(&chain);
898d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
908d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    for (auto it = chain.rbegin(); it != chain.rend(); ++it) {
918d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber        const auto &type = *it;
928d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
938d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber        for (const auto &entry : type->values()) {
948d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber            out << entry->name();
958d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
968d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber            const char *value = entry->value();
978d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber            if (value != NULL) {
988d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber                out << " = " << value;
998d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber            }
1008d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
1018d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber            out << ",\n";
1028d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber        }
103881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
104881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
105881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.unindent();
106881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out << "};\n\n";
107881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
108881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return OK;
109881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
110881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
1112831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber// Attempt to convert enum value literals into their signed equivalents,
1122831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber// i.e. if an enum value is stored in typeName 'byte', the value "192"
1132831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber// will be converted to the output "-64".
1142831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstatic bool MakeSignedIntegerValue(
1152831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &typeName, const char *value, std::string *output) {
1162831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    output->clear();
1172831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1182831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    char *end;
1192831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    long long x = strtoll(value, &end, 10);
1202831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1212831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    if (end > value && *end == '\0' && errno != ERANGE) {
1222831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        char out[32];
1232831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        if (typeName == "byte") {
1242831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            sprintf(out, "%d", (int)(int8_t)x);
1252831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        } else if (typeName == "short") {
1262831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            sprintf(out, "%d", (int)(int16_t)x);
1272831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        } else if (typeName == "int") {
1282831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            sprintf(out, "%d", (int)(int32_t)x);
1292831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        } else {
1302831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            assert(typeName == "long");
1311c8580863620f425188e86ec60b90cf269b5201cIliyan Malchev            sprintf(out, "%" PRId64 "L", (int64_t)x);
1322831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        }
1332831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1342831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        *output = out;
1352831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        return true;
1362831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    }
1372831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1382831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return false;
1392831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
1402831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1412831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstatus_t EnumType::emitJavaTypeDeclarations(Formatter &out) const {
1422831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    const ScalarType *scalarType = mStorageType->resolveToScalarType();
1432831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    CHECK(scalarType != NULL);
1442831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1452831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out << "public final class "
1462831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << localName()
1472831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << " {\n";
1482831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1492831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out.indent();
1502831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1512831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    const std::string typeName = scalarType->getJavaType();
1522831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1532831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    std::vector<const EnumType *> chain;
154864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    getTypeChain(&chain);
1552831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1562831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    for (auto it = chain.rbegin(); it != chain.rend(); ++it) {
1572831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const auto &type = *it;
1582831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1592831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        for (const auto &entry : type->values()) {
1602831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            out << "public static final "
1612831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                << typeName
1622831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                << " "
1632831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                << entry->name();
1642831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1652831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const char *value = entry->value();
1662831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            if (value != NULL) {
1672831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                out << " = ";
1682831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1692831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                std::string convertedValue;
1702831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                if (MakeSignedIntegerValue(typeName, value, &convertedValue)) {
1712831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                    out << convertedValue;
1722831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                } else {
1732831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                    // The value is not an integer, but some other string,
1742831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                    // hopefully referring to some other enum name.
1752831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                    out << value;
1762831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                }
1772831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            }
1782831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1792831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            out << ";\n";
1802831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        }
1812831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    }
1822831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1832831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out.unindent();
1842831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out << "};\n\n";
1852831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1862831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return OK;
1872831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
1882831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1895158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhangstatus_t EnumType::emitVtsTypeDeclarations(Formatter &out) const {
190864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    out << "name: \"" << localName() << "\"\n"
1915158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        << "type: TYPE_ENUM\n"
1925158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        << "enum_value: {\n";
1935158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out.indent();
194864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
195864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    std::vector<const EnumType *> chain;
196864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    getTypeChain(&chain);
197864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
198864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    for (auto it = chain.rbegin(); it != chain.rend(); ++it) {
199864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        const auto &type = *it;
200864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
201864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        for (const auto &entry : type->values()) {
202864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            out << "enumerator: \"" << entry->name() << "\"\n";
203864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
204864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            const char *value = entry->value();
205864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            if (value != NULL) {
206864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang                out << "value: " << value << "\n";
207864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            }
208864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        }
2095158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    }
210864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
2115158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out.unindent();
2125158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out << "}\n";
2135158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return OK;
2145158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
2155158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
216864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangstatus_t EnumType::emitVtsAttributeType(Formatter &out) const {
2175158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out << "type: TYPE_ENUM\n" << "predefined_type:\"" << localName() << "\"\n";
2185158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return OK;
2195158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
2205158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
221864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangvoid EnumType::getTypeChain(std::vector<const EnumType *> *out) const {
222864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    out->clear();
223864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    const EnumType *type = this;
224864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    for (;;) {
225864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        out->push_back(type);
226864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
227864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        const Type *superType = type->storageType();
228864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        if (superType == NULL || !superType->isEnum()) {
229864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            break;
230864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        }
231864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
232864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        type = static_cast<const EnumType *>(superType);
233864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    }
234864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang}
235864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
23631629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber////////////////////////////////////////////////////////////////////////////////
23731629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber
23831629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas HuberEnumValue::EnumValue(const char *name, const char *value)
23931629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber    : mName(name),
24031629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber      mValue(value) {
24131629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber}
24231629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber
24331629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huberstd::string EnumValue::name() const {
24431629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber    return mName;
24531629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber}
24631629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber
24731629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huberconst char *EnumValue::value() const {
24831629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber    return mValue;
24931629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber}
25031629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber
251c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
252c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
253