File indexing completed on 2024-04-06 12:21:53
0001 #ifndef L1Trigger_TrackFindingTracklet_interface_CircularBuffer_h
0002 #define L1Trigger_TrackFindingTracklet_interface_CircularBuffer_h
0003
0004 #include <cassert>
0005 #include <vector>
0006
0007 namespace trklet {
0008
0009 template <class T>
0010 class CircularBuffer {
0011 public:
0012 CircularBuffer(unsigned int nbits) {
0013 size_ = 1 << nbits;
0014 buffer_.resize(size_);
0015 reset();
0016 }
0017
0018 ~CircularBuffer() = default;
0019
0020 void reset() {
0021 rptr_ = 0;
0022 wptr_ = 0;
0023 }
0024
0025
0026 bool full() const { return ((wptr_ + 1) % size_) == rptr_; }
0027
0028
0029 bool almostfull() const { return (((wptr_ + 1) % size_) == rptr_) || (((wptr_ + 2) % size_) == rptr_); }
0030
0031
0032 bool nearfull() const {
0033 return (((wptr_ + 1) % size_) == rptr_) || (((wptr_ + 2) % size_) == rptr_) || (((wptr_ + 3) % size_) == rptr_);
0034 }
0035
0036
0037 bool empty() const { return wptr_ == rptr_; }
0038
0039 const T& read() {
0040 assert(!empty());
0041 unsigned int oldrptr = rptr_;
0042 rptr_ = (rptr_ + 1) % size_;
0043 return buffer_[oldrptr];
0044 }
0045
0046 const T& peek() const {
0047 assert(!empty());
0048 return buffer_[rptr_];
0049 }
0050
0051 void store(T element) {
0052 assert(!full());
0053 buffer_[wptr_++] = element;
0054 wptr_ = wptr_ % size_;
0055 assert(wptr_ != rptr_);
0056 }
0057
0058
0059 unsigned int rptr() const { return rptr_; }
0060 unsigned int wptr() const { return wptr_; }
0061
0062 private:
0063 std::vector<T> buffer_;
0064
0065
0066 unsigned int size_;
0067
0068
0069 unsigned int rptr_;
0070 unsigned int wptr_;
0071 };
0072 };
0073 #endif