#ifndef INCLUDED_CIRQUEPARTIAL_H_ #define INCLUDED_CIRQUEPARTIAL_H_ #include #include "cirque.h" template class CirQue> { using DataVect = std::vector; DataVect d_data; size_t d_size; using iterator = typename DataVect::iterator; iterator d_front; iterator d_back; public: using value_type = Data; using value_type = const &const_reference; enum Exception { EMPTY, FULL }; CirQue(); CirQue(DataVect const &iv); CirQue(CirQue const &other); CirQue &operator=(CirQue const &other); Data &back(); Data &front(); bool empty() const; bool full() const; size_t maxSize() const; size_t size() const; void pop_front(); void push_back(Data const &object); void swap(CirQue &other); private: iterator inc(iterator const &iter); }; template CirQue>::CirQue() : d_size(0) {} template CirQue>::CirQue(DataVect const &iv) : d_data(iv), d_size(iv.size()), d_front(d_data.begin()), d_back(d_data.begin()) {} template CirQue>::CirQue(CirQue const &other) : d_data(other.d_data), d_size(other.d_size), d_front(d_data.begin() + (other.d_front - other.d_data.begin())), d_back(d_data.begin() + (other.d_back - other.d_data.begin())) {} template CirQue> &CirQue>::operator=( CirQue const &rhs) { CirQue tmp(rhs); swap(tmp); } template void CirQue>::swap(CirQue &other) { char tmp[sizeof(CirQue)]; memcpy(tmp, &other, sizeof(CirQue)); memcpy(reinterpret_cast(&other), this, sizeof(CirQue)); memcpy(reinterpret_cast(this), tmp, sizeof(CirQue)); } template void CirQue>::pop_front() { if (d_size == 0) throw EMPTY; d_front = inc(d_front); --d_size; } template void CirQue>::push_back(Data const &object) { if (d_size == d_data.size()) throw FULL; *d_back = object; d_back = inc(d_back); ++d_size; } template inline Data &CirQue>::back() { return d_back == d_data.begin() ? d_data.back() : d_back[-1]; } template inline Data &CirQue>::front() { return *d_front; } template typename CirQue>::iterator CirQue>::inc( CirQue>::iterator const &iter) { iterator tmp(iter + 1); tmp = tmp == d_data.end() ? d_data.begin() : tmp; return tmp; } #endif