Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef QWT_SERIES_DATA_H
00011 #define QWT_SERIES_DATA_H 1
00012
00013 #include "qwt_global.h"
00014 #include "qwt_samples.h"
00015 #include "qwt_point_3d.h"
00016 #include "qwt_point_polar.h"
00017 #include <qvector.h>
00018 #include <qrect.h>
00019
00046 template <typename T>
00047 class QwtSeriesData
00048 {
00049 public:
00051 QwtSeriesData();
00052
00054 virtual ~QwtSeriesData();
00055
00057 virtual size_t size() const = 0;
00058
00064 virtual T sample( size_t i ) const = 0;
00065
00078 virtual QRectF boundingRect() const = 0;
00079
00091 virtual void setRectOfInterest( const QRectF &rect );
00092
00093 protected:
00095 mutable QRectF d_boundingRect;
00096
00097 private:
00098 QwtSeriesData<T> &operator=( const QwtSeriesData<T> & );
00099 };
00100
00101 template <typename T>
00102 QwtSeriesData<T>::QwtSeriesData():
00103 d_boundingRect( 0.0, 0.0, -1.0, -1.0 )
00104 {
00105 }
00106
00107 template <typename T>
00108 QwtSeriesData<T>::~QwtSeriesData()
00109 {
00110 }
00111
00112 template <typename T>
00113 void QwtSeriesData<T>::setRectOfInterest( const QRectF & )
00114 {
00115 }
00116
00123 template <typename T>
00124 class QwtArraySeriesData: public QwtSeriesData<T>
00125 {
00126 public:
00128 QwtArraySeriesData();
00129
00134 explicit QwtArraySeriesData( const QVector<T> &samples );
00135
00140 void setSamples( const QVector<T> &samples );
00141
00143 const QVector<T> samples() const;
00144
00146 virtual size_t size() const;
00147
00154 virtual T sample( size_t index ) const;
00155
00156 protected:
00158 QVector<T> d_samples;
00159 };
00160
00161 template <typename T>
00162 QwtArraySeriesData<T>::QwtArraySeriesData()
00163 {
00164 }
00165
00166 template <typename T>
00167 QwtArraySeriesData<T>::QwtArraySeriesData( const QVector<T> &samples ):
00168 d_samples( samples )
00169 {
00170 }
00171
00172 template <typename T>
00173 void QwtArraySeriesData<T>::setSamples( const QVector<T> &samples )
00174 {
00175 QwtSeriesData<T>::d_boundingRect = QRectF( 0.0, 0.0, -1.0, -1.0 );
00176 d_samples = samples;
00177 }
00178
00179 template <typename T>
00180 const QVector<T> QwtArraySeriesData<T>::samples() const
00181 {
00182 return d_samples;
00183 }
00184
00185 template <typename T>
00186 size_t QwtArraySeriesData<T>::size() const
00187 {
00188 return d_samples.size();
00189 }
00190
00191 template <typename T>
00192 T QwtArraySeriesData<T>::sample( size_t i ) const
00193 {
00194 return d_samples[ static_cast<int>( i ) ];
00195 }
00196
00198 class QWT_EXPORT QwtPointSeriesData: public QwtArraySeriesData<QPointF>
00199 {
00200 public:
00201 QwtPointSeriesData(
00202 const QVector<QPointF> & = QVector<QPointF>() );
00203
00204 virtual QRectF boundingRect() const;
00205 };
00206
00208 class QWT_EXPORT QwtPoint3DSeriesData: public QwtArraySeriesData<QwtPoint3D>
00209 {
00210 public:
00211 QwtPoint3DSeriesData(
00212 const QVector<QwtPoint3D> & = QVector<QwtPoint3D>() );
00213 virtual QRectF boundingRect() const;
00214 };
00215
00217 class QWT_EXPORT QwtIntervalSeriesData: public QwtArraySeriesData<QwtIntervalSample>
00218 {
00219 public:
00220 QwtIntervalSeriesData(
00221 const QVector<QwtIntervalSample> & = QVector<QwtIntervalSample>() );
00222
00223 virtual QRectF boundingRect() const;
00224 };
00225
00227 class QWT_EXPORT QwtSetSeriesData: public QwtArraySeriesData<QwtSetSample>
00228 {
00229 public:
00230 QwtSetSeriesData(
00231 const QVector<QwtSetSample> & = QVector<QwtSetSample>() );
00232
00233 virtual QRectF boundingRect() const;
00234 };
00235
00239 class QWT_EXPORT QwtTradingChartData: public QwtArraySeriesData<QwtOHLCSample>
00240 {
00241 public:
00242 QwtTradingChartData(
00243 const QVector<QwtOHLCSample> & = QVector<QwtOHLCSample>() );
00244
00245 virtual QRectF boundingRect() const;
00246 };
00247
00248 QWT_EXPORT QRectF qwtBoundingRect(
00249 const QwtSeriesData<QPointF> &, int from = 0, int to = -1 );
00250
00251 QWT_EXPORT QRectF qwtBoundingRect(
00252 const QwtSeriesData<QwtPoint3D> &, int from = 0, int to = -1 );
00253
00254 QWT_EXPORT QRectF qwtBoundingRect(
00255 const QwtSeriesData<QwtPointPolar> &, int from = 0, int to = -1 );
00256
00257 QWT_EXPORT QRectF qwtBoundingRect(
00258 const QwtSeriesData<QwtIntervalSample> &, int from = 0, int to = -1 );
00259
00260 QWT_EXPORT QRectF qwtBoundingRect(
00261 const QwtSeriesData<QwtSetSample> &, int from = 0, int to = -1 );
00262
00263 QWT_EXPORT QRectF qwtBoundingRect(
00264 const QwtSeriesData<QwtOHLCSample> &, int from = 0, int to = -1 );
00265
00324 template <typename T, typename LessThan>
00325 inline int qwtUpperSampleIndex( const QwtSeriesData<T> &series,
00326 double value, LessThan lessThan )
00327 {
00328 const int indexMax = series.size() - 1;
00329
00330 if ( indexMax < 0 || !lessThan( value, series.sample( indexMax ) ) )
00331 return -1;
00332
00333 int indexMin = 0;
00334 int n = indexMax;
00335
00336 while ( n > 0 )
00337 {
00338 const int half = n >> 1;
00339 const int indexMid = indexMin + half;
00340
00341 if ( lessThan( value, series.sample( indexMid ) ) )
00342 {
00343 n = half;
00344 }
00345 else
00346 {
00347 indexMin = indexMid + 1;
00348 n -= half + 1;
00349 }
00350 }
00351
00352 return indexMin;
00353 }
00354
00355 #endif