![]() |
![]() |
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