00001
00002
00003
00004 #ifndef xmog_iterator_inc
00005 #define xmog_iterator_inc
00006
00007
00008 #include "xmog_java_client.h"
00009
00010
00017 struct Iterator_tag {};
00018
00019
00026 struct Enumeration_tag {};
00027
00028
00033 class XMOG_DECLSPEC xmog_iterator_base
00034 {
00035 private:
00036
00037 xmog_base collection_;
00038 xmog_base iterator_;
00039 xmog_base current_;
00040
00041 const xmog_java_class * clazz_;
00042 xmog_java_method * next_;
00043 xmog_java_method * hasNext_;
00044 xmog_java_method * previous_;
00045 xmog_java_method * hasPrevious_;
00046 xmog_java_method * size_;
00047 jint index_;
00048
00049 void init( xmog_localenv * env );
00050
00051 protected:
00052
00053 void copy( const xmog_iterator_base & rhs );
00054
00055 jobject inner_current( xmog_localenv * env = NULL, xmog_flags flags = xmogDefaultFlags );
00056
00057 void inner_next( xmog_localenv * env = NULL, xmog_flags flags = xmogDefaultFlags );
00058
00059 bool inner_hasNext( xmog_localenv * env = NULL );
00060
00061 void inner_previous( xmog_localenv * env = NULL, xmog_flags flags = xmogDefaultFlags );
00062
00063 bool inner_hasPrevious( xmog_localenv * env = NULL );
00064
00065 jint inner_size( xmog_localenv * env = NULL ) const;
00066
00067 public:
00068
00069 enum
00070 {
00071 xmogDefaultFlags = xmog_base::GLOBAL,
00072 BEGIN_INDEX = -1,
00073 END_INDEX = -2,
00074 RBEGIN_INDEX = -3,
00075 REND_INDEX = -4
00076 };
00077
00078 xmog_iterator_base();
00079
00080 xmog_iterator_base( const xmog_base & collection, const xmog_java_class & clazz, jint ind );
00081
00082 xmog_iterator_base( const xmog_iterator_base & rhs );
00083
00084 xmog_iterator_base( const xmog_iterator_base & rhs, bool inc, bool dec );
00085
00086 ~xmog_iterator_base();
00087
00088 bool operator != ( const xmog_iterator_base & rhs ) const;
00089
00090 bool operator == ( const xmog_iterator_base & rhs ) const;
00091
00092 bool operator < ( const xmog_iterator_base & rhs ) const;
00093
00094 bool operator <= ( const xmog_iterator_base & rhs ) const;
00095
00096 bool operator > ( const xmog_iterator_base & rhs ) const;
00097
00098 bool operator >= ( const xmog_iterator_base & rhs ) const;
00099
00100 };
00101
00102
00103 template< typename Elem >
00104 class xmog_iterator : public xmog_iterator_base
00105 {
00106 private:
00107
00108 Elem current;
00109
00110 public:
00111
00112 xmog_iterator<Elem>() :
00113 xmog_iterator_base(),
00114 current()
00115 {
00116 }
00117
00118 xmog_iterator<Elem>( const xmog_base & collection, const xmog_java_class & clazz, jint ind ) :
00119 xmog_iterator_base( collection, clazz, ind ),
00120 current( inner_current(), xmogDefaultFlags )
00121 {
00122 }
00123
00124 xmog_iterator<Elem>( const xmog_iterator<Elem> & rhs ) :
00125 xmog_iterator_base( rhs ),
00126 current( rhs.current )
00127 {
00128 }
00129
00130 xmog_iterator<Elem>( const xmog_iterator<Elem> & rhs, bool inc ) :
00131 xmog_iterator_base( rhs, true, false ),
00132 current( inner_current(), xmogDefaultFlags )
00133 {
00134 }
00135
00136 ~xmog_iterator<Elem>()
00137 {
00138 }
00139
00140 xmog_iterator<Elem> & operator = ( const xmog_iterator<Elem> & rhs )
00141 {
00142 copy( rhs );
00143 current = rhs.current;
00144 return *this;
00145 }
00146
00147 operator Elem & ()
00148 {
00149 return current;
00150 }
00151
00152 Elem & operator * ()
00153 {
00154 return current;
00155 }
00156
00157 const Elem & operator * () const
00158 {
00159 return current;
00160 }
00161
00162 Elem * operator -> ()
00163 {
00164 return ¤t;
00165 }
00166
00167 Elem * const operator -> () const
00168 {
00169 return ¤t;
00170 }
00171
00172 xmog_iterator<Elem> & operator ++ ()
00173 {
00174 inner_next();
00175 current = Elem( inner_current(), xmogDefaultFlags );
00176 return *this;
00177 }
00178
00179 xmog_iterator<Elem> operator ++ ( int )
00180 {
00181 xmog_iterator<Elem> result( *this );
00182 inner_next();
00183 current = Elem( inner_current(), xmogDefaultFlags );
00184 return result;
00185 }
00186 };
00187
00188
00189 template< typename Elem >
00190 class xmog_reverse_iterator : public xmog_iterator_base
00191 {
00192 private:
00193
00194 Elem current;
00195
00196 public:
00197
00198 xmog_reverse_iterator<Elem>() :
00199 xmog_iterator_base(),
00200 current()
00201 {
00202 }
00203
00204 xmog_reverse_iterator<Elem>( const xmog_base & collection, const xmog_java_class & clazz, jint ind ) :
00205 xmog_iterator_base( collection, clazz, ind ),
00206 current( inner_current(), xmogDefaultFlags )
00207 {
00208 }
00209
00210 xmog_reverse_iterator<Elem>( const xmog_reverse_iterator<Elem> & rhs ) :
00211 xmog_iterator_base( rhs ),
00212 current( rhs.current )
00213 {
00214 }
00215
00216 xmog_reverse_iterator<Elem>( const xmog_reverse_iterator<Elem> & rhs, bool dec ) :
00217 xmog_iterator_base( rhs, false, true ),
00218 current( inner_current(), xmogDefaultFlags )
00219 {
00220 }
00221
00222 ~xmog_reverse_iterator<Elem>()
00223 {
00224 }
00225
00226 xmog_reverse_iterator<Elem> & operator = ( const xmog_reverse_iterator<Elem> & rhs )
00227 {
00228 copy( rhs );
00229 current = rhs.current;
00230 return *this;
00231 }
00232
00233 operator Elem & ()
00234 {
00235 return current;
00236 }
00237
00238 Elem & operator * ()
00239 {
00240 return current;
00241 }
00242
00243 const Elem & operator * () const
00244 {
00245 return current;
00246 }
00247
00248 Elem * const operator -> () const
00249 {
00250 return ¤t;
00251 }
00252
00253 xmog_reverse_iterator<Elem> & operator -- ()
00254 {
00255 inner_previous();
00256 current = Elem( inner_current(), xmogDefaultFlags );
00257 return *this;
00258 }
00259
00260 xmog_reverse_iterator<Elem> operator -- ( int )
00261 {
00262 xmog_reverse_iterator<Elem> result( *this );
00263 inner_previous();
00264 current = Elem( inner_current(), xmogDefaultFlags );
00265 return result;
00266 }
00267 };
00268
00269
00270 template< typename Elem >
00271 class xmog_bidir_iterator : public xmog_iterator_base
00272 {
00273 private:
00274
00275 Elem current;
00276
00277 public:
00278
00279 xmog_bidir_iterator<Elem>() :
00280 xmog_iterator_base(),
00281 current()
00282 {
00283 }
00284
00285 xmog_bidir_iterator<Elem>( const xmog_base & collection, const xmog_java_class & clazz, jint ind ) :
00286 xmog_iterator_base( collection, clazz, ind ),
00287 current( inner_current(), xmogDefaultFlags )
00288 {
00289 }
00290
00291 xmog_bidir_iterator<Elem>( const xmog_bidir_iterator<Elem> & rhs ) :
00292 xmog_iterator_base( rhs ),
00293 current( rhs.current )
00294 {
00295 }
00296
00297 xmog_bidir_iterator<Elem>( const xmog_bidir_iterator<Elem> & rhs, bool inc, bool dec ) :
00298 xmog_iterator_base( rhs, inc, dec ),
00299 current( inner_current(), xmogDefaultFlags )
00300 {
00301 }
00302
00303 ~xmog_bidir_iterator<Elem>()
00304 {
00305 }
00306
00307 xmog_bidir_iterator<Elem> & operator = ( const xmog_bidir_iterator<Elem> & rhs )
00308 {
00309 copy( rhs );
00310 current = rhs.current;
00311 return *this;
00312 }
00313
00314 operator Elem & ()
00315 {
00316 return current;
00317 }
00318
00319 Elem & operator * ()
00320 {
00321 return current;
00322 }
00323
00324 Elem * operator -> ()
00325 {
00326 return ¤t;
00327 }
00328
00329 xmog_bidir_iterator<Elem> & operator ++ ()
00330 {
00331 inner_next();
00332 current = Elem( inner_current(), xmogDefaultFlags );
00333 return *this;
00334 }
00335
00336 xmog_bidir_iterator<Elem> operator ++ ( int )
00337 {
00338 xmog_bidir_iterator<Elem> result( *this );
00339 inner_next();
00340 current = Elem( inner_current(), xmogDefaultFlags );
00341 return result;
00342 }
00343
00344 xmog_bidir_iterator<Elem> & operator -- ()
00345 {
00346 inner_previous();
00347 current = Elem( inner_current(), xmogDefaultFlags );
00348 return *this;
00349 }
00350
00351 xmog_bidir_iterator<Elem> operator -- ( int )
00352 {
00353 xmog_bidir_iterator<Elem> result( *this );
00354 inner_previous();
00355 current = Elem( inner_current(), xmogDefaultFlags );
00356 return result;
00357 }
00358 };
00359
00360 #if (XMOG_SUPPORTS_STL == 1)
00361
00362 #include <iterator>
00363
00364 template< typename Elem > struct std::iterator_traits< xmog_iterator< Elem > >
00365 {
00366 typedef ptrdiff_t difference_type;
00367 typedef Elem value_type;
00368 typedef Elem* pointer;
00369 typedef Elem& reference;
00370 typedef std::forward_iterator_tag iterator_category;
00371 };
00372
00373 template< typename Elem > struct std::iterator_traits< xmog_bidir_iterator< Elem > >
00374 {
00375 typedef ptrdiff_t difference_type;
00376 typedef Elem value_type;
00377 typedef Elem* pointer;
00378 typedef Elem& reference;
00379 typedef std::bidirectional_iterator_tag iterator_category;
00380 };
00381
00382 #endif
00383
00384 #endif