Changeset - 5e8115ecea3b
[Not reviewed]
longmem
0 3 0
Hasan Yavuz ÖZDERYA - 6 years ago 2020-01-29 15:27:34
hy@ozderya.net
make chunked buffer based on FrameBuffer
3 files changed with 35 insertions and 24 deletions:
0 comments (0 inline, 0 general)
src/chunkedbuffer.cpp
Show inline comments
 
/*
 
  Copyright © 2017 Hasan Yavuz Özderya
 
  Copyright © 2020 Hasan Yavuz Özderya
 

	
 
  This file is part of serialplot.
 

	
 
@@ -36,11 +36,11 @@ ChunkedBuffer::~ChunkedBuffer()
 
    }
 
}
 

	
 
void ChunkedBuffer::addSamples(double* samples, size_t size)
 
void ChunkedBuffer::addSamples(double* samples, unsigned n)
 
{
 
    size_t i = 0;
 

	
 
    while (i < size)
 
    while (i < n)
 
    {
 
        // select chunk to add data
 
        auto chunk = chunks.last();
 
@@ -50,12 +50,12 @@ void ChunkedBuffer::addSamples(double* s
 
        }
 

	
 
        // add data to chunk
 
        size_t c = std::min(chunk->left(), (size - i));
 
        size_t c = std::min(chunk->left(), (n - i));
 
        chunk->addSamples(&samples[i], c);
 
        i += c;
 
    }
 

	
 
    _size += size;
 
    _size += n;
 
}
 

	
 
void ChunkedBuffer::clear()
 
@@ -81,12 +81,12 @@ DataChunk* ChunkedBuffer::addNewChunk()
 
    return chunk;
 
}
 

	
 
size_t ChunkedBuffer::size() const
 
unsigned ChunkedBuffer::size() const
 
{
 
    return _size;
 
}
 

	
 
QRectF ChunkedBuffer::boundingRect() const
 
Range ChunkedBuffer::limits() const
 
{
 
    // TODO: it should be possible to cache boundingRect and only
 
    // update on 'addSamples' and when dropping chunks
 
@@ -100,12 +100,17 @@ QRectF ChunkedBuffer::boundingRect() con
 
        ymax = std::max(ymax, c->max());
 
    }
 

	
 
    return QRectF(0, ymax, _size, (ymax-ymin));
 
    return {ymin, ymax};
 
}
 

	
 
double ChunkedBuffer::sample(size_t i) const
 
double ChunkedBuffer::sample(unsigned i) const
 
{
 
    int chunk_index = i / CHUNK_SIZE;
 
    int chunk_offset = i % CHUNK_SIZE;
 
    return chunks[chunk_index]->sample(chunk_offset);
 
}
 

	
 
void ChunkedBuffer::resize(unsigned n)
 
{
 
    // TODO what to do for ChunkedBuffer::resize
 
}
src/chunkedbuffer.h
Show inline comments
 
/*
 
  Copyright © 2017 Hasan Yavuz Özderya
 
  Copyright © 2020 Hasan Yavuz Özderya
 

	
 
  This file is part of serialplot.
 

	
 
@@ -25,22 +25,23 @@
 
#include <QVector>
 

	
 
#include "datachunk.h"
 
#include "framebuffer.h"
 

	
 
#define CHUNK_SIZE (1024)
 

	
 
class ChunkedBuffer
 
class ChunkedBuffer : public WFrameBuffer
 
{
 
public:
 
    ChunkedBuffer();
 
    ~ChunkedBuffer();
 

	
 
    void addSamples(double* samples, size_t size);
 
    void clear();
 

	
 
    // QwtSeriesData related implementations
 
    size_t size() const;
 
    QRectF boundingRect() const;
 
    double sample(size_t i) const;
 
    // FrameBuffer related implementations
 
    virtual unsigned size() const;
 
    virtual double sample(unsigned i) const;
 
    virtual Range limits() const;
 
    virtual void resize(unsigned n);
 
    virtual void addSamples(double* samples, unsigned n);
 
    virtual void clear();
 

	
 
private:
 
    size_t _size; // size of `data`
tests/test.cpp
Show inline comments
 
/*
 
  Copyright © 2018 Hasan Yavuz Özderya
 
  Copyright © 2020 Hasan Yavuz Özderya
 

	
 
  This file is part of serialplot.
 

	
 
@@ -454,7 +454,8 @@ TEST_CASE("ChunkedBuffer created empty",
 
    ChunkedBuffer b;
 

	
 
    REQUIRE(b.size() == 0);
 
    REQUIRE(b.boundingRect() == QRectF(0,0,0,0));
 
    REQUIRE(b.limits().start == 0);
 
    REQUIRE(b.limits().end == 0);
 
}
 

	
 
TEST_CASE("ChunkedBuffer adding data and clearing", "[memory]")
 
@@ -467,24 +468,28 @@ TEST_CASE("ChunkedBuffer adding data and
 
    b.addSamples(samples, N);
 

	
 
    REQUIRE(b.size() == N);
 
    REQUIRE(b.boundingRect() == QRectF(0,10,N,9));
 
    REQUIRE(b.limits().start == 1);
 
    REQUIRE(b.limits().end == 10);
 

	
 
    // add data to fill the chunk
 
    double samples2[CHUNK_SIZE-N] = {0};
 
    b.addSamples(samples2, CHUNK_SIZE-N);
 
    REQUIRE(b.size() == CHUNK_SIZE);
 
    REQUIRE(b.boundingRect() == QRectF(0,10,CHUNK_SIZE,10));
 
    REQUIRE(b.limits().start == 0);
 
    REQUIRE(b.limits().end == 10);
 

	
 
    // add data for second chunk
 
    b.addSamples(samples, N);
 
    REQUIRE(b.size() == CHUNK_SIZE+N);
 
    REQUIRE(b.boundingRect() == QRectF(0,10,CHUNK_SIZE+N,10));
 
    REQUIRE(b.limits().start == 0);
 
    REQUIRE(b.limits().end == 10);
 

	
 
    // add more data to make it 4 chunks
 
    double samples3[CHUNK_SIZE*3-N] = {0};
 
    b.addSamples(samples3, CHUNK_SIZE*3-N);
 
    REQUIRE(b.size() == CHUNK_SIZE*4);
 
    REQUIRE(b.boundingRect() == QRectF(0,10,CHUNK_SIZE*4,10));
 
    REQUIRE(b.limits().start == 0);
 
    REQUIRE(b.limits().end == 10);
 

	
 
    // clear
 
    b.clear();
0 comments (0 inline, 0 general)