Chris@102
|
1 // Copyright (C) 2013 Vicente J. Botet Escriba
|
Chris@102
|
2 //
|
Chris@102
|
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
|
Chris@102
|
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@102
|
5 //
|
Chris@102
|
6 // 2013/10 Vicente J. Botet Escriba
|
Chris@102
|
7 // Creation.
|
Chris@102
|
8
|
Chris@102
|
9 #ifndef BOOST_CSBL_DEVECTOR_HPP
|
Chris@102
|
10 #define BOOST_CSBL_DEVECTOR_HPP
|
Chris@102
|
11
|
Chris@102
|
12 #include <boost/config.hpp>
|
Chris@102
|
13
|
Chris@102
|
14 #include <boost/thread/csbl/vector.hpp>
|
Chris@102
|
15 #include <boost/move/detail/move_helpers.hpp>
|
Chris@102
|
16
|
Chris@102
|
17 namespace boost
|
Chris@102
|
18 {
|
Chris@102
|
19 namespace csbl
|
Chris@102
|
20 {
|
Chris@102
|
21 template <class T>
|
Chris@102
|
22 class devector
|
Chris@102
|
23 {
|
Chris@102
|
24 typedef vector<T> vector_type;
|
Chris@102
|
25 vector<T> data_;
|
Chris@102
|
26 std::size_t front_index_;
|
Chris@102
|
27
|
Chris@102
|
28 BOOST_COPYABLE_AND_MOVABLE(devector)
|
Chris@102
|
29
|
Chris@102
|
30 template <class U>
|
Chris@102
|
31 void priv_push_back(BOOST_FWD_REF(U) x)
|
Chris@102
|
32 { data_.push_back(boost::forward<U>(x)); }
|
Chris@102
|
33
|
Chris@102
|
34 public:
|
Chris@102
|
35 typedef typename vector_type::size_type size_type;
|
Chris@102
|
36 typedef typename vector_type::reference reference;
|
Chris@102
|
37 typedef typename vector_type::const_reference const_reference;
|
Chris@102
|
38
|
Chris@102
|
39
|
Chris@102
|
40 devector() : front_index_(0) {}
|
Chris@102
|
41 devector(devector const& x) BOOST_NOEXCEPT
|
Chris@102
|
42 : data_(x.data_),
|
Chris@102
|
43 front_index_(x.front_index_)
|
Chris@102
|
44 {}
|
Chris@102
|
45 devector(BOOST_RV_REF(devector) x) BOOST_NOEXCEPT
|
Chris@102
|
46 : data_(boost::move(x.data_)),
|
Chris@102
|
47 front_index_(x.front_index_)
|
Chris@102
|
48 {}
|
Chris@102
|
49
|
Chris@102
|
50 devector& operator=(BOOST_COPY_ASSIGN_REF(devector) x)
|
Chris@102
|
51 {
|
Chris@102
|
52 if (&x != this)
|
Chris@102
|
53 {
|
Chris@102
|
54 data_ = x.data_;
|
Chris@102
|
55 front_index_ = x.front_index_;
|
Chris@102
|
56 }
|
Chris@102
|
57 return *this;
|
Chris@102
|
58 }
|
Chris@102
|
59
|
Chris@102
|
60 devector& operator=(BOOST_RV_REF(devector) x)
|
Chris@102
|
61 BOOST_NOEXCEPT_IF(vector<T>::allocator_traits_type::propagate_on_container_move_assignment::value)
|
Chris@102
|
62 {
|
Chris@102
|
63 data_ = boost::move(x.data_);
|
Chris@102
|
64 front_index_ = x.front_index_;
|
Chris@102
|
65 return *this;
|
Chris@102
|
66 }
|
Chris@102
|
67
|
Chris@102
|
68 bool empty() const BOOST_NOEXCEPT
|
Chris@102
|
69 { return data_.size() == front_index_; }
|
Chris@102
|
70
|
Chris@102
|
71 size_type size() const BOOST_NOEXCEPT
|
Chris@102
|
72 { return data_.size() - front_index_; }
|
Chris@102
|
73
|
Chris@102
|
74 reference front() BOOST_NOEXCEPT
|
Chris@102
|
75 { return data_[front_index_]; }
|
Chris@102
|
76
|
Chris@102
|
77 const_reference front() const BOOST_NOEXCEPT
|
Chris@102
|
78 { return data_[front_index_]; }
|
Chris@102
|
79
|
Chris@102
|
80 reference back() BOOST_NOEXCEPT
|
Chris@102
|
81 { return data_.back(); }
|
Chris@102
|
82
|
Chris@102
|
83 const_reference back() const BOOST_NOEXCEPT
|
Chris@102
|
84 { return data_.back(); }
|
Chris@102
|
85
|
Chris@102
|
86 BOOST_MOVE_CONVERSION_AWARE_CATCH(push_back, T, void, priv_push_back)
|
Chris@102
|
87
|
Chris@102
|
88 void pop_front()
|
Chris@102
|
89 {
|
Chris@102
|
90 ++front_index_;
|
Chris@102
|
91 if (empty()) {
|
Chris@102
|
92 data_.clear();
|
Chris@102
|
93 front_index_=0;
|
Chris@102
|
94 }
|
Chris@102
|
95 }
|
Chris@102
|
96
|
Chris@102
|
97 };
|
Chris@102
|
98 }
|
Chris@102
|
99 }
|
Chris@102
|
100 #endif // header
|