# HG changeset patch # User Hasan Yavuz ÖZDERYA # Date 2018-09-25 16:38:30 # Node ID 7dd5ac90961fb227543dce5a696f054816bd9334 # Parent 2541096f1ba6bbdbedd6ceaf538f63fa2b7a8a12 optimized search for findIndex diff --git a/src/framebuffer.h b/src/framebuffer.h --- a/src/framebuffer.h +++ b/src/framebuffer.h @@ -61,4 +61,24 @@ class WFrameBuffer : public ResizableBuf virtual void clear() = 0; }; +/** + * Abstract base class for X buffers. + * + * These buffers only contain increasing or equal (to previous) values. + */ +class XFrameBuffer : public ResizableBuffer +{ +public: + enum Index {OUT_OF_RANGE = -1}; + + /** + * Finds index for given value. + * + * If given value is bigger than max or smaller than minimum + * returns `OUT_OF_RANGE`. If it's in between values, smaller + * index is returned (not closer one). + */ + virtual int findIndex(double value) const = 0; +}; + #endif // FRAMEBUFFER_H diff --git a/src/indexbuffer.cpp b/src/indexbuffer.cpp --- a/src/indexbuffer.cpp +++ b/src/indexbuffer.cpp @@ -1,5 +1,5 @@ /* - Copyright © 2017 Hasan Yavuz Özderya + Copyright © 2018 Hasan Yavuz Özderya This file is part of serialplot. @@ -47,3 +47,15 @@ Range IndexBuffer::limits() const { return Range{0, _size-1.}; } + +int IndexBuffer::findIndex(double value) const +{ + if (value < 0 || value > size() - 1) + { + return OUT_OF_RANGE; + } + else + { + return value; + } +} diff --git a/src/indexbuffer.h b/src/indexbuffer.h --- a/src/indexbuffer.h +++ b/src/indexbuffer.h @@ -26,15 +26,16 @@ /// sample value. /// /// @note This buffer isn't for storing data. -class IndexBuffer : public ResizableBuffer +class IndexBuffer : public XFrameBuffer { public: IndexBuffer(unsigned n); - unsigned size() const; - double sample(unsigned i) const; - Range limits() const; - void resize(unsigned n); + unsigned size() const override; + double sample(unsigned i) const override; + Range limits() const override; + void resize(unsigned n) override; + int findIndex(double value) const override; private: unsigned _size; diff --git a/src/stream.cpp b/src/stream.cpp --- a/src/stream.cpp +++ b/src/stream.cpp @@ -31,7 +31,8 @@ Stream::Stream(unsigned nc, bool x, unsi _hasx = x; if (x) { - xData = new RingBuffer(ns); + // TODO: implement XRingBuffer (binary search) + Q_ASSERT(false); } else { @@ -118,7 +119,8 @@ void Stream::setNumChannels(unsigned nc, { if (x) { - xData = new RingBuffer(_numSamples); + // TODO: implement XRingBuffer (binary search) + Q_ASSERT(false); } else { @@ -191,7 +193,9 @@ void Stream::feedIn(const SamplePack& pa unsigned ns = pack.numSamples(); if (_hasx) { - static_cast(xData)->addSamples(pack.xData(), ns); + // TODO: implement XRingBuffer (binary search) + Q_ASSERT(false); + // static_cast(xData)->addSamples(pack.xData(), ns); } // modified pack that gain and offset is applied to diff --git a/src/stream.h b/src/stream.h --- a/src/stream.h +++ b/src/stream.h @@ -93,7 +93,7 @@ private: bool _paused; bool _hasx; - ResizableBuffer* xData; + XFrameBuffer* xData; QList channels; ChannelInfoModel _infoModel; diff --git a/src/streamchannel.cpp b/src/streamchannel.cpp --- a/src/streamchannel.cpp +++ b/src/streamchannel.cpp @@ -20,7 +20,7 @@ #include #include "streamchannel.h" -StreamChannel::StreamChannel(unsigned i, const FrameBuffer* x, +StreamChannel::StreamChannel(unsigned i, const XFrameBuffer* x, FrameBuffer* y, ChannelInfoModel* info) { _index = i; @@ -38,15 +38,19 @@ unsigned StreamChannel::index() const {r QString StreamChannel::name() const {return _info->name(_index);}; QColor StreamChannel::color() const {return _info->color(_index);}; bool StreamChannel::visible() const {return _info->isVisible(_index);}; -const FrameBuffer* StreamChannel::xData() const {return _x;} +const XFrameBuffer* StreamChannel::xData() const {return _x;} const FrameBuffer* StreamChannel::yData() const {return _y;} FrameBuffer* StreamChannel::yData() {return _y;} const ChannelInfoModel* StreamChannel::info() const {return _info;} -void StreamChannel::setX(const FrameBuffer* x) {_x = x;}; +void StreamChannel::setX(const XFrameBuffer* x) {_x = x;}; + +#include double StreamChannel::findValue(double x) const { - int index = findIndex(x); + // int index = findIndex(x); + int index = _x->findIndex(x); + qDebug() << x << ":" << index; if (index >= 0) return _y->sample(index); else diff --git a/src/streamchannel.h b/src/streamchannel.h --- a/src/streamchannel.h +++ b/src/streamchannel.h @@ -35,7 +35,7 @@ public: * @param info channel info model */ StreamChannel(unsigned i, - const FrameBuffer* x, + const XFrameBuffer* x, FrameBuffer* y, ChannelInfoModel* info); ~StreamChannel(); @@ -44,18 +44,18 @@ public: QString name() const; QColor color() const; bool visible() const; - const FrameBuffer* xData() const; + const XFrameBuffer* xData() const; FrameBuffer* yData(); const FrameBuffer* yData() const; const ChannelInfoModel* info() const; - void setX(const FrameBuffer* x); + void setX(const XFrameBuffer* x); /// Returns sample value for closest X double findValue(double x) const; private: unsigned _index; - const FrameBuffer* _x; + const XFrameBuffer* _x; FrameBuffer* _y; ChannelInfoModel* _info;