%PDF- %PDF-
Direktori : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/base/ |
Current File : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/base/ring-buffer.h |
// Copyright 2016 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_BASE_RING_BUFFER_H_ #define V8_BASE_RING_BUFFER_H_ #include <cstdint> namespace v8::base { template <typename T, uint8_t _SIZE = 10> class RingBuffer final { public: static constexpr uint8_t kSize = _SIZE; constexpr RingBuffer() = default; RingBuffer(const RingBuffer&) = delete; RingBuffer& operator=(const RingBuffer&) = delete; constexpr void Push(const T& value) { elements_[pos_++] = value; if (pos_ == kSize) { pos_ = 0; is_full_ = true; } } constexpr uint8_t Size() const { return is_full_ ? kSize : pos_; } constexpr bool Empty() const { return Size() == 0; } constexpr void Clear() { pos_ = 0; is_full_ = false; } template <typename Callback> constexpr T Reduce(Callback callback, const T& initial) const { T result = initial; for (uint8_t i = pos_; i > 0; --i) { result = callback(result, elements_[i - 1]); } if (!is_full_) { return result; } for (uint8_t i = kSize; i > pos_; --i) { result = callback(result, elements_[i - 1]); } return result; } private: T elements_[kSize]; uint8_t pos_ = 0; bool is_full_ = false; }; } // namespace v8::base #endif // V8_BASE_RING_BUFFER_H_