#ifndef ARRCTCAST_SEEN #define ARRCTCAST_SEEN #include "tarray.h" #include "sopnamsp.h" //----------------------------------------------------------------------- // Classe de Bridge et fonctions utilitaires pour permettre des // cast de type de donnees - sans conversion - pour des tableaux (TArray) // R. Ansari - Oct 2006 //----------------------------------------------------------------------- //****************************************** // Classe NDCBridge : Bridge sur NDataBlock, utile pour cast - sans conversion - de type template class NDCBridge : public Bridge { public: NDCBridge(NDataBlock< T > & db) : dbcs_(db) { //DBG cout << "+++ NDCBridge() this= " << hex << (long int)this << dec << endl; } virtual ~NDCBridge() { //DBG cout << "--- ~NDCBridge() this= " << hex << (long int)this << dec << endl; } protected: NDataBlock< T > dbcs_; }; //****************************************** // Fonction de cast de type de conteny - sans conversion - de tableaux // pour tableau packe en memoire template TArray< T2 > ArrayCast( TArray< T1 > & a, T2 ct, sa_size_t doff=0, sa_size_t dstep=1) { NDCBridge< T1 > * db = new NDCBridge< T1 >(a.DataBlock()); // if (a.AvgStep() != 1) if (a.IsPacked() == false) throw ParmError("ArrayCast - Pb: Not a packed array"); float rs = (float)sizeof(T1)/(float)sizeof(T2); //DBG cout << "--DBG-ArrayCast SizeOf T1= " << sizeof(T1) //DBG << " T2= " << sizeof(T2) << " rs=T1/T2= " << rs << endl; int_4 ndim = a.Rank(); sa_size_t sz[BASEARRAY_MAXNDIMS]; for(int_4 k=0; k 1)) kszsc = 1; if (dstep > 1) sz[kszsc] = sz[kszsc]*sizeof(T1)/sizeof(T2)/dstep; else sz[kszsc] = sz[kszsc]*sizeof(T1)/sizeof(T2); //DBG cout << " --DBG-ArrayCast SzX=" << a.SizeX() // << " rs=" << rs << " dstep=" << dstep << " --> SzX=" << sz[0] << endl; sa_size_t step = dstep; sa_size_t off = doff; TArray< T2 > ac(ndim, sz, (T2 *)(a.Data()), step, off, db); ac.SetMemoryMapping(a.GetMemoryMapping()); ac.SetTemp(true); return ac; } //****************************************** // cast de contenu - sans conversion - tableau complex vers float template TArray ArrCastC2R(TArray< complex > & a) { T x = 0; return ArrayCast(a, x); } //****************************************** // cast de contenu - sans conversion - tableau float vers complex template TArray< complex > ArrCastR2C(TArray< T > & a) { complex x = 0; // return ArrayCast< TArray< T > , complex > (a, x); return ArrayCast(a, x); } //****************************************** // Acces a la partie reelle d'un tableau complex - en shared data template TArray SDRealPart(TArray< complex > & a) { T x = 0; return ArrayCast(a, x, 0, 2); } //****************************************** // Acces a la partie imaginaire d'un tableau complex - en shared data template TArray SDImagPart(TArray< complex > & a) { T x = 0; return ArrayCast(a, x, 1, 2); } #endif