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;
}