Chris@102: // Copyright (C) 2013 Vicente J. Botet Escriba Chris@102: // Chris@102: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@102: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@102: // Chris@102: // 2013/10 Vicente J. Botet Escriba Chris@102: // Creation. Chris@102: Chris@102: #ifndef BOOST_CSBL_DEVECTOR_HPP Chris@102: #define BOOST_CSBL_DEVECTOR_HPP Chris@102: Chris@102: #include Chris@102: Chris@102: #include Chris@102: #include Chris@102: Chris@102: namespace boost Chris@102: { Chris@102: namespace csbl Chris@102: { Chris@102: template Chris@102: class devector Chris@102: { Chris@102: typedef vector vector_type; Chris@102: vector data_; Chris@102: std::size_t front_index_; Chris@102: Chris@102: BOOST_COPYABLE_AND_MOVABLE(devector) Chris@102: Chris@102: template Chris@102: void priv_push_back(BOOST_FWD_REF(U) x) Chris@102: { data_.push_back(boost::forward(x)); } Chris@102: Chris@102: public: Chris@102: typedef typename vector_type::size_type size_type; Chris@102: typedef typename vector_type::reference reference; Chris@102: typedef typename vector_type::const_reference const_reference; Chris@102: Chris@102: Chris@102: devector() : front_index_(0) {} Chris@102: devector(devector const& x) BOOST_NOEXCEPT Chris@102: : data_(x.data_), Chris@102: front_index_(x.front_index_) Chris@102: {} Chris@102: devector(BOOST_RV_REF(devector) x) BOOST_NOEXCEPT Chris@102: : data_(boost::move(x.data_)), Chris@102: front_index_(x.front_index_) Chris@102: {} Chris@102: Chris@102: devector& operator=(BOOST_COPY_ASSIGN_REF(devector) x) Chris@102: { Chris@102: if (&x != this) Chris@102: { Chris@102: data_ = x.data_; Chris@102: front_index_ = x.front_index_; Chris@102: } Chris@102: return *this; Chris@102: } Chris@102: Chris@102: devector& operator=(BOOST_RV_REF(devector) x) Chris@102: BOOST_NOEXCEPT_IF(vector::allocator_traits_type::propagate_on_container_move_assignment::value) Chris@102: { Chris@102: data_ = boost::move(x.data_); Chris@102: front_index_ = x.front_index_; Chris@102: return *this; Chris@102: } Chris@102: Chris@102: bool empty() const BOOST_NOEXCEPT Chris@102: { return data_.size() == front_index_; } Chris@102: Chris@102: size_type size() const BOOST_NOEXCEPT Chris@102: { return data_.size() - front_index_; } Chris@102: Chris@102: reference front() BOOST_NOEXCEPT Chris@102: { return data_[front_index_]; } Chris@102: Chris@102: const_reference front() const BOOST_NOEXCEPT Chris@102: { return data_[front_index_]; } Chris@102: Chris@102: reference back() BOOST_NOEXCEPT Chris@102: { return data_.back(); } Chris@102: Chris@102: const_reference back() const BOOST_NOEXCEPT Chris@102: { return data_.back(); } Chris@102: Chris@102: BOOST_MOVE_CONVERSION_AWARE_CATCH(push_back, T, void, priv_push_back) Chris@102: Chris@102: void pop_front() Chris@102: { Chris@102: ++front_index_; Chris@102: if (empty()) { Chris@102: data_.clear(); Chris@102: front_index_=0; Chris@102: } Chris@102: } Chris@102: Chris@102: }; Chris@102: } Chris@102: } Chris@102: #endif // header