in clicache/src/TypeRegistry.cpp [459:563]
TValue TypeRegistry::GetManagedValueGeneric(std::shared_ptr<native::Serializable> val)
{
if (val == nullptr)
{
return TValue();
}
if (auto dataSerializablePrimitive = std::dynamic_pointer_cast<native::internal::DataSerializablePrimitive>(val))
{
switch (dataSerializablePrimitive->getDsCode())
{
case native::internal::DSCode::CacheableByte:
{
return safe_cast<TValue>(Serializable::getByte(dataSerializablePrimitive));
}
case native::internal::DSCode::CacheableBoolean:
{
return safe_cast<TValue>(Serializable::getBoolean(dataSerializablePrimitive));
}
case native::internal::DSCode::CacheableCharacter:
{
return safe_cast<TValue>(Serializable::getChar(dataSerializablePrimitive));
}
case native::internal::DSCode::CacheableDouble:
{
return safe_cast<TValue>(Serializable::getDouble(dataSerializablePrimitive));
}
case native::internal::DSCode::CacheableASCIIString:
case native::internal::DSCode::CacheableASCIIStringHuge:
case native::internal::DSCode::CacheableString:
case native::internal::DSCode::CacheableStringHuge:
{
return safe_cast<TValue>(Serializable::getString(dataSerializablePrimitive));
}
case native::internal::DSCode::CacheableFloat:
{
return safe_cast<TValue>(Serializable::getFloat(dataSerializablePrimitive));
}
case native::internal::DSCode::CacheableInt16:
{
return safe_cast<TValue>(Serializable::getInt16(dataSerializablePrimitive));
}
case native::internal::DSCode::CacheableInt32:
{
return safe_cast<TValue>(Serializable::getInt32(dataSerializablePrimitive));
}
case native::internal::DSCode::CacheableInt64:
{
return safe_cast<TValue>(Serializable::getInt64(dataSerializablePrimitive));
}
default:
return wrap<TValue>(dataSerializablePrimitive);
}
}
else if (auto dataSerializableFixedId = std::dynamic_pointer_cast<native::DataSerializableFixedId>(val))
{
switch (dataSerializableFixedId->getDSFID())
{
case native::DSFid::Struct:
{
return safe_cast<TValue>(Struct::Create(val));
}
case native::DSFid::CacheableUndefined:
{
return safe_cast<TValue>(CacheableUndefined::Create());
}
default:
break;
}
}
else if (auto dataSerializable = std::dynamic_pointer_cast<native::DataSerializable>(val))
{
auto ret = SafeUMSerializableConvertGeneric(dataSerializable);
return safe_cast<TValue>(ret);
}
else if (auto pdxSerializable = std::dynamic_pointer_cast<native::PdxSerializable>(val))
{
auto ret = SafeUMSerializablePDXConvert(pdxSerializable);
if (auto pdxWrapper = dynamic_cast<PdxWrapper^>(ret))
{
return safe_cast<TValue>(pdxWrapper->GetObject());
}
return safe_cast<TValue>(ret);
}
else if (auto userFunctionExecutionException = std::dynamic_pointer_cast<native::UserFunctionExecutionException>(val))
{
return safe_cast<TValue>(gcnew UserFunctionExecutionException(userFunctionExecutionException));
}
else if (auto pdxManagedCacheableKey = std::dynamic_pointer_cast<native::PdxManagedCacheableKey>(val))
{
auto pdx = pdxManagedCacheableKey->ptr();
if (auto pdxWrapper = dynamic_cast<PdxWrapper^>(pdx))
{
return safe_cast<TValue>(pdxWrapper->GetObject());
}
return safe_cast<TValue>(pdx);
}
else
{
throw gcnew IllegalStateException("Unknown serialization type.");
}
throw gcnew System::Exception("not found typeid");
}