void ConfigVariable::addReferenceModule(const std::wstring& _module) { if (checkReferenceModule(_module) == false) { m_ReferenceModules.push_back(_module); } }
void ConfigVariable::removeReferenceModule(const std::wstring& _module) { if (checkReferenceModule(_module)) { m_ReferenceModules.remove(_module); } }
Function::ReturnValue WrapFunction::call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out) { int ret = 1; int inSize = (int)in.size(); int optSize = (int)opt.size(); int isRef = checkReferenceModule(m_wstModule.c_str()); if (m_pLoadDeps != NULL) { ret = m_pLoadDeps(m_wstName); } if (ret == 0) { return Error; } ReturnValue retVal = Callable::OK; GatewayStruct gStr; _iRetCount = std::max(1, _iRetCount); gStr.m_iIn = inSize + optSize; gStr.m_iOut = _iRetCount; //copy input parameter to prevent calling gateway modifies input data typed_list inCopy; if (isRef == 0) { for (int i = 0; i < inSize; i++) { inCopy.push_back(in[i]->clone()); } } else { for (int i = 0; i < inSize; i++) { inCopy.push_back(in[i]); } } gStr.m_pIn = &inCopy; gStr.m_pOpt = &opt; typed_list::value_type tmpOut[MAX_OUTPUT_VARIABLE]; std::fill_n(tmpOut, MAX_OUTPUT_VARIABLE, static_cast<typed_list::value_type>(0)); gStr.m_pOut = tmpOut; gStr.m_piRetCount = &_iRetCount; gStr.m_pstName = m_stName.data(); // we should use a stack array of the max size to avoid dynamic alloc. std::vector<int> outOrder(_iRetCount < 1 ? 1 : _iRetCount, -1); gStr.m_pOutOrder = outOrder.data(); //call gateway m_pOldFunc(const_cast<char*>(m_stName.data()), reinterpret_cast<int*>(&gStr)); if (ConfigVariable::isError()) { retVal = Callable::Error; ConfigVariable::resetError(); } else { for (std::size_t i(0); i != (size_t)_iRetCount && outOrder[i] != -1 && outOrder[i] != 0; ++i) { if (outOrder[i] - 1 < gStr.m_iIn) { std::size_t const iPos(outOrder[i] - 1); //protect variable to deletion inCopy[iPos]->IncreaseRef(); if (inCopy[iPos]->isDouble() && ((types::Double*)inCopy[iPos])->isViewAsInteger()) { types::Double* pD = inCopy[iPos]->getAs<types::Double>(); pD->convertFromInteger(); } if (inCopy[iPos]->isDouble() && ((types::Double*)inCopy[iPos])->isViewAsZComplex()) { types::Double* pD = inCopy[iPos]->getAs<types::Double>(); pD->convertFromZComplex(); } out.push_back(inCopy[iPos]); } else { std::size_t const iPos(outOrder[i] - gStr.m_iIn - 1); if (tmpOut[iPos]->isDouble() && ((types::Double*)tmpOut[iPos])->isViewAsInteger()) { types::Double* pD = tmpOut[iPos]->getAs<types::Double>(); pD->convertFromInteger(); } if (tmpOut[iPos]->isDouble() && ((types::Double*)tmpOut[iPos])->isViewAsZComplex()) { types::Double* pD = tmpOut[iPos]->getAs<types::Double>(); pD->convertFromZComplex(); } out.push_back(tmpOut[iPos]); tmpOut[iPos] = 0; } } } for (std::size_t i(0); i != MAX_OUTPUT_VARIABLE; ++i) { if (tmpOut[i]) { tmpOut[i]->killMe(); } } //clean input copy if (isRef == 0) { //protect outputs int size = (int)out.size(); for (int i = 0; i < size; i++) { out[i]->IncreaseRef(); } for (int i = 0; i < inSize; i++) { inCopy[i]->killMe(); } //unprotect outputs for (int i = 0; i < size; i++) { out[i]->DecreaseRef(); } } return retVal; }