diff --git a/source/buffer.cpp b/source/buffer.cpp index 9c5f231..33a64b6 100644 --- a/source/buffer.cpp +++ b/source/buffer.cpp @@ -106,19 +106,38 @@ size_t RingBuffer::readCompositeLength() const { * If write is ahead then it's the simple distance again. If read is ahead it's * until the end of the buffer/segment */ -size_t RingBuffer::readSegmentLength() const { - return writePosition() < readPosition() - ? (buffer.size() - readPosition()) +size_t RingBuffer::readSegmentLength(size_t offset) const { + assert(offset <= readCompositeLength(); + offset = std::min(offset, readCompositeLength()); + + size_t read_offset = readPosition() + offset; + read_offset = read_offset >= buffer.size() ? read_offset - buffer.size() : read_offset; + + // case 1 write is located before read and reached read + // then offset can be used normally + // case 2 write is located at read, but read reached write + // then it is set to zero by readCompositeLength() + // case 3 write is located after read + // since std::min you can use simple subtraction + + + /// @todo it can happen that read_offset wrapped around the ring buffer + /// In that case it had to calculate ```writePosition() - read_offset``` + /// + /// Also the remaining read_composite size may be relevant + return writePosition() < read_offset + ? (buffer.size() - read_offset) : (write_reached_read - ? (buffer.size() - readPosition()) + ? (buffer.size() - read_offset) : writePosition() - - readPosition()); //(writePosition() - + read_offset); //(writePosition() - // readPosition()) : //(write_reached_read ? () : 0 ); } void RingBuffer::readAdvance(size_t bytes) { assert(bytes <= readCompositeLength()); + bytes = std::min(bytes, readCompositeLength()); size_t advanced = read_position + bytes; read_position = advanced >= buffer.size() ? advanced - buffer.size() : advanced; diff --git a/source/buffer.h b/source/buffer.h index 6810423..79f812c 100644 --- a/source/buffer.h +++ b/source/buffer.h @@ -20,7 +20,7 @@ protected: public: virtual size_t readPosition() const = 0; virtual size_t readCompositeLength() const = 0; - virtual size_t readSegmentLength() const = 0; + virtual size_t readSegmentLength(size_t offset = 0) const = 0; virtual void readAdvance(size_t bytes) = 0; virtual uint8_t &read(size_t i = 0) = 0; @@ -28,7 +28,7 @@ public: virtual size_t writePosition() const = 0; virtual size_t writeCompositeLength() const = 0; - virtual size_t writeSegmentLength() const = 0; + virtual size_t writeSegmentLength(size_t offset = 0) const = 0; virtual void writeAdvance(size_t bytes) = 0; virtual uint8_t &write(size_t i = 0) = 0; @@ -76,7 +76,7 @@ public: size_t readPosition() const override; size_t readCompositeLength() const override; - size_t readSegmentLength() const override; + size_t readSegmentLength(size_t offset = 0) const override; void readAdvance(size_t bytes) override; uint8_t &read(size_t i = 0) override; @@ -84,7 +84,7 @@ public: size_t writePosition() const override; size_t writeCompositeLength() const override; - size_t writeSegmentLength() const override; + size_t writeSegmentLength(size_t offset = 0) const override; void writeAdvance(size_t bytes) override; uint8_t &write(size_t i = 0) override; @@ -108,7 +108,7 @@ public: size_t readPosition() const override; size_t readCompositeLength() const override; - size_t readSegmentLength() const override; + size_t readSegmentLength(size_t offset = 0) const override; void readAdvance(size_t bytes) override; uint8_t &read(size_t i = 0) override; @@ -116,7 +116,7 @@ public: size_t writePosition() const override; size_t writeCompositeLength() const override; - size_t writeSegmentLength() const override; + size_t writeSegmentLength(size_t offset = 0) const override; void writeAdvance(size_t bytes) override; uint8_t &write(size_t i = 0) override; @@ -137,7 +137,7 @@ public: size_t readPosition() const override; size_t readCompositeLength() const override; - size_t readSegmentLength() const override; + size_t readSegmentLength(size_t offset = 0) const override; void readAdvance(size_t bytes) override; uint8_t &read(size_t i = 0) override; @@ -145,7 +145,7 @@ public: size_t writePosition() const override; size_t writeCompositeLength() const override; - size_t writeSegmentLength() const override; + size_t writeSegmentLength(size_t offset = 0) const override; void writeAdvance(size_t bytes) override; uint8_t &write(size_t i = 0) override;