Subordination
A framework for distributed programming
queue_popper.hh
1 #ifndef SUBORDINATION_BASE_QUEUE_POPPER_HH
2 #define SUBORDINATION_BASE_QUEUE_POPPER_HH
3 
4 #include <iterator>
5 
6 #include <subordination/base/container_traits.hh>
7 
8 namespace sbn {
9 
19  template <class Container, class Traits=queue_traits<Container>>
21  public std::iterator<std::input_iterator_tag, typename Container::value_type>{
22 
23  private:
24  typedef typename Container::value_type cont_value_type;
26  base_type;
27 
28  public:
29  using typename base_type::iterator_category;
30  using typename base_type::value_type;
31  using typename base_type::pointer;
32  using typename base_type::reference;
33  using typename base_type::difference_type;
34 
35  public:
37  typedef Container container_type;
39  typedef Traits traits_type;
40 
41  private:
42  container_type* _container = nullptr;
43 
44  public:
45 
47  inline explicit constexpr
49  _container(&x) {}
50 
51  inline constexpr
52  queue_pop_iterator() noexcept = default;
53 
55  inline constexpr
56  queue_pop_iterator(const queue_pop_iterator& rhs) noexcept = default;
57 
64  inline bool
65  operator==(const queue_pop_iterator&) const noexcept {
66  return this->_container->empty();
67  }
68 
73  inline bool
74  operator!=(const queue_pop_iterator& rhs) const noexcept {
75  return !this->operator==(rhs);
76  }
77 
79  inline const value_type&
80  operator*() const noexcept {
81  return traits_type::front(*this->_container);
82  }
83 
85  inline const value_type*
86  operator->() const noexcept {
87  return &traits_type::front(*this->_container);
88  }
89 
91  inline queue_pop_iterator&
92  operator++() noexcept {
93  traits_type::pop(*this->_container);
94  return *this;
95  }
96 
101  inline queue_pop_iterator&
102  operator++(int) {
103  throw
104  std::logic_error("can not post increment sbn::queue_pop_iterator");
105  return *this;
106  }
107 
108  };
109 
115  template<class C>
116  inline queue_pop_iterator<C>
117  queue_popper(C& cont) noexcept {
118  return queue_pop_iterator<C>(cont);
119  }
120 
126  template<class C>
127  inline queue_pop_iterator<C>
128  queue_popper_end(C&) noexcept {
129  return queue_pop_iterator<C>();
130  }
131 
136  template<class C>
137  inline queue_pop_iterator<C,priority_queue_traits<C>>
138  priority_queue_popper(C& cont) noexcept {
139  return queue_pop_iterator<C,priority_queue_traits<C>>(cont);
140  }
141 
146  template<class C>
147  inline queue_pop_iterator<C,priority_queue_traits<C>>
148  priority_queue_popper_end(C&) noexcept {
149  return queue_pop_iterator<C,priority_queue_traits<C>>();
150  }
151 
156  template<class C>
157  inline queue_pop_iterator<C,deque_traits<C>>
158  deque_popper(C& cont) noexcept {
159  return queue_pop_iterator<C,deque_traits<C>>(cont);
160  }
161 
166  template<class C>
167  inline queue_pop_iterator<C,deque_traits<C>>
168  deque_popper_end(C&) noexcept {
169  return queue_pop_iterator<C,deque_traits<C>>();
170  }
171 
172 }
173 
174 #endif // vim:filetype=cpp
Traits traits_type
Container traits type.
Definition: queue_popper.hh:39
queue_pop_iterator & operator++(int)
Impossible to implement.
Definition: queue_popper.hh:102
Container container_type
Container type.
Definition: queue_popper.hh:37
queue_pop_iterator & operator++() noexcept
Remove element from the container.
Definition: queue_popper.hh:92
constexpr queue_pop_iterator(container_type &x) noexcept
Construct queue pop iterator from container x.
Definition: queue_popper.hh:48
bool operator!=(const queue_pop_iterator &rhs) const noexcept
Returns true, if the container is not empty.
Definition: queue_popper.hh:74
Input iterator that removes element from the container on increment.
Definition: queue_popper.hh:20
bool operator==(const queue_pop_iterator &) const noexcept
Returns true, if the container is empty.
Definition: queue_popper.hh:65
const value_type & operator *() const noexcept
Dereference.
Definition: queue_popper.hh:80
const value_type * operator->() const noexcept
Dereference.
Definition: queue_popper.hh:86