| /* |
| * Copyright (C) 2013 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef ART_RUNTIME_BASE_BOUNDED_FIFO_H_ |
| #define ART_RUNTIME_BASE_BOUNDED_FIFO_H_ |
| |
| #include "cutils/atomic.h" |
| #include "cutils/atomic-inline.h" |
| |
| namespace art { |
| |
| // A bounded fifo is a fifo which has a bounded size. The power of two version uses a bit mask to |
| // avoid needing to deal with wrapping integers around or using a modulo operation. |
| template <typename T, const size_t MaxSize> |
| class BoundedFifoPowerOfTwo { |
| public: |
| BoundedFifoPowerOfTwo() { |
| // TODO: Do this with a compile time check. |
| CHECK(IsPowerOfTwo(MaxSize)); |
| clear(); |
| } |
| |
| void clear() { |
| back_index_ = 0; |
| size_ = 0; |
| } |
| |
| bool empty() const { |
| return size() == 0; |
| } |
| |
| size_t size() const { |
| return size_; |
| } |
| |
| void push_back(const T& value) { |
| ++size_; |
| DCHECK_LE(size_, MaxSize); |
| // Relies on integer overflow behaviour. |
| data_[back_index_++ & mask_] = value; |
| } |
| |
| const T& front() const { |
| DCHECK_GT(size_, 0U); |
| return data_[(back_index_ - size_) & mask_]; |
| } |
| |
| void pop_front() { |
| DCHECK_GT(size_, 0U); |
| --size_; |
| } |
| |
| private: |
| static const size_t mask_ = MaxSize - 1; |
| size_t back_index_, size_; |
| T data_[MaxSize]; |
| }; |
| |
| } // namespace art |
| |
| #endif // ART_RUNTIME_BASE_BOUNDED_FIFO_H_ |