Lunchbox  1.4.0
indexIterator.h
00001 
00002 /* Copyright (c) 2011-2012, EPFL/Blue Brain Project
00003  *                          Stefan Eilemann <stefan.eilemann@epfl.ch> 
00004  *
00005  * This file is part of Lunchbox <https://github.com/BlueBrain/Lunchbox>
00006  *
00007  * This library is free software; you can redistribute it and/or modify it under
00008  * the terms of the GNU Lesser General Public License version 3.0 as published
00009  * by the Free Software Foundation.
00010  *  
00011  * This library is distributed in the hope that it will be useful, but WITHOUT
00012  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00013  * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
00014  * details.
00015  * 
00016  * You should have received a copy of the GNU Lesser General Public License
00017  * along with this library; if not, write to the Free Software Foundation, Inc.,
00018  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
00019  */
00020 
00021 #ifndef LUNCHBOX_INDEXITERATOR_H
00022 #define LUNCHBOX_INDEXITERATOR_H
00023 
00024 namespace lunchbox
00025 {
00026 
00035 template< class S, class C, class T > class IndexIterator
00036     : public std::iterator< std::random_access_iterator_tag, T >
00037 {
00038 public:
00039     IndexIterator( C* container, const size_t i )
00040             : container_( container ), i_(i) {}
00041     IndexIterator( const S& from )
00042             : container_( from.container_ ), i_( from.i_ ) {}
00043     template< class U, class V, class W >
00044     IndexIterator( const IndexIterator< U, V, W >& from )
00045             : container_( from.container_ ), i_( from.i_ ) {}
00046 
00047     S& operator = ( const IndexIterator& rhs )
00048         {
00049             container_ = rhs.container_;
00050             i_ = rhs.i_;
00051             return *static_cast< S* >( this );
00052         }
00053 
00054     template< class U, class W > 
00055     S& operator = ( const IndexIterator< S, U, W >& rhs )
00056         {
00057             container_ = rhs.container_;
00058             i_ = rhs.i_;
00059             return *static_cast< S* >( this );
00060         }
00061 
00062     S& operator ++() { ++i_; return *static_cast< S* >( this ); }
00063     S& operator --() { --i_; return *static_cast< S* >( this ); }
00064     S operator ++ (int) { return S( container_, i_++ ); }
00065     S operator -- (int) { return S( container_, i_-- ); }
00066 
00067     S operator + ( const size_t& n ) const 
00068         { return S( container_, i_+n ); }
00069     S& operator += ( const size_t& n )
00070         { i_ += n; return *static_cast< S* >( this ); }
00071 
00072     S operator - ( const size_t& n ) const
00073         { return S( container_, i_-n ); }
00074     S& operator -= ( const size_t& n )
00075         { i_ -= n; return *static_cast< S* >( this ); }
00076 
00077     ssize_t operator- ( const S& n ) const { return i_ - n.i_; }
00078 
00079     bool operator == ( const S& rhs ) const 
00080         { return container_ == rhs.container_ && i_ == rhs.i_; }
00081     bool operator != ( const S& rhs ) const
00082         { return container_ != rhs.container_ || i_ != rhs.i_; }
00083     bool operator < ( const S& rhs ) const
00084         { return container_ <= rhs.container_ && i_ < rhs.i_; }
00085     bool operator > ( const S& rhs ) const
00086         { return container_ >= rhs.container_ && i_ > rhs.i_; }
00087     bool operator <= ( const S& rhs ) const
00088         { return container_ <= rhs.container_ && i_ <= rhs.i_; }
00089     bool operator >= ( const S& rhs ) const
00090         { return container_ >= rhs.container_ && i_ >= rhs.i_; }
00091 
00092     size_t getPosition() const { return i_; }
00093 
00094 protected:
00095     C* container_;
00096     size_t i_;
00097 
00098     // template copy ctor
00099     template< class, class, class > friend class IndexIterator;
00100 
00101 private:
00102     IndexIterator();
00103 };
00104 
00105 }
00106 
00107 #endif // LUNCHBOX_INDEXITERATOR_H