#include "xy.h"
/* Plotdaten können in allgemeiner Form übergeben werden:
- Datentyp int8_t, int16_t, int32_t, int64_t, float, double,
bool, uint8_t, uint16_t, Funktionszeiger
getrennt für X und Y
- XY-Daten getrennt oder verschachtelt
*/
static int fINF=0x000000FF;
static int fNAN=0xFFFFFFFF;
#define INF (*(float*)fINF);
#define NAN (*(float*)fNAN);
template<class T> class Datareader{ // <T> ist "float" oder "double"
static T takeint(int val,int infbase) {
int infnan=val-infbase;
if ((unsigned)infnan>=3) return val;
switch (infnan) {
case 0: return +INF;
case 2: return -INF;
default: return NAN;
}
}
public:
T takeu8() const {return *data.cb;}
T takeu16() const {return *data.ch;}
T takeu32() const {return *data.cw;}
T takei8() const {return takeint(*data.cc,0x7F);}
T takei16() const {return takeint(*data.cs,0x7FFF);}
T takei32() const {return takeint(*data.cl,0x7FFFFFFF);}
T takefloat() const {return *data.cf;}
T takedouble() const {return *data.cd;}
typedef T (Datareader::*getfcn)() const;
enum typ{
U8,U16,U32,I8,I16,I32,F32,F64
};
static getfcn getters[]; // Liste der 8 Entnahmefunktionen
DATA data; // Laufender Datenzeiger
getfcn getter; // Aktuelle Entnahmefunktion (statt einem Rudel abgeleiteter Klassen)
int increment; // Sprungweite des Datenzeigers in Bytes
// Parameterliste: Datenzeiger, Werttyp, Sprungweite des Zeigers zum nächsten Wert in Bytes
Datareader(const void*_data,typ _typ,int _increment) {
data.cv=_data;
getter=getters[_typ]; // Funktionszeiger setzen
increment=_increment;
}
T operator()() {
T r=getter(); // Problem!!
data.cb+=increment;
return r;
}
};
Datareader<double>::getfcn Datareader<double>::getters[]={
&Datareader::takeu8,
&Datareader::takeu16,
&Datareader::takeu32,
&Datareader::takei8,
&Datareader::takei16,
&Datareader::takei32,
&Datareader::takefloat,
&Datareader::takedouble};
#include <stdio.h>
void test() {
static const float data[]={1,2,3,4};
Datareader<double> dr(data,Datareader<double>::F32,sizeof(float));
double t=dr.getter(); // Problem!!
for (int i=0; i<elemof(data); i++) printf("%f",dr());
}
Detected encoding: ANSI (CP1252) | 4
|
|