# qwt_series_data.h

    00001 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
    00002  * Qwt Widget Library
    00003  * Copyright (C) 1997   Josef Wilgen
    00004  * Copyright (C) 2002   Uwe Rathmann
    00005  *
    00006  * This library is free software; you can redistribute it and/or
    00007  * modify it under the terms of the Qwt License, Version 1.0
    00008  *****************************************************************************/
    00009
    00010 #ifndef QWT_SERIES_DATA_H
    00011 #define QWT_SERIES_DATA_H 1
    00012
    00013 #include "qwt_global.h"
    00014 #include "qwt_interval.h"
    00015 #include "qwt_point_3d.h"
    00016 #include "qwt_point_polar.h"
    00017 #include <qvector.h>
    00018 #include <qrect.h>
    00019
    00021 class QWT_EXPORT QwtIntervalSample
    00022 {
    00023 public:
    00024     QwtIntervalSample();
    00025     QwtIntervalSample( double, const QwtInterval & );
    00026     QwtIntervalSample( double value, double min, double max );
    00027
    00028     bool operator==( const QwtIntervalSample & ) const;
    00029     bool operator!=( const QwtIntervalSample & ) const;
    00030
    00032     double value;
    00033
    00035     QwtInterval interval;
    00036 };
    00037
    00042 inline QwtIntervalSample::QwtIntervalSample():
    00043     value( 0.0 )
    00044 {
    00045 }
    00046
    00048 inline QwtIntervalSample::QwtIntervalSample(
    00049         double v, const QwtInterval &intv ):
    00050     value( v ),
    00051     interval( intv )
    00052 {
    00053 }
    00054
    00056 inline QwtIntervalSample::QwtIntervalSample(
    00057         double v, double min, double max ):
    00058     value( v ),
    00059     interval( min, max )
    00060 {
    00061 }
    00062
    00064 inline bool QwtIntervalSample::operator==(
    00065     const QwtIntervalSample &other ) const
    00066 {
    00067     return value == other.value && interval == other.interval;
    00068 }
    00069
    00071 inline bool QwtIntervalSample::operator!=(
    00072     const QwtIntervalSample &other ) const
    00073 {
    00074     return !( *this == other );
    00075 }
    00076
    00078 class QWT_EXPORT QwtSetSample
    00079 {
    00080 public:
    00081     QwtSetSample();
    00082     bool operator==( const QwtSetSample &other ) const;
    00083     bool operator!=( const QwtSetSample &other ) const;
    00084
    00086     double value;
    00087
    00089     QVector<double> set;
    00090 };
    00091
    00096 inline QwtSetSample::QwtSetSample():
    00097     value( 0.0 )
    00098 {
    00099 }
    00100
    00102 inline bool QwtSetSample::operator==( const QwtSetSample &other ) const
    00103 {
    00104     return value == other.value && set == other.set;
    00105 }
    00106
    00108 inline bool QwtSetSample::operator!=( const QwtSetSample &other ) const
    00109 {
    00110     return !( *this == other );
    00111 }
    00112
    00121 template <typename T>
    00122 class QwtSeriesData
    00123 {
    00124 public:
    00125     QwtSeriesData();
    00126     virtual ~QwtSeriesData();
    00127
    00129     virtual size_t size() const = 0;
    00130
    00136     virtual T sample( size_t i ) const = 0;
    00137
    00148     virtual QRectF boundingRect() const = 0;
    00149
    00150     virtual void setRectOfInterest( const QRectF & );
    00151
    00152 protected:
    00154     mutable QRectF d_boundingRect;
    00155
    00156 private:
    00157     QwtSeriesData<T> &operator=( const QwtSeriesData<T> & );
    00158 };
    00159
    00161 template <typename T>
    00162 QwtSeriesData<T>::QwtSeriesData():
    00163     d_boundingRect( 0.0, 0.0, -1.0, -1.0 )
    00164 {
    00165 }
    00166
    00168 template <typename T>
    00169 QwtSeriesData<T>::~QwtSeriesData()
    00170 {
    00171 }
    00172
    00182 template <typename T>
    00183 void QwtSeriesData<T>::setRectOfInterest( const QRectF & )
    00184 {
    00185 }
    00186
    00193 template <typename T>
    00194 class QwtArraySeriesData: public QwtSeriesData<T>
    00195 {
    00196 public:
    00197     QwtArraySeriesData();
    00198     QwtArraySeriesData( const QVector<T> & );
    00199
    00200     void setSamples( const QVector<T> & );
    00201     const QVector<T> samples() const;
    00202
    00203     virtual size_t size() const;
    00204     virtual T sample( size_t ) const;
    00205
    00206 protected:
    00208     QVector<T> d_samples;
    00209 };
    00210
    00212 template <typename T>
    00213 QwtArraySeriesData<T>::QwtArraySeriesData()
    00214 {
    00215 }
    00216
    00221 template <typename T>
    00222 QwtArraySeriesData<T>::QwtArraySeriesData( const QVector<T> &samples ):
    00223     d_samples( samples )
    00224 {
    00225 }
    00226
    00231 template <typename T>
    00232 void QwtArraySeriesData<T>::setSamples( const QVector<T> &samples )
    00233 {
    00234     QwtSeriesData<T>::d_boundingRect = QRectF( 0.0, 0.0, -1.0, -1.0 );
    00235     d_samples = samples;
    00236 }
    00237
    00239 template <typename T>
    00240 const QVector<T> QwtArraySeriesData<T>::samples() const
    00241 {
    00242     return d_samples;
    00243 }
    00244
    00246 template <typename T>
    00247 size_t QwtArraySeriesData<T>::size() const
    00248 {
    00249     return d_samples.size();
    00250 }
    00251
    00257 template <typename T>
    00258 T QwtArraySeriesData<T>::sample( size_t i ) const
    00259 {
    00260     return d_samples[i];
    00261 }
    00262
    00264 class QWT_EXPORT QwtPointSeriesData: public QwtArraySeriesData<QPointF>
    00265 {
    00266 public:
    00267     QwtPointSeriesData(
    00268         const QVector<QPointF> & = QVector<QPointF>() );
    00269
    00270     virtual QRectF boundingRect() const;
    00271 };
    00272
    00274 class QWT_EXPORT QwtPoint3DSeriesData: public QwtArraySeriesData<QwtPoint3D>
    00275 {
    00276 public:
    00277     QwtPoint3DSeriesData(
    00278         const QVector<QwtPoint3D> & = QVector<QwtPoint3D>() );
    00279     virtual QRectF boundingRect() const;
    00280 };
    00281
    00283 class QWT_EXPORT QwtIntervalSeriesData: public QwtArraySeriesData<QwtIntervalSample>
    00284 {
    00285 public:
    00286     QwtIntervalSeriesData(
    00287         const QVector<QwtIntervalSample> & = QVector<QwtIntervalSample>() );
    00288
    00289     virtual QRectF boundingRect() const;
    00290 };
    00291
    00293 class QWT_EXPORT QwtSetSeriesData: public QwtArraySeriesData<QwtSetSample>
    00294 {
    00295 public:
    00296     QwtSetSeriesData(
    00297         const QVector<QwtSetSample> & = QVector<QwtSetSample>() );
    00298
    00299     virtual QRectF boundingRect() const;
    00300 };
    00301
    00305 class QWT_EXPORT QwtPointArrayData: public QwtSeriesData<QPointF>
    00306 {
    00307 public:
    00308     QwtPointArrayData( const QVector<double> &x, const QVector<double> &y );
    00309     QwtPointArrayData( const double *x, const double *y, size_t size );
    00310
    00311     virtual QRectF boundingRect() const;
    00312
    00313     virtual size_t size() const;
    00314     virtual QPointF sample( size_t i ) const;
    00315
    00316     const QVector<double> &xData() const;
    00317     const QVector<double> &yData() const;
    00318
    00319 private:
    00320     QVector<double> d_x;
    00321     QVector<double> d_y;
    00322 };
    00323
    00327 class QWT_EXPORT QwtCPointerData: public QwtSeriesData<QPointF>
    00328 {
    00329 public:
    00330     QwtCPointerData( const double *x, const double *y, size_t size );
    00331
    00332     virtual QRectF boundingRect() const;
    00333     virtual size_t size() const;
    00334     virtual QPointF sample( size_t i ) const;
    00335
    00336     const double *xData() const;
    00337     const double *yData() const;
    00338
    00339 private:
    00340     const double *d_x;
    00341     const double *d_y;
    00342     size_t d_size;
    00343 };
    00344
    00397 class QWT_EXPORT QwtSyntheticPointData: public QwtSeriesData<QPointF>
    00398 {
    00399 public:
    00400     QwtSyntheticPointData( size_t size,
    00401         const QwtInterval & = QwtInterval() );
    00402
    00403     void setSize( size_t size );
    00404     size_t size() const;
    00405
    00406     void setInterval( const QwtInterval& );
    00407     QwtInterval interval() const;
    00408
    00409     virtual QRectF boundingRect() const;
    00410     virtual QPointF sample( size_t i ) const;
    00411
    00418     virtual double y( double x ) const = 0;
    00419     virtual double x( uint index ) const;
    00420
    00421     virtual void setRectOfInterest( const QRectF & );
    00422     QRectF rectOfInterest() const;
    00423
    00424 private:
    00425     size_t d_size;
    00426     QwtInterval d_interval;
    00427     QRectF d_rectOfInterest;
    00428     QwtInterval d_intervalOfInterest;
    00429 };
    00430
    00431 QWT_EXPORT QRectF qwtBoundingRect(
    00432     const QwtSeriesData<QPointF> &, int from = 0, int to = -1 );
    00433 QWT_EXPORT QRectF qwtBoundingRect(
    00434     const QwtSeriesData<QwtPoint3D> &, int from = 0, int to = -1 );
    00435 QWT_EXPORT QRectF qwtBoundingRect(
    00436     const QwtSeriesData<QwtPointPolar> &, int from = 0, int to = -1 );
    00437 QWT_EXPORT QRectF qwtBoundingRect(
    00438     const QwtSeriesData<QwtIntervalSample> &, int from = 0, int to = -1 );
    00439 QWT_EXPORT QRectF qwtBoundingRect(
    00440     const QwtSeriesData<QwtSetSample> &, int from = 0, int to = -1 );
    00441
    00442 #endif