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