ECode CCarArrayInfo::CreateVariableBox( /* [in] */ PCarQuintet variableDescriptor, /* [out] */ IVariableOfCarArray** variable) { if (!variableDescriptor || !variable) { return E_INVALID_ARGUMENT; } Int32 size = 0; ECode ec = mElementTypeInfo->GetSize(&size); if (FAILED(ec)) return ec; if (variableDescriptor->m_size < size) { return E_INVALID_ARGUMENT; } if (!(variableDescriptor->m_flags & DataTypeToFlag(mElementDataType))) { return E_INVALID_ARGUMENT; } CVariableOfCarArray* carArrayBox = new CVariableOfCarArray(this, variableDescriptor, FALSE); if (carArrayBox == NULL) { return E_OUT_OF_MEMORY; } *variable = (IVariableOfCarArray *)carArrayBox; (*variable)->AddRef(); return NOERROR; }
ECode CVariableOfCarArray::Rebox( /* [in] */ PVoid localVariablePtr) { CarQuintetFlag flag = DataTypeToFlag(mDataType); PCarQuintet cq = (PCarQuintet)localVariablePtr; if (!cq || !(cq->mFlags & flag) || cq->mSize < mElementSize) { return E_INVALID_ARGUMENT; } if (mIsAlloc && mCq) { free(mCq); mIsAlloc = FALSE; } mCq = cq; return NOERROR; }
ECode CCarArrayInfo::CreateVariable( /* [in] */ Int32 capacity, /* [out] */ IVariableOfCarArray** variable) { if (capacity <= 0 || !variable) { return E_INVALID_ARGUMENT; } Int32 size = 0; ECode ec = mElementTypeInfo->GetSize(&size); if (FAILED(ec)) return ec; Int32 bufSize = capacity * size; PCarQuintet carQuintet = (PCarQuintet)calloc(sizeof(CarQuintet) + bufSize, sizeof(Byte)); if (!carQuintet) { return E_OUT_OF_MEMORY; } carQuintet->m_flags = DataTypeToFlag(mElementDataType); if (mQuintetType == CarDataType_ArrayOf) { carQuintet->m_used = bufSize; } carQuintet->m_size = bufSize; carQuintet->m_pBuf = (Byte *)carQuintet + sizeof(CarQuintet); CVariableOfCarArray* carArrayBox = new CVariableOfCarArray(this, carQuintet, TRUE); if (carArrayBox == NULL) { free(carQuintet); return E_OUT_OF_MEMORY; } *variable = (IVariableOfCarArray *)carArrayBox; (*variable)->AddRef(); return NOERROR; }