diff --git a/src/readonlybuffer.cpp b/src/readonlybuffer.cpp new file mode 100644 --- /dev/null +++ b/src/readonlybuffer.cpp @@ -0,0 +1,103 @@ +/* + Copyright © 2018 Hasan Yavuz Özderya + + This file is part of serialplot. + + serialplot is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + serialplot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with serialplot. If not, see . +*/ + +#include +#include + +#include "readonlybuffer.h" + +ReadOnlyBuffer::ReadOnlyBuffer(const FrameBuffer* source) : + ReadOnlyBuffer(source, 0, source->size()) +{ + // intentionally empty, see ↑ +} + +ReadOnlyBuffer::ReadOnlyBuffer(const FrameBuffer* source, unsigned start, unsigned n) +{ + Q_ASSERT(source->size() > 0); + Q_ASSERT(start + n <= source->size()); + + _size = n; + data = new double[_size]; + + for (unsigned i = 0; i < n; i++) + { + data[i] = source->sample(start + i); + } + + /// if not exact copy of source re-calculate limits + if (start == 0 && n == source->size()) + { + _limits = source->limits(); + } + else + { + updateLimits(); + } +} + +ReadOnlyBuffer::ReadOnlyBuffer(const double* source, unsigned ssize) +{ + Q_ASSERT(source != nullptr && ssize); + + _size = ssize; + data = new double[_size]; + memcpy(data, source, sizeof(double) * ssize); + updateLimits(); +} + +ReadOnlyBuffer::~ReadOnlyBuffer() +{ + delete[] data; +} + +unsigned ReadOnlyBuffer::size() const +{ + return _size; +} + +double ReadOnlyBuffer::sample(unsigned i) const +{ + return data[i]; +} + +Range ReadOnlyBuffer::limits() const +{ + return _limits; +} + +void ReadOnlyBuffer::updateLimits() +{ + Q_ASSERT(_size); + + _limits.start = data[0]; + _limits.end = data[0]; + + for (unsigned i = 0; i < _size; i++) + { + if (data[i] > _limits.end) + { + _limits.end = data[i]; + } + else if (data[i] < _limits.start) + { + _limits.start = data[i]; + } + } +}