Changeset - 6b388219977e
[Not reviewed]
longmem
0 1 0
Hasan Yavuz Ă–ZDERYA - 6 years ago 2020-02-18 16:05:06
hy@ozderya.net
add assert
1 file changed with 3 insertions and 0 deletions:
0 comments (0 inline, 0 general)
src/chunkedbuffer.cpp
Show inline comments
 
@@ -15,48 +15,49 @@
 

	
 
  You should have received a copy of the GNU General Public License
 
  along with serialplot.  If not, see <http://www.gnu.org/licenses/>.
 
*/
 

	
 
#include "chunkedbuffer.h"
 

	
 
ChunkedBuffer::ChunkedBuffer()
 
{
 
    numChunks = 0;
 
    _size = 0;
 

	
 
    // create first chunk
 
    addNewChunk();
 
}
 

	
 
ChunkedBuffer::~ChunkedBuffer()
 
{
 
    for (auto chunk : chunks)
 
    {
 
        delete chunk;
 
    }
 
}
 

	
 
// TODO: we should have a max size for chunkedbuffer
 
void ChunkedBuffer::addSamples(double* samples, unsigned n)
 
{
 
    size_t i = 0;
 

	
 
    while (i < n)
 
    {
 
        // select chunk to add data
 
        auto chunk = chunks.last();
 
        if (chunk->isFull())
 
        {
 
            chunk = addNewChunk(); // create a new chunk
 
        }
 

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

	
 
    _size += n;
 
}
 

	
 
void ChunkedBuffer::clear()
 
{
 
@@ -84,33 +85,35 @@ DataChunk* ChunkedBuffer::addNewChunk()
 
unsigned ChunkedBuffer::size() const
 
{
 
    return _size;
 
}
 

	
 
Range ChunkedBuffer::limits() const
 
{
 
    // TODO: it should be possible to cache boundingRect and only
 
    // update on 'addSamples' and when dropping chunks
 

	
 
    // find ymin and ymax
 
    double ymin = chunks.first()->min();
 
    double ymax = chunks.first()->max();
 
    for (auto c : chunks)
 
    {
 
        ymin = std::min(ymin, c->min());
 
        ymax = std::max(ymax, c->max());
 
    }
 

	
 
    return {ymin, ymax};
 
}
 

	
 
double ChunkedBuffer::sample(unsigned i) const
 
{
 
    Q_ASSERT(i < _size);
 

	
 
    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
 
}
0 comments (0 inline, 0 general)