00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef SMDS_SetIterator_HeaderFile
00028 #define SMDS_SetIterator_HeaderFile
00029
00030 #include "SMDS_Iterator.hxx"
00031
00035
00036 namespace SMDS {
00037
00038 template<typename VALUE,typename VALUE_SET_ITERATOR>
00039 struct SimpleAccessor {
00040 static VALUE value(VALUE_SET_ITERATOR it) { return (VALUE) *it; }
00041 };
00042
00043 template<typename VALUE,typename VALUE_SET_ITERATOR>
00044 struct KeyAccessor {
00045 static VALUE value(VALUE_SET_ITERATOR it) { return (VALUE) it->first; }
00046 };
00047
00048 template<typename VALUE,typename VALUE_SET_ITERATOR>
00049 struct ValueAccessor {
00050 static VALUE value(VALUE_SET_ITERATOR it) { return (VALUE) it->second; }
00051 };
00052 }
00053
00060
00061 template<typename VALUE,
00062 typename VALUE_SET_ITERATOR,
00063 typename ACCESOR=SMDS::SimpleAccessor<VALUE,VALUE_SET_ITERATOR> >
00064 class SMDS_SetIterator : public SMDS_Iterator<VALUE>
00065 {
00066 protected:
00067 VALUE_SET_ITERATOR _beg, _end;
00068 public:
00069 SMDS_SetIterator(const VALUE_SET_ITERATOR & begin,
00070 const VALUE_SET_ITERATOR & end)
00071 { init ( begin, end ); }
00072
00074 virtual void init(const VALUE_SET_ITERATOR & begin,
00075 const VALUE_SET_ITERATOR & end)
00076 { _beg = begin; _end = end; }
00077
00079 virtual bool more() { return _beg != _end; }
00080
00082 virtual VALUE next() { return ACCESOR::value( _beg++ ); }
00083 };
00084
00088
00089 #include <map>
00093 template<typename M>
00094 struct SMDS_mapIterator : public SMDS_SetIterator< typename M::mapped_type, typename M::const_iterator,
00095 SMDS::ValueAccessor<typename M::mapped_type,
00096 typename M::const_iterator> > {
00097 typedef SMDS_SetIterator< typename M::mapped_type, typename M::const_iterator,
00098 SMDS::ValueAccessor<typename M::mapped_type,
00099 typename M::const_iterator> > parent_type;
00100 SMDS_mapIterator(const M& m):parent_type(m.begin(),m.end()) {}
00101 };
00105 template<typename M>
00106 struct SMDS_mapReverseIterator : public SMDS_SetIterator< typename M::mapped_type,
00107 typename M::const_reverse_iterator,
00108 SMDS::ValueAccessor<typename M::mapped_type,
00109 typename M::const_reverse_iterator> > {
00110 typedef SMDS_SetIterator< typename M::mapped_type, typename M::const_reverse_iterator,
00111 SMDS::ValueAccessor<typename M::mapped_type,
00112 typename M::const_reverse_iterator> > parent_type;
00113 SMDS_mapReverseIterator(const M& m):parent_type(m.rbegin(),m.rend()) {}
00114 };
00118 template<typename M>
00119 struct SMDS_mapKeyIterator : public SMDS_SetIterator< typename M::key_type, typename M::const_iterator,
00120 SMDS::KeyAccessor<typename M::key_type,
00121 typename M::const_iterator> > {
00122 typedef SMDS_SetIterator< typename M::key_type, typename M::const_iterator,
00123 SMDS::KeyAccessor<typename M::key_type,
00124 typename M::const_iterator> > parent_type;
00125 SMDS_mapKeyIterator(const M& m):parent_type(m.begin(),m.end()) {}
00126 };
00130 template<typename M>
00131 struct SMDS_mapKeyReverseIterator : public SMDS_SetIterator< typename M::key_type, typename M::const_iterator,
00132 SMDS::KeyAccessor<typename M::key_type,
00133 typename M::const_iterator> > {
00134 typedef SMDS_SetIterator< typename M::key_type, typename M::const_iterator,
00135 SMDS::KeyAccessor<typename M::key_type,
00136 typename M::const_iterator> > parent_type;
00137 SMDS_mapKeyReverseIterator(const M& m):parent_type(m.rbegin(),m.rend()) {}
00138 };
00139
00141
00143
00144 #include <vector>
00145
00146 class SMDS_MeshElement;
00147 class SMDS_MeshNode;
00148
00149 typedef const SMDS_MeshElement* SMDS_pElement;
00150 typedef const SMDS_MeshNode* SMDS_pNode;
00151
00152
00153
00154 typedef SMDS_SetIterator< SMDS_pElement, std::vector< SMDS_pElement >::const_iterator>
00155 SMDS_ElementVectorIterator;
00156
00157
00158 typedef SMDS_SetIterator< SMDS_pElement, SMDS_pElement const *>
00159 SMDS_ElementArrayIterator;
00160
00161
00162 typedef SMDS_SetIterator< SMDS_pElement, std::vector< SMDS_pNode >::const_iterator>
00163 SMDS_NodeVectorElemIterator;
00164
00165
00166 typedef SMDS_SetIterator< SMDS_pElement, SMDS_pNode const * >
00167 SMDS_NodeArrayElemIterator;
00168
00169
00170
00171 typedef SMDS_SetIterator< SMDS_pNode, std::vector< SMDS_pNode >::const_iterator >
00172 SMDS_NodeVectorIterator;
00173
00174
00175 typedef SMDS_SetIterator< SMDS_pNode, SMDS_pNode const * >
00176 SMDS_NodeArrayIterator;
00177
00178
00179 #endif