Files
Include/ENmLuaAux.h
T
Dario Sassi c59482460e Include :
- portata versione richiesta alla chiave per le librerie a 19
- eliminati Complex e sostituiti da std::complex<double>
- aggiunta gestione parametri std::complex<double> in lua.
2018-08-08 11:10:48 +00:00

113 lines
3.2 KiB
C++

//----------------------------------------------------------------------------
// 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<double>& cpPar)
{
if ( lua_isnumber( L, nInd)) {
double dVal = lua_tonumber( L, nInd) ;
cpPar = std::complex<double>( dVal, 0.) ;
return true ;
}
double dVal[2] ;
if ( LuaGetParam( L, nInd, dVal)) {
cpPar = std::complex<double>( dVal[0], dVal[1]) ;
return true ;
}
return false ;
}
//----------------------------------------------------------------------------
inline bool
LuaGetParam( lua_State* L, int nInd, CPLXVECTOR& vPar)
{
vPar.clear() ;
std::complex<double> 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<double> 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<double>& 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 ;
}