HRESULT CFastContainerUtil::GetPropertyValue()

in src/foundation_library/FastContainerUtil.cpp [84:197]


HRESULT CFastContainerUtil::GetPropertyValue(
    foundation::PropertyType propertyType, 
    LPVOID pSlotValue,
    foundation::IInspectable **value)
{

    if ((propertyType & 0x400) != 0)
    {
		foundation::library::_ArrayPropertyValueSlot arrayPropertyValueSlot =
            ReadSlotValue<foundation::library::_ArrayPropertyValueSlot>(pSlotValue);

        PropertyType itemArrayType = (PropertyType)(propertyType & 0xff);
        UINT32 size = arrayPropertyValueSlot._size;
        LPVOID arrayBuffer = arrayPropertyValueSlot._pArrayBuffer;

        switch (itemArrayType)
        {
        case PropertyType_UInt8:
            return pv_util::CreateUInt8ArrayValue(
                size,
                size ? static_cast<BYTE *>(arrayBuffer) : nullptr, value);
        case PropertyType_Int16:
            return pv_util::CreateInt16ArrayValue(
                size,
                size ? static_cast<INT16 *>(arrayBuffer) : nullptr, value);
        case PropertyType_UInt16:
            return pv_util::CreateUInt16ArrayValue(
                size,
                size ? static_cast<UINT16 *>(arrayBuffer) : nullptr, value);
        case PropertyType_Int32:
            return pv_util::CreateInt32ArrayValue(
                size,
                size ? static_cast<INT32 *>(arrayBuffer) : nullptr, value);
        case PropertyType_UInt32:
            return pv_util::CreateUInt32ArrayValue(
                size,
                size ? static_cast<UINT32 *>(arrayBuffer) : nullptr, value);
        case PropertyType_Boolean:
            return pv_util::CreateBooleanArrayValue(
                size,
                size ? static_cast<boolean *>(arrayBuffer) : nullptr, value);
        case PropertyType_String:
            return pv_util::CreateStringArrayValue(
                size,
                size ? static_cast<HSTRING *>(arrayBuffer) : nullptr, value);
        case PropertyType_Inspectable:
            return pv_util::CreateInspectableArrayValue(
                size,
                size ? static_cast<foundation::IInspectable **>(arrayBuffer) : nullptr, value);
        case PropertyType_Single:
            return pv_util::CreateSingleArrayValue(
                size,
                size ? static_cast<FLOAT *>(arrayBuffer) : nullptr, value);
        case PropertyType_Double:
            return pv_util::CreateDoubleArrayValue(
                size,
                size ? static_cast<DOUBLE *>(arrayBuffer) : nullptr, value);
        case PropertyType_Guid:
            return pv_util::CreateGuidArrayValue(
                size,
                size ? static_cast<GUID *>(arrayBuffer) : nullptr, value);
        case PropertyType_DateTime:
            return pv_util::CreateDateTimeArrayValue(
                size,
                size ? static_cast<DateTime *>(arrayBuffer) : nullptr, value);
        default:
            foundation_assert(false);
            return E_NOTIMPL;
        }
    }
    else
    {
        switch (propertyType)
        {
        case PropertyType_UInt8:
            return pv_util::CreateUInt8Value(ReadSlotValue<BYTE>(pSlotValue),value);
        case PropertyType_Int16:
            return pv_util::CreateInt16Value(ReadSlotValue<INT16>(pSlotValue), value);
        case PropertyType_UInt16:
            return pv_util::CreateUInt16Value(ReadSlotValue<UINT16>(pSlotValue), value);
        case PropertyType_Int32:
            return pv_util::CreateInt32Value(ReadSlotValue<INT32>(pSlotValue), value);
        case PropertyType_UInt32:
            return pv_util::CreateUInt32Value(ReadSlotValue<UINT32>(pSlotValue), value);
        case PropertyType_Int64:
            return pv_util::CreateInt64Value(ReadSlotValue<INT64>(pSlotValue), value);
        case PropertyType_UInt64:
            return pv_util::CreateUInt64Value(ReadSlotValue<UINT64>(pSlotValue), value);
        case PropertyType_Boolean:
            return pv_util::CreateBooleanValue(ReadSlotValue<boolean>(pSlotValue), value);
        case PropertyType_String:
            return pv_util::CreateStringValue(ReadSlotValue<HSTRING>(pSlotValue), value);
        case PropertyType_Inspectable:
            *value = ReadSlotValue<foundation::IInspectable *>(pSlotValue);
            if (*value)
            {
                (*value)->AddRef();
            }
            return S_OK;
        case PropertyType_Single:
            return pv_util::CreateSingleValue(ReadSlotValue<FLOAT>(pSlotValue), value);
        case PropertyType_Double:
            return pv_util::CreateDoubleValue(ReadSlotValue<DOUBLE>(pSlotValue), value);
        case PropertyType_Guid:
            return pv_util::CreateGuidValue(ReadSlotValue<GUID>(pSlotValue), value);
        case PropertyType_DateTime:
            return pv_util::CreateDateTimeValue(ReadSlotValue<DateTime>(pSlotValue), value);
        default:
            foundation_assert(false);
            return E_NOTIMPL;
        }
    }
    return S_OK;
}