added casts for proper enum conversion

This commit is contained in:
Jack Andersen 2015-08-20 12:23:19 -10:00
parent 9655cb41d1
commit b664c7df8f
2 changed files with 148 additions and 16 deletions

View File

@ -126,15 +126,43 @@ class ATDNAEmitVisitor : public clang::RecursiveASTVisitor<ATDNAEmitVisitor>
const std::string& funcPrefix, bool& isDNATypeOut) const std::string& funcPrefix, bool& isDNATypeOut)
{ {
isDNATypeOut = false; isDNATypeOut = false;
if (writerPass)
{
if (theType->isEnumeralType()) if (theType->isEnumeralType())
{ {
clang::EnumType* eType = (clang::EnumType*)theType; clang::EnumType* eType = (clang::EnumType*)theType;
clang::EnumDecl* eDecl = eType->getDecl(); clang::EnumDecl* eDecl = eType->getDecl();
theType = eDecl->getIntegerType().getCanonicalType().getTypePtr(); theType = eDecl->getIntegerType().getCanonicalType().getTypePtr();
}
if (writerPass) const clang::BuiltinType* bType = (clang::BuiltinType*)theType;
if (bType->isBooleanType())
{ {
if (theType->isBuiltinType()) return ATHENA_DNA_WRITER ".writeBool(bool(" + fieldName + "));";
}
else if (bType->isUnsignedInteger())
{
if (width == 8)
return ATHENA_DNA_WRITER ".writeUByte(atUint8(" + fieldName + "));";
else if (width == 16)
return ATHENA_DNA_WRITER ".writeUint16" + funcPrefix + "(atUint16(" + fieldName + "));";
else if (width == 32)
return ATHENA_DNA_WRITER ".writeUint32" + funcPrefix + "(atUint32(" + fieldName + "));";
else if (width == 64)
return ATHENA_DNA_WRITER ".writeUint64" + funcPrefix + "(atUint64(" + fieldName + "));";
}
else if (bType->isSignedInteger())
{
if (width == 8)
return ATHENA_DNA_WRITER ".writeByte(atInt8(" + fieldName + "));";
else if (width == 16)
return ATHENA_DNA_WRITER ".writeInt16" + funcPrefix + "(atInt16(" + fieldName + "));";
else if (width == 32)
return ATHENA_DNA_WRITER ".writeInt32" + funcPrefix + "(atInt32(" + fieldName + "));";
else if (width == 64)
return ATHENA_DNA_WRITER ".writeInt64" + funcPrefix + "(atInt64(" + fieldName + "));";
}
}
else if (theType->isBuiltinType())
{ {
const clang::BuiltinType* bType = (clang::BuiltinType*)theType; const clang::BuiltinType* bType = (clang::BuiltinType*)theType;
if (bType->isBooleanType()) if (bType->isBooleanType())
@ -205,7 +233,41 @@ class ATDNAEmitVisitor : public clang::RecursiveASTVisitor<ATDNAEmitVisitor>
} }
else else
{ {
if (theType->isBuiltinType()) if (theType->isEnumeralType())
{
clang::EnumType* eType = (clang::EnumType*)theType;
clang::EnumDecl* eDecl = eType->getDecl();
theType = eDecl->getIntegerType().getCanonicalType().getTypePtr();
const clang::BuiltinType* bType = (clang::BuiltinType*)theType;
if (bType->isBooleanType())
{
return eDecl->getName().str() + "(" ATHENA_DNA_READER ".readBool())";
}
else if (bType->isUnsignedInteger())
{
if (width == 8)
return eDecl->getName().str() + "(" ATHENA_DNA_READER ".readUByte())";
else if (width == 16)
return eDecl->getName().str() + "(" ATHENA_DNA_READER ".readUint16" + funcPrefix + "())";
else if (width == 32)
return eDecl->getName().str() + "(" ATHENA_DNA_READER ".readUint32" + funcPrefix + "())";
else if (width == 64)
return eDecl->getName().str() + "(" ATHENA_DNA_READER ".readUint64" + funcPrefix + "())";
}
else if (bType->isSignedInteger())
{
if (width == 8)
return eDecl->getName().str() + "(" ATHENA_DNA_READER ".readByte()";
else if (width == 16)
return eDecl->getName().str() + "(" ATHENA_DNA_READER ".readInt16" + funcPrefix + "())";
else if (width == 32)
return eDecl->getName().str() + "(" ATHENA_DNA_READER ".readInt32" + funcPrefix + "())";
else if (width == 64)
return eDecl->getName().str() + "(" ATHENA_DNA_READER ".readInt64" + funcPrefix + "())";
}
}
else if (theType->isBuiltinType())
{ {
const clang::BuiltinType* bType = (clang::BuiltinType*)theType; const clang::BuiltinType* bType = (clang::BuiltinType*)theType;
if (bType->isBooleanType()) if (bType->isBooleanType())
@ -282,15 +344,43 @@ class ATDNAEmitVisitor : public clang::RecursiveASTVisitor<ATDNAEmitVisitor>
bool writerPass, bool& isDNATypeOut) bool writerPass, bool& isDNATypeOut)
{ {
isDNATypeOut = false; isDNATypeOut = false;
if (writerPass)
{
if (theType->isEnumeralType()) if (theType->isEnumeralType())
{ {
clang::EnumType* eType = (clang::EnumType*)theType; clang::EnumType* eType = (clang::EnumType*)theType;
clang::EnumDecl* eDecl = eType->getDecl(); clang::EnumDecl* eDecl = eType->getDecl();
theType = eDecl->getIntegerType().getCanonicalType().getTypePtr(); theType = eDecl->getIntegerType().getCanonicalType().getTypePtr();
}
if (writerPass) const clang::BuiltinType* bType = (clang::BuiltinType*)theType;
if (bType->isBooleanType())
{ {
if (theType->isBuiltinType()) return ATHENA_YAML_WRITER ".writeBool(\"" + bareFieldName + "\", bool(" + fieldName + "));";
}
else if (bType->isUnsignedInteger())
{
if (width == 8)
return ATHENA_YAML_WRITER ".writeUByte(\"" + bareFieldName + "\", atUint8(" + fieldName + "));";
else if (width == 16)
return ATHENA_YAML_WRITER ".writeUint16(\"" + bareFieldName + "\", atUint16(" + fieldName + "));";
else if (width == 32)
return ATHENA_YAML_WRITER ".writeUint32(\"" + bareFieldName + "\", atUint32(" + fieldName + "));";
else if (width == 64)
return ATHENA_YAML_WRITER ".writeUint64(\"" + bareFieldName + "\", atUint64(" + fieldName + "));";
}
else if (bType->isSignedInteger())
{
if (width == 8)
return ATHENA_YAML_WRITER ".writeByte(\"" + bareFieldName + "\", atInt8(" + fieldName + "));";
else if (width == 16)
return ATHENA_YAML_WRITER ".writeInt16(\"" + bareFieldName + "\", atInt16(" + fieldName + "));";
else if (width == 32)
return ATHENA_YAML_WRITER ".writeInt32(\"" + bareFieldName + "\", atInt32(" + fieldName + "));";
else if (width == 64)
return ATHENA_YAML_WRITER ".writeInt64(\"" + bareFieldName + "\", atInt64(" + fieldName + "));";
}
}
else if (theType->isBuiltinType())
{ {
const clang::BuiltinType* bType = (clang::BuiltinType*)theType; const clang::BuiltinType* bType = (clang::BuiltinType*)theType;
if (bType->isBooleanType()) if (bType->isBooleanType())
@ -361,7 +451,41 @@ class ATDNAEmitVisitor : public clang::RecursiveASTVisitor<ATDNAEmitVisitor>
} }
else else
{ {
if (theType->isBuiltinType()) if (theType->isEnumeralType())
{
clang::EnumType* eType = (clang::EnumType*)theType;
clang::EnumDecl* eDecl = eType->getDecl();
theType = eDecl->getIntegerType().getCanonicalType().getTypePtr();
const clang::BuiltinType* bType = (clang::BuiltinType*)theType;
if (bType->isBooleanType())
{
return eDecl->getName().str() + "(" ATHENA_YAML_READER ".readBool(\"" + bareFieldName + "\"))";
}
else if (bType->isUnsignedInteger())
{
if (width == 8)
return eDecl->getName().str() + "(" ATHENA_YAML_READER ".readUByte(\"" + bareFieldName + "\"))";
else if (width == 16)
return eDecl->getName().str() + "(" ATHENA_YAML_READER ".readUint16(\"" + bareFieldName + "\"))";
else if (width == 32)
return eDecl->getName().str() + "(" ATHENA_YAML_READER ".readUint32(\"" + bareFieldName + "\"))";
else if (width == 64)
return eDecl->getName().str() + "(" ATHENA_YAML_READER ".readUint64(\"" + bareFieldName + "\"))";
}
else if (bType->isSignedInteger())
{
if (width == 8)
return eDecl->getName().str() + "(" ATHENA_YAML_READER ".readByte(\"" + bareFieldName + "\"))";
else if (width == 16)
return eDecl->getName().str() + "(" ATHENA_YAML_READER ".readInt16(\"" + bareFieldName + "\"))";
else if (width == 32)
return eDecl->getName().str() + "(" ATHENA_YAML_READER ".readInt32(\"" + bareFieldName + "\"))";
else if (width == 64)
return eDecl->getName().str() + "(" ATHENA_YAML_READER ".readInt64(\"" + bareFieldName + "\"))";
}
}
else if (theType->isBuiltinType())
{ {
const clang::BuiltinType* bType = (clang::BuiltinType*)theType; const clang::BuiltinType* bType = (clang::BuiltinType*)theType;
if (bType->isBooleanType()) if (bType->isBooleanType())

View File

@ -6,6 +6,14 @@ typedef io::DNAYaml<BigEndian> BigDNA;
struct TESTSubFile : public BigDNA struct TESTSubFile : public BigDNA
{ {
DECL_YAML DECL_YAML
enum ETest : atUint8
{
ZERO,
ONE,
TWO,
THREE
};
Value<ETest> varE;
Value<atUint32> sub1; Value<atUint32> sub1;
Value<atUint32> sub2; Value<atUint32> sub2;
}; };