NuriKit v0.1.0b2
Loading...
Searching...
No Matches
linear_queue.h
Go to the documentation of this file.
1//
2// Project NuriKit - Copyright 2025 SNU Compbio Lab.
3// SPDX-License-Identifier: Apache-2.0
4//
5
6#ifndef NURI_CORE_CONTAINER_LINEAR_QUEUE_H_
7#define NURI_CORE_CONTAINER_LINEAR_QUEUE_H_
8
10#include <utility>
11
12#include <absl/log/absl_check.h>
14
15namespace nuri {
16namespace internal {
17 template <class C>
18 class LinearQueue {
19 public:
20 using value_type = typename C::value_type;
21
22 explicit LinearQueue(C &&container) noexcept
23 : container_(std::move(container)) {
24 clear();
25 }
26
27 bool empty() const { return lp_ >= rp_; }
28
29 int size() const { return rp_ - lp_; }
30
31 auto capacity() const { return container_.size(); }
32
33 value_type &front() {
34 ABSL_DCHECK_LT(lp_, rp_);
35 return container_[lp_];
36 }
37
38 const value_type &front() const {
39 ABSL_DCHECK_LT(lp_, rp_);
40 return container_[lp_];
41 }
42
43 value_type &back() {
44 ABSL_DCHECK_LT(lp_, rp_);
45 return container_[rp_ - 1];
46 }
47
48 const value_type &back() const {
49 ABSL_DCHECK_LT(lp_, rp_);
50 return container_[rp_ - 1];
51 }
52
53 void push(const value_type &v) {
54 ABSL_DCHECK_LT(rp_, capacity());
55 container_[rp_++] = v;
56 }
57
58 void push(value_type &&v) {
59 ABSL_DCHECK_LT(rp_, capacity());
60 container_[rp_++] = std::move(v);
61 }
62
63 value_type pop() {
64 ABSL_DCHECK_LT(lp_, rp_);
65 return std::move(container_[lp_++]);
66 }
67
68 void clear() noexcept { lp_ = rp_ = 0; }
69
70 C &container() { return container_; }
71 const C &container() const { return container_; }
72
73 private:
74 C container_;
75 int lp_;
76 int rp_;
77 };
78
79 template <class C>
80 LinearQueue(C &&container) -> LinearQueue<C>;
81
82 template <class C>
83 LinearQueue(const LinearQueue<C> &) -> LinearQueue<C>;
84
85 template <class C>
86 LinearQueue(LinearQueue<C> &&) -> LinearQueue<C>;
87} // namespace internal
88} // namespace nuri
89
90#endif /* NURI_CORE_CONTAINER_LINEAR_QUEUE_H_ */
Definition crdgen.h:16