STL Memory Versioning
vs_queue.h
Go to the documentation of this file.
1 #ifndef _VS_QUEUE_H
2 #define _VS_QUEUE_H
3 
4 #include <functional>
5 #include <queue>
6 #include <initializer_list>
7 #include <iterator>
8 
9 #include "versioned.h"
10 #include "revision.h"
11 #include "strategy.h"
12 
13 namespace vs
14 {
15 
16  template<typename _Key>
17  class vs_queue_strategy;
18 
25  template<typename _Key, typename _Strategy = vs_queue_strategy<_Key>>
26  class vs_queue
27  {
28 
29  static_assert(vs::IsMergeStrategy<_Strategy, std::queue<_Key>>,
30  "Provided invalid strategy class in template");
31 
32  public:
33  /* public typedefs */
34 
36  typedef std::queue<_Key>::size_type size_type;
37 
38  private:
39 
40  _Versioned _v_q;
41 
42  public:
43 
44  /* ------------------ Constructors ----------------------*/
48  explicit
50  : _v_q(std::queue<_Key>()) { }
51 
60  vs_queue(std::initializer_list<_Key> __l)
61  : _v_q(std::queue<_Key>())
62  {
63  _v_q.Set(_v_q.Get(),
64  [&](std::queue<_Key>& _queue){
65  for (auto& i: __l){
66  _queue.push(i);
67  }
68  return true;
69  });
70  }
71 
77  vs_queue(const vs_queue& __vs_queue)
78  : _v_q(__vs_queue._v_q.Get()) { }
79 
80  //* @brief %queue move constructor
81 
82  //* @brief Builds a %queue from a range.
83 
84  /* ------------------ Accessors ----------------------*/
85 
92  const _Key&
93  front() const
94  { return _v_q.Get().front(); }
95 
101  const _Key&
103  { return _v_q.Get().back(); }
104 
105 
109  size_type
110  size() const noexcept
111  { return _v_q.Get().size(); }
112 
113  /* ------------------ Operators ----------------------*/
114 
119  void
120  push(const _Key& __x)
121  {
122  _v_q.Set(_v_q.Get(), [&](std::queue<_Key>& _queue){ _queue.push(__x); return true; });
123  }
124 
128  void
129  pop()
130  {
131  if (_v_q.Get().size() > 0)
132  _v_q.Set(_v_q.Get(), [](std::queue<_Key>& _queue){ _queue.pop(); return true; });
133  }
134  // = (copy)
135  // = {}
136  };
137 
145  template<typename _Key>
147  {
148  public:
149 
150  void
151  merge(std::queue<_Key>& dst, std::queue<_Key>& src)
152  {
153  while (src.size() > 0)
154  {
155  dst.push(src.front());
156  src.pop();
157  }
158  }
159 
160  void
161  merge_same_element(std::queue<_Key>& dst, _Key& dstk, _Key& srck)
162  {
163  dst.push(srck);
164  }
165 
166  };
167 
168  template<typename _Key>
169  std::ostream& operator << (std::ostream& os, vs_queue<_Key> const& value) {
170  vs_queue<_Key> temp = value;
171 
172  std::ostringstream o;
173  o << "{ ";
174  while (temp.size() != 0) {
175  o << temp.front();
176  temp.pop();
177  if (temp.size() != 0) {
178  o << ", ";
179  }
180  }
181  o << " }";
182 
183  os << o.str();
184  return os;
185  }
186 
187 }
188 
189 #endif
Wrapper to make any class Versioned.
Definition: versioned.h:53
const T & Get() const
Get the current value of the object in the current Revision.
Definition: versioned.h:186
bool Set(const T &v, const std::function< bool(T &)> &updater=nullptr)
Set new value of the object.
Definition: versioned.h:205
simpliest determenistic merge strategy.
Definition: vs_queue.h:147
void merge_same_element(std::queue< _Key > &dst, _Key &dstk, _Key &srck)
Definition: vs_queue.h:161
void merge(std::queue< _Key > &dst, std::queue< _Key > &src)
Definition: vs_queue.h:151
A versioned mimic of a stl::queue, suitable for multithread.
Definition: vs_queue.h:27
Versioned< std::queue< _Key >, _Strategy > _Versioned
Definition: vs_queue.h:30
vs_queue(const vs_queue &__vs_queue)
vs_queue copy constructor
Definition: vs_queue.h:77
void push(const _Key &__x)
Attempts to push an element into the queue.
Definition: vs_queue.h:120
const _Key & back()
end reference
Definition: vs_queue.h:102
size_type size() const noexcept
size of underlying queue
Definition: vs_queue.h:110
void pop()
Remove first element of queue.
Definition: vs_queue.h:129
std::queue< _Key >::size_type size_type
Definition: vs_queue.h:36
vs_queue(std::initializer_list< _Key > __l)
Builds a vs_queue from an initializer_list.
Definition: vs_queue.h:60
vs_queue()
Creates a vs_queue with no elements.
Definition: vs_queue.h:49
const _Key & front() const
begin constant reference
Definition: vs_queue.h:93
Definition: strategy.h:6
std::ostream & operator<<(std::ostream &os, vs_queue< _Key > const &value)
Definition: vs_queue.h:169
concept IsMergeStrategy
Concept for compile-time type checking passed user strategies.
Definition: strategy.h:12
Implementation of the class Revision.
Implementation of the Versioned classes and interface.