CMS 3D CMS Logo

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

Go to the documentation of this file.
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