CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
VectorHolder.h
Go to the documentation of this file.
1 #ifndef DataFormats_Common_VectorHolder_h
2 #define DataFormats_Common_VectorHolder_h
6 #include <memory>
7 
8 namespace edm {
9  namespace reftobase {
10 
11  class RefVectorHolderBase;
12 
13  template <class T, class REFV>
14  class VectorHolder : public BaseVectorHolder<T> {
15  public:
17  typedef typename base_type::size_type size_type;
21  typedef REFV ref_vector_type;
22 
24  explicit VectorHolder(const ref_vector_type& iRefVector) : base_type(), refVector_(iRefVector) {}
25  explicit VectorHolder(const ProductID& id) : base_type(), refVector_(id) {}
26  virtual ~VectorHolder() {}
27  virtual base_type* clone() const { return new VectorHolder(*this); }
28  virtual base_type* cloneEmpty() const { return new VectorHolder(refVector_.id()); }
29  base_ref_type const at(size_type idx) const { return base_ref_type( refVector_.at( idx ) ); }
30  bool empty() const { return refVector_.empty(); }
31  size_type size() const { return refVector_.size(); }
32  //size_type capacity() const { return refVector_.capacity(); }
33  //void reserve(size_type n) { refVector_.reserve(n); }
34  void clear() { refVector_.clear(); }
35  ProductID id() const { return refVector_.id(); }
36  EDProductGetter const* productGetter() const { return refVector_.productGetter(); }
37  void swap(VectorHolder& other) {
38  this->BaseVectorHolder<T>::swap(other);
39  refVector_.swap(other.refVector_);
40  }
42  VectorHolder temp(rhs);
43  this->swap(temp);
44  return *this;
45  }
46 
48  return const_iterator( new const_iterator_imp_specific( refVector_.begin() ) );
49  }
50  const_iterator end() const {
52  }
53  virtual void push_back( const BaseHolder<T> * r ) {
54  typedef Holder<T, typename REFV::value_type > holder_type;
55  const holder_type * h = dynamic_cast<const holder_type *>( r );
56  if( h == 0 )
58  "In VectorHolder<T, REFV> trying to push_back wrong reference type");
59  refVector_.push_back( h->getRef() );
60  }
61  virtual std::auto_ptr<RefVectorHolderBase> vectorHolder() const {
62  return std::auto_ptr<RefVectorHolderBase>( new RefVectorHolder<REFV>( refVector_ ) );
63  }
64  virtual const void * product() const {
65  return refVector_.product();
66  }
67 
70  virtual bool isAvailable() const { return refVector_.isAvailable(); }
71 
72  //Used by ROOT storage
74 
75  private:
77 
79 
80  // the following structure is public
81  // to allow reflex dictionary to compile
82  public:
83  struct const_iterator_imp_specific : public const_iterator_imp {
84  typedef ptrdiff_t difference_type;
86  explicit const_iterator_imp_specific( const typename REFV::const_iterator & it ) : i ( it ) { }
89  void increase() { ++i; }
90  void decrease() { --i; }
91  void increase( difference_type d ) { i += d; }
92  void decrease( difference_type d ) { i -= d; }
93  bool equal_to( const const_iterator_imp * o ) const { return i == dc( o ); }
94  bool less_than( const const_iterator_imp * o ) const { return i < dc( o ); }
95  void assign( const const_iterator_imp * o ) { i = dc( o ); }
96  base_ref_type deref() const { return base_ref_type( * i ); }
97  difference_type difference( const const_iterator_imp * o ) const { return i - dc( o ); }
98  private:
99  const typename ref_vector_type::const_iterator & dc( const const_iterator_imp * o ) const {
100  if ( o == 0 )
102  "In RefToBaseVector<T> trying to dereference a null pointer");
103  const const_iterator_imp_specific * oo = dynamic_cast<const const_iterator_imp_specific *>( o );
104  if ( oo == 0 )
106  "In RefToBaseVector<T> trying to cast iterator to wrong type ");
107  return oo->i;
108  }
109  typename ref_vector_type::const_iterator i;
110  };
111  };
112 
113  // Free swap function
114  template <typename T, typename REFV>
115  inline
116  void
118  lhs.swap(rhs);
119  }
120  }
121 }
122 
123 #endif
int i
Definition: DBlmapReader.cc:9
base_type::const_iterator const_iterator
Definition: VectorHolder.h:20
const_iterator end() const
Definition: VectorHolder.h:50
virtual const void * product() const
Definition: VectorHolder.h:64
VectorHolder & operator=(VectorHolder const &rhs)
Definition: VectorHolder.h:41
const_iterator_imp_specific * clone() const
Definition: VectorHolder.h:88
#define CMS_CLASS_VERSION(_version_)
size_type size() const
Definition: VectorHolder.h:31
VectorHolder(const ref_vector_type &iRefVector)
Definition: VectorHolder.h:24
VectorHolder(const ProductID &id)
Definition: VectorHolder.h:25
static void throwThis(Code category, char const *message0="", char const *message1="", char const *message2="", char const *message3="", char const *message4="")
Definition: EDMException.cc:81
virtual base_type * cloneEmpty() const
Definition: VectorHolder.h:28
void swap(BaseVectorHolder &other)
base_type::base_ref_type base_ref_type
Definition: VectorHolder.h:19
virtual base_type * clone() const
Definition: VectorHolder.h:27
virtual bool isAvailable() const
Definition: VectorHolder.h:70
BaseVectorHolder< T > base_type
Definition: VectorHolder.h:16
const ref_vector_type::const_iterator & dc(const const_iterator_imp *o) const
Definition: VectorHolder.h:99
virtual void push_back(const BaseHolder< T > *r)
Definition: VectorHolder.h:53
base_type::size_type size_type
Definition: VectorHolder.h:17
ref_vector_type refVector_
Definition: VectorHolder.h:78
ProductID id() const
Definition: VectorHolder.h:35
base_ref_type const at(size_type idx) const
Definition: VectorHolder.h:29
difference_type difference(const const_iterator_imp *o) const
Definition: VectorHolder.h:97
bool equal_to(const const_iterator_imp *o) const
Definition: VectorHolder.h:93
base_type::element_type element_type
Definition: VectorHolder.h:18
EDProductGetter const * productGetter() const
Definition: VectorHolder.h:36
#define private
Definition: FWFileEntry.h:18
const_iterator_imp_specific(const typename REFV::const_iterator &it)
Definition: VectorHolder.h:86
virtual std::auto_ptr< RefVectorHolderBase > vectorHolder() const
Definition: VectorHolder.h:61
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
const_iterator begin() const
Definition: VectorHolder.h:47
void swap(BaseHolder< T > &lhs, BaseHolder< T > &rhs)
Definition: BaseHolder.h:119
void swap(VectorHolder &other)
Definition: VectorHolder.h:37
bool less_than(const const_iterator_imp *o) const
Definition: VectorHolder.h:94