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