00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef ESTAR_SDEQUE_HPP
00022 #define ESTAR_SDEQUE_HPP
00023
00024
00025 #include <deque>
00026 #include <stdexcept>
00027
00028
00029 namespace estar {
00030
00031
00032 template<typename value_t>
00033 class sdeque
00034 {
00035 public:
00036 typedef std::deque<value_t> deque_t;
00037 typedef typename deque_t::iterator iterator;
00038 typedef typename deque_t::const_iterator const_iterator;
00039
00040 sdeque(): m_ibegin(0), m_iend(0) {}
00041
00042 sdeque(sdeque const & orig)
00043 : m_ibegin(orig.m_ibegin), m_iend(orig.m_iend), m_deque(orig.m_deque) {}
00044
00045 value_t & at(ssize_t ii)
00046 { return m_deque.at(static_cast<size_t>(ii - m_ibegin)); }
00047
00048 value_t const & at(ssize_t ii) const
00049 { return m_deque.at(static_cast<size_t>(ii - m_ibegin)); }
00050
00051 void resize_begin(ssize_t ibegin, value_t const & value) {
00052 if (ibegin > m_iend)
00053 throw std::out_of_range("estar::sdeque::resize_begin() range error");
00054 ssize_t delta(m_ibegin - ibegin);
00055 m_ibegin = ibegin;
00056 if (0 < delta)
00057 m_deque.insert(m_deque.begin(), static_cast<size_t>(delta), value);
00058 else if (0 > delta)
00059 m_deque.erase(m_deque.begin(),
00060 m_deque.begin() + static_cast<size_t>(-delta));
00061
00062 }
00063
00064 void resize_begin(ssize_t ibegin) { resize_begin(ibegin, value_t()); }
00065
00066 void resize_end(ssize_t iend, value_t const & value) {
00067 if (iend < m_ibegin)
00068 throw std::out_of_range("estar::sdeque::resize_end() range error");
00069 m_iend = iend;
00070 m_deque.resize(static_cast<size_t>(m_iend - m_ibegin), value);
00071 }
00072
00073 void resize_end(ssize_t iend) { resize_end(iend, value_t()); }
00074
00078 void resize(ssize_t ibegin, ssize_t iend, value_t const & value) {
00079 resize_begin(ibegin, value);
00080 resize_end(iend, value);
00081 }
00082
00083 void resize(ssize_t ibegin, ssize_t iend)
00084 { resize(ibegin, iend, value_t()); }
00085
00086 ssize_t ibegin() const { return m_ibegin; }
00087
00088 ssize_t iend() const { return m_iend; }
00089
00090 deque_t const & get() const { return m_deque; }
00091
00092 iterator begin() { return m_deque.begin(); }
00093
00094 const_iterator begin() const { return m_deque.begin(); }
00095
00096 iterator end() { return m_deque.end(); }
00097
00098 const_iterator end() const { return m_deque.end(); }
00099
00100 protected:
00101 ssize_t m_ibegin, m_iend;
00102 deque_t m_deque;
00103 };
00104
00105 }
00106
00107 #endif // ESTAR_SDEQUE_HPP