CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/DataFormats/Candidate/interface/iterator_imp_specific.h

Go to the documentation of this file.
00001 #ifndef Candidate_iterator_imp_specific_h
00002 #define Candidate_iterator_imp_specific_h
00003 
00004 #include "DataFormats/Candidate/interface/iterator_deref.h"
00005 #include "DataFormats/Candidate/interface/const_iterator_imp_specific.h"
00006 #include "DataFormats/Candidate/interface/iterator_imp.h"
00007 #include "FWCore/Utilities/interface/Exception.h"
00008 
00009 namespace reco {
00010   namespace candidate {
00011    
00012     template<typename C>
00013     struct iterator_imp_specific : public iterator_imp  {
00014     private:
00015       typedef typename C::iterator iterator;
00016     public:
00017       typedef ptrdiff_t difference_type;
00018       iterator_imp_specific() { }
00019       explicit iterator_imp_specific( const iterator & it ) : i ( it ) { }
00020       ~iterator_imp_specific() { }
00021       iterator_imp_specific * clone() const { return new iterator_imp_specific<C>( i ); }
00022       const_iterator_imp_specific<C> * const_clone() const { return new const_iterator_imp_specific<C>( i ); }
00023       void increase() { ++i; }
00024       void decrease() { ++i; }
00025       void increase( difference_type d ) { i += d; }
00026       void decrease( difference_type d ) { i -= d; }
00027       bool equal_to( const iterator_imp * o ) const { return i == dc( o ); }
00028       bool less_than( const iterator_imp * o ) const { return i < dc( o ); }
00029       void assign( const iterator_imp * o ) { i = dc( o ); }
00030       Candidate & deref() const { return * i; }
00031       difference_type difference( const iterator_imp * o ) const { return i - dc( o ); }
00032      private:
00033       const iterator & dc( const iterator_imp * o ) const {
00034         return dynamic_cast<const iterator_imp_specific *>( o )->i;
00035       }
00036       iterator & dc( iterator_imp * o ) const {
00037         return dynamic_cast<iterator_imp_specific *>( o )->i;
00038       }
00039       iterator i;
00040     };
00041 
00042     template<typename C>
00043     struct iterator_imp_specific_dummy : public iterator_imp {
00044       typedef ptrdiff_t difference_type;
00045       iterator_imp_specific_dummy() { }
00046       ~iterator_imp_specific_dummy() { }
00047       iterator_imp_specific_dummy * clone() const { return new iterator_imp_specific_dummy; }
00048       const_iterator_imp_specific_dummy<C> * const_clone() const { return new const_iterator_imp_specific_dummy<C>; }
00049       void increase() { }
00050       void decrease() { }
00051       void increase( difference_type d ) { }
00052       void decrease( difference_type d ) { }
00053       bool equal_to( const iterator_imp * o ) const { return true; }
00054       bool less_than( const iterator_imp * o ) const { return false; }
00055       void assign( const iterator_imp * o ) { }
00056       Candidate & deref() const { 
00057         throw cms::Exception("Invalid Dereference") 
00058           << "can't dereference an interator for a Candidate with read-only"
00059           << "references o daughters";
00060       }
00061       difference_type difference( const iterator_imp * o ) const { return 0; }
00062     };
00063 
00064  }
00065 }
00066 
00067 #endif