in cppcache/src/PdxInstanceImpl.cpp [627:726]
int PdxInstanceImpl::deepArrayHashCode(std::shared_ptr<Cacheable> obj) {
if (obj == nullptr) {
return 0;
}
if (auto primitive =
std::dynamic_pointer_cast<DataSerializablePrimitive>(obj)) {
switch (primitive->getDsCode()) {
case DSCode::CacheableObjectArray: {
return enumerateObjectArrayHashCode(
std::dynamic_pointer_cast<CacheableObjectArray>(obj));
}
case DSCode::CacheableVector: {
return enumerateVectorHashCode(
std::dynamic_pointer_cast<CacheableVector>(obj));
}
case DSCode::CacheableArrayList: {
return enumerateArrayListHashCode(
std::dynamic_pointer_cast<CacheableArrayList>(obj));
}
case DSCode::CacheableLinkedList: {
return enumerateLinkedListHashCode(
std::dynamic_pointer_cast<CacheableLinkedList>(obj));
}
case DSCode::CacheableHashMap: {
return enumerateMapHashCode(
std::dynamic_pointer_cast<CacheableHashMap>(obj));
}
case DSCode::CacheableHashSet: {
return enumerateSetHashCode(
std::dynamic_pointer_cast<CacheableHashSet>(obj));
}
case DSCode::CacheableLinkedHashSet: {
auto linkedHashSet =
std::dynamic_pointer_cast<CacheableLinkedHashSet>(obj);
return enumerateLinkedSetHashCode(linkedHashSet);
}
case DSCode::CacheableHashTable: {
return enumerateHashTableCode(
std::dynamic_pointer_cast<CacheableHashTable>(obj));
}
case DSCode::FixedIDDefault:
case DSCode::FixedIDByte:
case DSCode::FixedIDInt:
case DSCode::FixedIDNone:
case DSCode::FixedIDShort:
case DSCode::Properties:
case DSCode::PdxType:
case DSCode::BooleanArray:
case DSCode::CharArray:
case DSCode::NullObj:
case DSCode::CacheableString:
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::CacheableNullString:
case DSCode::CacheableIdentityHashMap:
case DSCode::CacheableStack:
case DSCode::CacheableASCIIString:
case DSCode::CacheableASCIIStringHuge:
case DSCode::CacheableStringHuge:
case DSCode::CacheableUserData:
case DSCode::CacheableUserData2:
case DSCode::CacheableUserData4:
case DSCode::PDX:
case DSCode::PDX_ENUM:
break;
}
}
if (auto pdxInstance = std::dynamic_pointer_cast<PdxInstance>(obj)) {
return pdxInstance->hashcode();
}
if (auto keyType = std::dynamic_pointer_cast<CacheableKey>(obj)) {
return keyType->hashcode();
}
throw IllegalStateException(
"PdxInstance cannot calculate hashcode of the field " + obj->toString() +
" since equals is only supported for CacheableKey derived types.");
}