//---------------------------------------------------------------------------- // EgalTech 2018-2018 //---------------------------------------------------------------------------- // File : ENmLuaAux.h Data : 07.08.18 Versione : 1.9h1 // Contenuto : Funzioni per gestione parametri generali con LUA. // // // // Modifiche : 07.08.18 DS Creazione modulo. // // //---------------------------------------------------------------------------- #pragma once #include "/EgtDev/Include/ENkCplxCollection.h" #include "/EgtDev/Include/EGnLuaAux.h" //---------------------------------------------------------------------------- inline bool LuaGetParam( lua_State* L, int nInd, std::complex& cpPar) { if ( lua_isnumber( L, nInd)) { double dVal = lua_tonumber( L, nInd) ; cpPar = std::complex( dVal, 0.) ; return true ; } double dVal[2] ; if ( LuaGetParam( L, nInd, dVal)) { cpPar = std::complex( dVal[0], dVal[1]) ; return true ; } return false ; } //---------------------------------------------------------------------------- inline bool LuaGetParam( lua_State* L, int nInd, CPLXVECTOR& vPar) { vPar.clear() ; std::complex cpVal ; if ( LuaGetParam( L, nInd, cpVal)) { vPar.push_back( cpVal) ; return true ; } else if ( lua_istable( L, nInd)) { // lunghezza della tavola lua_len( L, nInd) ; if ( ! lua_isnumber( L, -1)) return false ; int nLen = int( lua_tointeger( L, -1)) ; lua_pop( L, 1) ; vPar.reserve( nLen) ; for ( int i = 1 ; i <= nLen ; ++ i) { lua_rawgeti( L, nInd, i) ; std::complex cpVal ; if ( ! LuaGetParam( L, -1, cpVal)) return false ; vPar.push_back( cpVal) ; lua_pop( L, 1) ; } return true ; } else return false ; } //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- inline bool LuaSetParam( lua_State* L, const std::complex& cpPar) { try { lua_createtable( L, 2, 0) ; lua_pushnumber( L, std::real( cpPar)) ; lua_rawseti( L, -2, 1) ; lua_pushnumber( L, std::imag( cpPar)) ; lua_rawseti( L, -2, 2) ; } catch( ...) { return false ; } return true ; } //------------------------------------------------------------------------------- inline bool LuaSetParam( lua_State* L, const CPLXVECTOR& vPar) { try { // recupero dimensione int nDim = int( vPar.size()) ; // creo tavola per vSel lua_createtable( L, nDim, 0) ; // creo e inserisco tavola per ogni componente for ( int i = 1 ; i <= nDim ; ++ i) { // creo tavola lua_createtable( L, 2, 0) ; lua_pushnumber( L, std::real( vPar[i-1])) ; lua_rawseti( L, -2, 1) ; lua_pushnumber( L, std::imag( vPar[i-1])) ; lua_rawseti( L, -2, 2) ; // la metto nel vettore lua_rawseti( L, -2, i) ; } } catch( ...) { return false ; } return true ; }