estar/sdeque.hpp

Go to the documentation of this file.
00001 /* 
00002  * Copyright (C) 2007 Roland Philippsen <roland dot philippsen at gmx net>
00003  * 
00004  * This program is free software; you can redistribute it and/or modify
00005  * it under the terms of the GNU General Public License as published by
00006  * the Free Software Foundation; either version 2 of the License, or
00007  * (at your option) any later version.
00008  * 
00009  * This program is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  * GNU General Public License for more details.
00013  * 
00014  * You should have received a copy of the GNU General Public License
00015  * along with this program; if not, write to the Free Software
00016  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00017  * USA
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       // else nothing to do
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

doxygen SourceForge.net Logo
E* Interpolated Graph Replanner Wed Dec 12 18:55:40 2007