Make Reference::get follow const rules
Instead of having T* Reference::get() const, this change brings
const T* Reference::get() const and
T* Reference::get()
Test: mma
Change-Id: I1c8834467acffd426c25aa9c0661c290a05d7a52
diff --git a/ArrayType.cpp b/ArrayType.cpp
index 6c65db1..34a9036 100644
--- a/ArrayType.cpp
+++ b/ArrayType.cpp
@@ -54,7 +54,7 @@
return mElementType->canCheckEquality();
}
-Type* ArrayType::getElementType() const {
+const Type* ArrayType::getElementType() const {
return mElementType.get();
}
diff --git a/ArrayType.h b/ArrayType.h
index d0498c3..175041f 100644
--- a/ArrayType.h
+++ b/ArrayType.h
@@ -36,7 +36,7 @@
bool isArray() const override;
bool canCheckEquality() const override;
- Type* getElementType() const;
+ const Type* getElementType() const;
void prependDimension(ConstantExpression *size);
void appendDimension(ConstantExpression *size);
diff --git a/EnumType.cpp b/EnumType.cpp
index 58f5407..4826557 100644
--- a/EnumType.cpp
+++ b/EnumType.cpp
@@ -171,7 +171,7 @@
BitFieldType::BitFieldType(Scope* parent) : TemplatedType(parent) {}
-BitFieldType* EnumType::getBitfieldType() const {
+const BitFieldType* EnumType::getBitfieldType() const {
return mBitfieldType.get();
}
@@ -803,7 +803,7 @@
return "mask of " + mElementType->typeName();
}
-bool BitFieldType::isCompatibleElementType(Type* elementType) const {
+bool BitFieldType::isCompatibleElementType(const Type* elementType) const {
return elementType->isEnum();
}
@@ -845,7 +845,7 @@
out << "scalar_type: \""
<< mElementType->resolveToScalarType()->getVtsScalarType()
<< "\"\n";
- out << "predefined_type: \"" << static_cast<NamedType*>(mElementType.get())->fullName()
+ out << "predefined_type: \"" << static_cast<const NamedType*>(mElementType.get())->fullName()
<< "\"\n";
return OK;
}
@@ -871,9 +871,9 @@
true /* needsCast */);
}
-EnumType* BitFieldType::getEnumType() const {
+const EnumType* BitFieldType::getEnumType() const {
CHECK(mElementType->isEnum());
- return static_cast<EnumType*>(mElementType.get());
+ return static_cast<const EnumType*>(mElementType.get());
}
// a bitfield maps to the underlying scalar type in C++, so operator<< is
diff --git a/EnumType.h b/EnumType.h
index fbcab93..d565fcd 100644
--- a/EnumType.h
+++ b/EnumType.h
@@ -58,7 +58,7 @@
std::string getVtsType() const override;
// Return the type that corresponds to bitfield<T>.
- BitFieldType *getBitfieldType() const;
+ const BitFieldType* getBitfieldType() const;
std::vector<const Reference<Type>*> getReferences() const override;
std::vector<const ConstantExpression*> getConstantExpressions() const override;
@@ -163,7 +163,7 @@
bool isBitField() const override;
- bool isCompatibleElementType(Type *elementType) const override;
+ bool isCompatibleElementType(const Type* elementType) const override;
bool isElidableType() const override;
@@ -182,7 +182,7 @@
std::string getVtsType() const override;
- EnumType *getEnumType() const;
+ const EnumType* getEnumType() const;
status_t emitVtsAttributeType(Formatter &out) const override;
diff --git a/FmqType.cpp b/FmqType.cpp
index 8b5f77d..51d0bd9 100644
--- a/FmqType.cpp
+++ b/FmqType.cpp
@@ -159,7 +159,7 @@
return true;
}
-bool FmqType::isCompatibleElementType(Type *elementType) const {
+bool FmqType::isCompatibleElementType(const Type* elementType) const {
return (!elementType->isInterface() && !elementType->needsEmbeddedReadWrite());
}
diff --git a/FmqType.h b/FmqType.h
index 27bb1ac..88b991a 100644
--- a/FmqType.h
+++ b/FmqType.h
@@ -60,7 +60,7 @@
bool needsEmbeddedReadWrite() const override;
bool resultNeedsDeref() const override;
- bool isCompatibleElementType(Type *elementType) const override;
+ bool isCompatibleElementType(const Type* elementType) const override;
std::string getVtsType() const override;
std::string getVtsValueName() const override;
diff --git a/Interface.cpp b/Interface.cpp
index 7f33928..1ae6638 100644
--- a/Interface.cpp
+++ b/Interface.cpp
@@ -610,7 +610,7 @@
// that would be caught in validate
return nullptr;
}
- return static_cast<Interface*>(mSuperType.get());
+ return static_cast<const Interface*>(mSuperType.get());
}
std::vector<const Interface *> Interface::typeChain() const {
diff --git a/RefType.cpp b/RefType.cpp
index cba02b2..441a38f 100644
--- a/RefType.cpp
+++ b/RefType.cpp
@@ -42,7 +42,7 @@
return "ref_value";
}
-bool RefType::isCompatibleElementType(Type *elementType) const {
+bool RefType::isCompatibleElementType(const Type* elementType) const {
if (elementType->isScalar()) {
return true;
}
@@ -55,15 +55,17 @@
if (elementType->isBitField()) {
return true;
}
- if (elementType->isCompoundType()
- && static_cast<CompoundType *>(elementType)->style() == CompoundType::STYLE_STRUCT) {
+ if (elementType->isCompoundType() &&
+ static_cast<const CompoundType*>(elementType)->style() == CompoundType::STYLE_STRUCT) {
return true;
}
if (elementType->isTemplatedType()) {
- return this->isCompatibleElementType(static_cast<TemplatedType *>(elementType)->getElementType());
+ return this->isCompatibleElementType(
+ static_cast<const TemplatedType*>(elementType)->getElementType());
}
if (elementType->isArray()) {
- return this->isCompatibleElementType(static_cast<ArrayType *>(elementType)->getElementType());
+ return this->isCompatibleElementType(
+ static_cast<const ArrayType*>(elementType)->getElementType());
}
return false;
}
diff --git a/RefType.h b/RefType.h
index 58ed4cf..3af6424 100644
--- a/RefType.h
+++ b/RefType.h
@@ -29,7 +29,8 @@
RefType(Scope* parent);
std::string typeName() const override;
- bool isCompatibleElementType(Type *elementType) const override;
+
+ bool isCompatibleElementType(const Type* elementType) const override;
std::vector<const Reference<Type>*> getStrongReferences() const override;
diff --git a/Reference.h b/Reference.h
index ed60960..13f209a 100644
--- a/Reference.h
+++ b/Reference.h
@@ -48,9 +48,14 @@
Referred type's field might be not resolved */
bool isResolved() const { return mResolved != nullptr; }
- T* operator->() const { return get(); }
+ T* operator->() { return get(); }
+ const T* operator->() const { return get(); }
- T* get() const {
+ T* get() {
+ CHECK(mResolved != nullptr);
+ return mResolved;
+ }
+ const T* get() const {
CHECK(mResolved != nullptr);
return mResolved;
}
diff --git a/Type.cpp b/Type.cpp
index ecaca13..82efab2 100644
--- a/Type.cpp
+++ b/Type.cpp
@@ -182,8 +182,7 @@
}
for (const auto* nextRef : getReferences()) {
- const auto* nextType = nextRef->get();
- err = nextType->recursivePass(func, visited);
+ err = (*nextRef)->recursivePass(func, visited);
if (err != OK) return err;
}
@@ -640,7 +639,7 @@
mElementType = elementType;
}
-Type* TemplatedType::getElementType() const {
+const Type* TemplatedType::getElementType() const {
return mElementType.get();
}
diff --git a/Type.h b/Type.h
index 57a77cf..b5b3a3e 100644
--- a/Type.h
+++ b/Type.h
@@ -314,11 +314,11 @@
/* Base type for VectorType and RefType. */
struct TemplatedType : public Type {
void setElementType(const Reference<Type>& elementType);
- Type* getElementType() const;
+ const Type* getElementType() const;
bool isTemplatedType() const override;
- virtual bool isCompatibleElementType(Type* elementType) const = 0;
+ virtual bool isCompatibleElementType(const Type* elementType) const = 0;
std::vector<const Reference<Type>*> getReferences() const override;
diff --git a/TypeDef.cpp b/TypeDef.cpp
index 8ecfe54..8481cad 100644
--- a/TypeDef.cpp
+++ b/TypeDef.cpp
@@ -30,7 +30,11 @@
return NULL;
}
-Type* TypeDef::referencedType() const {
+Type* TypeDef::referencedType() {
+ return mReferencedType.get();
+}
+
+const Type* TypeDef::referencedType() const {
return mReferencedType.get();
}
diff --git a/TypeDef.h b/TypeDef.h
index e6af502..cb11997 100644
--- a/TypeDef.h
+++ b/TypeDef.h
@@ -30,7 +30,8 @@
std::string typeName() const override;
- Type* referencedType() const;
+ Type* referencedType();
+ const Type* referencedType() const;
bool isInterface() const override;
bool isEnum() const override;
diff --git a/VectorType.cpp b/VectorType.cpp
index e279daf..aa50fae 100644
--- a/VectorType.cpp
+++ b/VectorType.cpp
@@ -31,7 +31,7 @@
return "vector of " + mElementType->typeName();
}
-bool VectorType::isCompatibleElementType(Type *elementType) const {
+bool VectorType::isCompatibleElementType(const Type* elementType) const {
if (elementType->isScalar()) {
return true;
}
@@ -44,8 +44,8 @@
if (elementType->isBitField()) {
return true;
}
- if (elementType->isCompoundType()
- && static_cast<CompoundType *>(elementType)->style() == CompoundType::STYLE_STRUCT) {
+ if (elementType->isCompoundType() &&
+ static_cast<const CompoundType*>(elementType)->style() == CompoundType::STYLE_STRUCT) {
return true;
}
if (elementType->isInterface()) {
@@ -58,11 +58,11 @@
return true;
}
if (elementType->isTemplatedType()) {
- Type *inner = static_cast<TemplatedType *>(elementType)->getElementType();
+ const Type* inner = static_cast<const TemplatedType*>(elementType)->getElementType();
return this->isCompatibleElementType(inner) && !inner->isInterface();
}
if (elementType->isArray()) {
- Type *inner = static_cast<ArrayType *>(elementType)->getElementType();
+ const Type* inner = static_cast<const ArrayType*>(elementType)->getElementType();
return this->isCompatibleElementType(inner) && !inner->isInterface();
}
return false;
@@ -728,7 +728,7 @@
}
if (mElementType->isArray()) {
- return static_cast<ArrayType*>(mElementType.get())->countDimensions() == 1;
+ return static_cast<const ArrayType*>(mElementType.get())->countDimensions() == 1;
}
if (mElementType->isVector()) {
diff --git a/VectorType.h b/VectorType.h
index edb5e1c..0623496 100644
--- a/VectorType.h
+++ b/VectorType.h
@@ -30,8 +30,9 @@
bool isVector() const override;
bool isVectorOfBinders() const;
+
std::string typeName() const override;
- bool isCompatibleElementType(Type *elementType) const override;
+ bool isCompatibleElementType(const Type* elementType) const override;
std::vector<const Reference<Type>*> getStrongReferences() const override;