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