Source file: /~heha/ewa/Ofen/prozess.zip/plot.cpp

#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
Wrong umlauts? - Assume file is ANSI (CP1252) encoded