CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
BaseVectorHolder.h
Go to the documentation of this file.
1 #ifndef DataFormats_Common_BaseVectorHolder_h
2 #define DataFormats_Common_BaseVectorHolder_h
5 #include <memory>
6 
7 namespace edm {
8  class ProductID;
9  template <typename T> class RefToBase;
10  namespace reftobase {
11  template <typename T>
12  class BaseVectorHolder {
13  public:
14  typedef size_t size_type;
15  typedef T element_type;
18  virtual ~BaseVectorHolder() {}
19  virtual BaseVectorHolder* clone() const = 0;
20  virtual BaseVectorHolder* cloneEmpty() const = 0;
21  virtual base_ref_type const at(size_type idx) const = 0;
22  virtual bool empty() const = 0;
23 
24  virtual size_type size() const = 0;
25  //virtual size_type capacity() const = 0;
26  //virtual void reserve(size_type n) = 0;
27  virtual void clear() = 0;
28  virtual ProductID id() const = 0;
29  virtual EDProductGetter const* productGetter() const = 0;
30  void swap(BaseVectorHolder& other) {} // nothing to swap
31 
32  // the following structure is public
33  // to allow reflex dictionary to compile
34  // protected:
36  typedef ptrdiff_t difference_type;
38  virtual ~const_iterator_imp() { }
39  virtual const_iterator_imp * clone() const = 0;
40  virtual void increase() = 0;
41  virtual void decrease() = 0;
42  virtual void increase( difference_type d ) = 0;
43  virtual void decrease( difference_type d ) = 0;
44  virtual bool equal_to( const const_iterator_imp * ) const = 0;
45  virtual bool less_than( const const_iterator_imp * ) const = 0;
46  virtual void assign( const const_iterator_imp * ) = 0;
47  virtual base_ref_type deref() const = 0;
48  virtual difference_type difference( const const_iterator_imp * ) const = 0;
49  };
50 
51  struct const_iterator : public std::iterator <std::random_access_iterator_tag, RefToBase<T> >{
53  typedef std::auto_ptr<value_type> pointer;
54  typedef std::ptrdiff_t difference_type;
55 
56  const_iterator() : i( 0 ) { }
57  const_iterator( const_iterator_imp * it ) : i( it ) { }
58  const_iterator( const const_iterator & it ) : i( it.isValid() ? it.i->clone() : 0 ) { }
59  ~const_iterator() { delete i; }
61  if ( isInvalid() ) i = it.i;
62  else i->assign( it.i );
63  return *this;
64  }
66  throwInvalidReference(isInvalid(), "increment");
67  i->increase();
68  return *this;
69  }
71  throwInvalidReference(isInvalid(), "postincrement");
72  const_iterator ci = *this;
73  i->increase();
74  return ci;
75  }
77  throwInvalidReference(isInvalid(), "decrement");
78  i->decrease();
79  return *this;
80  }
82  throwInvalidReference(isInvalid(), "postdecrement");
83  const_iterator ci = *this;
84  i->decrease();
85  return ci;
86  }
88  if ( isInvalid() && o.isInvalid() ) return 0;
89  throwInvalidReference(isInvalid() || o.isInvalid(), "compute difference with");
90  return i->difference( o.i );
91  }
93  throwInvalidReference(isInvalid(), "compute sum with");
94  const_iterator_imp * ii = i->clone();
95  ii->increase( n );
96  return const_iterator( ii );
97  }
99  throwInvalidReference(isInvalid(), "compute difference with");
100  const_iterator_imp * ii = i->clone();
101  ii->decrease( n );
102  return const_iterator( ii );
103  }
104  bool operator<( const const_iterator & o ) const {
105  if ( isInvalid() && o.isInvalid() ) return false;
106  throwInvalidReference(isInvalid() || o.isInvalid(), "compute < operator with");
107  return i->less_than( o.i );
108  }
109  bool operator==( const const_iterator& ci ) const {
110  if ( isInvalid() && ci.isInvalid() ) return true;
111  if ( isInvalid() || ci.isInvalid() ) return false;
112  return i->equal_to( ci.i );
113  }
114  bool operator!=( const const_iterator& ci ) const {
115  if ( isInvalid() && ci.isInvalid() ) return false;
116  if ( isInvalid() || ci.isInvalid() ) return true;
117  return ! i->equal_to( ci.i );
118  }
120  throwInvalidReference(isInvalid(), "dereference");
121  return i->deref();
122  }
123  pointer operator->() const {
124  return pointer( new value_type( operator*() ) );
125  }
127  throwInvalidReference(isInvalid(), "increment");
128  i->increase( d );
129  return *this;
130  }
132  throwInvalidReference(isInvalid(), "decrement");
133  i->decrease( d );
134  return *this;
135  }
136  bool isValid() const { return i != 0; }
137  bool isInvalid() const { return i == 0; }
138 
139  void throwInvalidReference(bool isInvalid, const char *why) const
140  {
141  if (isInvalid)
142  {
143  Exception::throwThis(edm::errors::InvalidReference, "Trying to ", why, " an invalid RefToBaseVector<T>::const_iterator");
144  }
145  }
146 
147 
148  private:
150  };
151 
152  virtual const_iterator begin() const = 0;
153  virtual const_iterator end() const = 0;
154  virtual void push_back( const BaseHolder<T> * ) = 0;
155  virtual std::auto_ptr<RefVectorHolderBase> vectorHolder() const = 0;
156  virtual const void * product() const = 0;
157 
160  virtual bool isAvailable() const = 0;
161 
162  };
163 
164  // Free swap function
165  template <typename T>
166  inline
167  void
169  lhs.swap(rhs);
170  }
171  }
172 }
173 
174 #endif
virtual ProductID id() const =0
virtual BaseVectorHolder * cloneEmpty() const =0
virtual const_iterator begin() const =0
virtual const void * product() const =0
const_iterator & operator+=(difference_type d)
const_iterator operator+(difference_type n) const
void throwInvalidReference(bool isInvalid, const char *why) const
bool operator<(const const_iterator &o) const
virtual size_type size() const =0
virtual difference_type difference(const const_iterator_imp *) const =0
virtual EDProductGetter const * productGetter() const =0
virtual void push_back(const BaseHolder< T > *)=0
virtual bool equal_to(const const_iterator_imp *) const =0
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 bool isAvailable() const =0
virtual bool less_than(const const_iterator_imp *) const =0
void swap(BaseVectorHolder &other)
bool operator!=(const const_iterator &ci) const
virtual BaseVectorHolder * clone() const =0
const_iterator operator-(difference_type n) const
virtual std::auto_ptr< RefVectorHolderBase > vectorHolder() const =0
virtual const_iterator end() const =0
const_iterator & operator=(const const_iterator &it)
virtual void assign(const const_iterator_imp *)=0
bool operator==(const const_iterator &ci) const
virtual const_iterator_imp * clone() const =0
difference_type operator-(const const_iterator &o) const
const_iterator & operator-=(difference_type d)
virtual bool empty() const =0
virtual base_ref_type const at(size_type idx) const =0
void swap(BaseHolder< T > &lhs, BaseHolder< T > &rhs)
Definition: BaseHolder.h:115