diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2017-05-18 13:42:56 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-18 13:42:56 +0200 |
commit | c2854381b3250d4067ec051f7b8f198f4e414bf2 (patch) | |
tree | 4d15816d5b686d6574f872084864345de463273a | |
parent | 871b6b5517a8d4e7105a19e44b219a8283cb34f7 (diff) | |
parent | 803a54d93c78630929352d01a2ea7fcce0c5e590 (diff) |
Merge pull request #8649 from neikeq/pr-ringbuffer-find
RingBuffer: Adds find() method
-rw-r--r-- | core/ring_buffer.h | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/core/ring_buffer.h b/core/ring_buffer.h index d5085e9560..8b32bb5e10 100644 --- a/core/ring_buffer.h +++ b/core/ring_buffer.h @@ -101,6 +101,32 @@ public: return p_size; }; + int find(const T &t, int p_offset, int p_max_size) { + + int left = data_left(); + if ((p_offset + p_max_size) > left) { + p_max_size -= left - p_offset; + if (p_max_size <= 0) + return 0; + } + p_max_size = MIN(left, p_max_size); + int pos = read_pos; + inc(pos, p_offset); + int to_read = p_max_size; + while (to_read) { + int end = pos + to_read; + end = MIN(end, size()); + int total = end - pos; + for (int i = 0; i < total; i++) { + if (data[pos + i] == t) + return i + (p_max_size - to_read); + }; + to_read -= total; + pos = 0; + } + return -1; + } + inline int advance_read(int p_n) { p_n = MIN(p_n, data_left()); inc(read_pos, p_n); |