Main Page | Modules | Class Hierarchy | Class List | Directories | File List | Class Members | Related Pages

xmog_iterator.h

00001 /*
00002  * Copyright 1999-2006 by Codemesh, Inc.  ALL RIGHTS RESERVED.
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 &current;
00165     }
00166 
00167     Elem * const    operator -> () const
00168     {
00169         return &current;
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 &current;
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 &current;
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 /* XMOG_SUPPORTS_STL */
00383 
00384 #endif /* ifndef xmog_iterator_inc */

Generated on Fri Jun 16 10:18:58 2006 for JMS Courier for C++ by  doxygen 1.4.1