00001 #ifndef IGUANA_FRAMEWORK_MAP_UNIQUE_ITERATOR_H
00002 # define IGUANA_FRAMEWORK_MAP_UNIQUE_ITERATOR_H
00003
00004
00005
00006 # include "Iguana/Framework/interface/config.h"
00007 # include <iterator>
00008
00009
00010
00011
00012
00013
00014
00015
00017 template <class Map>
00018 class IgMapUniqueIterator ITERATOR_BASE(bidirectional_iterator,
00019 typename Map::mapped_type,
00020 typename Map::difference_type)
00021 {
00022 public:
00023 typedef std::bidirectional_iterator_tag iterator_category;
00024 typedef typename Map::const_iterator base_iterator;
00025 typedef typename Map::key_type key_type;
00026 typedef typename Map::mapped_type value_type;
00027 typedef typename Map::difference_type difference_type;
00028 typedef const value_type & reference;
00029 typedef const value_type * pointer;
00030
00031 IgMapUniqueIterator (void);
00032 IgMapUniqueIterator (base_iterator pos, const Map *map);
00033
00034
00035
00036
00037 bool operator== (const IgMapUniqueIterator &x) const;
00038 bool operator!= (const IgMapUniqueIterator &x) const;
00039 reference operator* (void) const;
00040 pointer operator-> (void) const;
00041 IgMapUniqueIterator &operator++ (void);
00042 IgMapUniqueIterator operator++ (int);
00043 IgMapUniqueIterator &operator-- (void);
00044 IgMapUniqueIterator operator-- (int);
00045
00046 private:
00047 base_iterator m_pos;
00048 const Map *m_map;
00049 };
00050
00051
00052
00053
00054 template <class Map>
00055 inline
00056 IgMapUniqueIterator<Map>::IgMapUniqueIterator (void)
00057 {}
00058
00059 template <class Map>
00060 inline
00061 IgMapUniqueIterator<Map>::IgMapUniqueIterator (base_iterator pos, const Map *map)
00062 : m_pos (pos),
00063 m_map (map)
00064 {}
00065
00066 template <class Map>
00067 inline bool
00068 IgMapUniqueIterator<Map>::operator== (const IgMapUniqueIterator &x) const
00069 { return m_pos == x.m_pos; }
00070
00071 template <class Map>
00072 inline bool
00073 IgMapUniqueIterator<Map>::operator!= (const IgMapUniqueIterator &x) const
00074 { return m_pos != x.m_pos; }
00075
00076 template <class Map>
00077 inline typename IgMapUniqueIterator<Map>::reference
00078 IgMapUniqueIterator<Map>::operator* (void) const
00079 { return m_pos->second; }
00080
00081 template <class Map>
00082 inline typename IgMapUniqueIterator<Map>::pointer
00083 IgMapUniqueIterator<Map>::operator-> (void) const
00084 { return &m_pos->second; }
00085
00086 template <class Map>
00087 inline IgMapUniqueIterator<Map> &
00088 IgMapUniqueIterator<Map>::operator++ (void)
00089 {
00090 const key_type ¤t = m_pos->first;
00091 while (m_pos != m_map->end () && m_pos->first == current)
00092 ++m_pos;
00093 return *this;
00094 }
00095
00096 template <class Map>
00097 inline IgMapUniqueIterator<Map>
00098 IgMapUniqueIterator<Map>::operator++ (int)
00099 { IgMapUniqueIterator tmp (*this); ++*this; return tmp; }
00100
00101 template <class Map>
00102 inline IgMapUniqueIterator<Map> &
00103 IgMapUniqueIterator<Map>::operator-- (void)
00104 {
00105 const key_type ¤t = m_pos->first;
00106 while (m_pos != m_map->begin () && m_pos->first == current)
00107 --m_pos;
00108 return *this;
00109 }
00110
00111 template <class Map>
00112 inline IgMapUniqueIterator<Map>
00113 IgMapUniqueIterator<Map>::operator-- (int)
00114 { IgMapUniqueIterator tmp (*this); --*this; return tmp; }
00115
00116 #endif // IGUANA_FRAMEWORK_MAP_UNIQUE_ITERATOR_H