changing the offset seg length

This commit is contained in:
keldu 2021-03-04 17:35:26 +01:00
parent 39cc7706dc
commit 09ec4f8451
2 changed files with 32 additions and 13 deletions

View File

@ -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;

View File

@ -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;