in cppcache/src/PdxInstanceImpl.cpp [433:551]
bool PdxInstanceImpl::deepArrayEquals(std::shared_ptr<Cacheable> obj,
std::shared_ptr<Cacheable> otherObj) {
if (obj == nullptr && otherObj == nullptr) {
return true;
} else if (obj == nullptr && otherObj != nullptr) {
return false;
} else if (obj != nullptr && otherObj == nullptr) {
return false;
}
if (auto primitive =
std::dynamic_pointer_cast<DataSerializablePrimitive>(obj)) {
switch (primitive->getDsCode()) {
case DSCode::CacheableObjectArray: {
auto objArrayPtr = std::dynamic_pointer_cast<CacheableObjectArray>(obj);
auto otherObjArrayPtr =
std::dynamic_pointer_cast<CacheableObjectArray>(otherObj);
return enumerateObjectArrayEquals(objArrayPtr, otherObjArrayPtr);
}
case DSCode::CacheableVector: {
auto vec = std::dynamic_pointer_cast<CacheableVector>(obj);
auto otherVec = std::dynamic_pointer_cast<CacheableVector>(otherObj);
return enumerateVectorEquals(vec, otherVec);
}
case DSCode::CacheableArrayList: {
auto arrList = std::dynamic_pointer_cast<CacheableArrayList>(obj);
auto otherArrList =
std::dynamic_pointer_cast<CacheableArrayList>(otherObj);
return enumerateArrayListEquals(arrList, otherArrList);
}
case DSCode::CacheableHashMap: {
auto map = std::dynamic_pointer_cast<CacheableHashMap>(obj);
auto otherMap = std::dynamic_pointer_cast<CacheableHashMap>(otherObj);
return enumerateMapEquals(map, otherMap);
}
case DSCode::CacheableHashSet: {
auto hashset = std::dynamic_pointer_cast<CacheableHashSet>(obj);
auto otherHashset =
std::dynamic_pointer_cast<CacheableHashSet>(otherObj);
return enumerateSetEquals(hashset, otherHashset);
}
case DSCode::CacheableLinkedHashSet: {
auto linkedHashset =
std::dynamic_pointer_cast<CacheableLinkedHashSet>(obj);
auto otherLinkedHashset =
std::dynamic_pointer_cast<CacheableLinkedHashSet>(otherObj);
return enumerateLinkedSetEquals(linkedHashset, otherLinkedHashset);
}
case DSCode::CacheableHashTable: {
auto hashTable = std::dynamic_pointer_cast<CacheableHashTable>(obj);
auto otherhashTable =
std::dynamic_pointer_cast<CacheableHashTable>(otherObj);
return enumerateHashTableEquals(hashTable, otherhashTable);
}
case DSCode::FixedIDDefault:
case DSCode::FixedIDByte:
case DSCode::FixedIDShort:
case DSCode::FixedIDInt:
case DSCode::FixedIDNone:
case DSCode::CacheableLinkedList:
case DSCode::Properties:
case DSCode::PdxType:
case DSCode::BooleanArray:
case DSCode::CharArray:
case DSCode::CacheableUserData:
case DSCode::CacheableUserData2:
case DSCode::CacheableUserData4:
case DSCode::NullObj:
case DSCode::Class:
case DSCode::JavaSerializable:
case DSCode::DataSerializable:
case DSCode::CacheableBytes:
case DSCode::CacheableInt16Array:
case DSCode::CacheableInt32Array:
case DSCode::CacheableInt64Array:
case DSCode::CacheableFloatArray:
case DSCode::CacheableDoubleArray:
case DSCode::CacheableBoolean:
case DSCode::CacheableCharacter:
case DSCode::CacheableByte:
case DSCode::CacheableInt16:
case DSCode::CacheableInt32:
case DSCode::CacheableInt64:
case DSCode::CacheableFloat:
case DSCode::CacheableDouble:
case DSCode::CacheableDate:
case DSCode::CacheableFileName:
case DSCode::CacheableStringArray:
case DSCode::CacheableTimeUnit:
case DSCode::CacheableIdentityHashMap:
case DSCode::CacheableStack:
case DSCode::PDX:
case DSCode::PDX_ENUM:
case DSCode::CacheableString:
case DSCode::CacheableNullString:
case DSCode::CacheableASCIIString:
case DSCode::CacheableASCIIStringHuge:
case DSCode::CacheableStringHuge:
break;
}
}
if (auto pdxInstance = std::dynamic_pointer_cast<PdxInstance>(obj)) {
if (auto otherPdxInstance =
std::dynamic_pointer_cast<PdxInstance>(otherObj)) {
return *pdxInstance == *otherPdxInstance;
}
}
if (auto keyType = std::dynamic_pointer_cast<CacheableKey>(obj)) {
if (auto otherKeyType = std::dynamic_pointer_cast<CacheableKey>(otherObj)) {
return *keyType == *otherKeyType;
}
}
throw IllegalStateException(
"PdxInstance cannot calculate equals of the field " + obj->toString() +
" since equals is only supported for CacheableKey derived types.");
}