1 #ifndef DataFormats_Common_Ref_h
2 #define DataFormats_Common_Ref_h
106 #include "boost/functional.hpp"
107 #include "boost/call_traits.hpp"
108 #include "boost/type_traits.hpp"
109 #include "boost/mpl/has_xxx.hpp"
110 #include "boost/utility/enable_if.hpp"
121 BOOST_MPL_HAS_XXX_TRAIT_DEF(key_compare)
124 typename boost::enable_if<has_key_compare<C>,
bool>::
type
126 typedef typename C::key_compare comparison_functor;
127 return comparison_functor()(lhs, rhs);
130 template <
typename C,
typename K>
131 typename boost::disable_if<has_key_compare<C>,
bool>
::type
139 template<
typename C,
typename T,
typename F>
145 template <
typename C,
166 typedef typename boost::binary_traits<F>::second_argument_type
argument_type;
213 ref_(productID, product, item_key, item, 0,
false) {
239 T
const*
get()
const {
286 ref_(refCore, item) {
304 template <
typename C,
typename T,
typename F>
307 ref_(handle.
id(), handle.product(), itemKey, 0, 0,
false) {
315 template <
typename C,
typename T,
typename F>
318 ref_(handle.
id(), handle.product(), itemKey, 0, 0,
false) {
326 template <
typename C,
typename T,
typename F>
329 ref_(refvector.
id(), refvector.product(), itemKey, 0, 0, refvector.isTransient()) {
343 template <
typename C,
typename T,
typename F>
355 template <
typename C,
typename T,
typename F>
358 ref_(handle.
id(), handle.product(), itemKey, 0, 0,
true) {
366 template <
typename C,
typename T,
typename F>
369 ref_(refProd.
id(), refProd.refCore().productPtr(), itemKey, 0, refProd.refCore().productGetter(), refProd.refCore().isTransient()) {
378 template <
typename C,
typename T,
typename F>
382 return isNull() ? 0 :
edm::template getProduct<C>(ref_.refCore());
386 template <
typename C,
typename T,
typename F>
390 return *getPtr<C, T, F>(ref_.refCore(), ref_.item());
394 template <
typename C,
typename T,
typename F>
398 return getPtr<C, T, F>(ref_.refCore(), ref_.item());
401 template <
typename C,
typename T,
typename F>
405 return lhs.ref() == rhs.ref();
408 template <
typename C,
typename T,
typename F>
412 return !(lhs == rhs);
415 template <
typename C,
typename T,
typename F>
421 return (lhs.ref().refCore() == rhs.ref().refCore() ? compare_key<C>(lhs.key(), rhs.key()) : lhs.ref().refCore() < rhs.ref().refCore());
432 namespace reftobase {
434 template <
typename T,
typename REF>
437 typedef RefVector<
typename REF::product_type,
439 typename REF::finder_type> REFV;
443 typedef RefVector<
typename REF::product_type,
445 typename REF::finder_type> REFV;
450 template<
typename T1,
typename C,
typename T,
typename F>
455 template <
typename REF>
458 typedef RefVector<
typename REF::product_type,
460 typename REF::finder_type> REFV;
465 template<
typename C,
typename T,
typename F>
EDProductGetter const * mustBeNonZero(EDProductGetter const *prodGetter, std::string refType, ProductID const &productID)
RefHolderToVector< T1, Ref< C, T, F > > type
edm::Ref< Container > Ref
T const * operator->() const
Member dereference operator.
static std::auto_ptr< BaseVectorHolder< T > > makeVectorHolder()
C const * product() const
Accessor for product collection.
T const * product() const
boost::enable_if< has_key_compare< C >, bool >::type compare_key(K const &lhs, K const &rhs)
void checkTypeAtCompileTime(C const *)
Ref(RefCore const &refCore, RefItem< key_type > const &item)
bool operator!() const
Checks for null.
bool operator!=(debugging_allocator< X > const &, debugging_allocator< Y > const &)
T const & operator*() const
Dereference operator.
Container::value_type value_type
static std::auto_ptr< RefVectorHolderBase > makeVectorHolder()
bool isNonnull() const
Checks for non-null.
RefBase< key_type > const & ref() const
Accessor for all data.
bool isNull() const
Checks for null.
RefItem< KEY > const & item() const
Accessor for index and pointer.
RefRefHolderToRefVector< Ref< C, T, F > > type
boost::binary_traits< F >::second_argument_type argument_type
bool operator==(debugging_allocator< X > const &, debugging_allocator< Y > const &)
void const * productPtr() const
Ref(ProductID const &productID, key_type itemKey, EDProductGetter const *prodGetter)
C product_type
etc. etc.: more nesting levels could be supported ...
refhelper::FindRefVectorUsingAdvance< RefVector< C, T, F > > VF
Ref()
Default constructor needed for reading from persistent store. Not for direct use. ...
refhelper::FindRefVectorUsingAdvance< RefToBaseVector< T > > VBF
RefCore const & refCore() const
void const * setPtr(void const *p) const
T const * product() const
key_type key() const
Accessor for product key.
RefCore const & refCore() const
Accessor for product ID and product getter.
T const * product() const
EDProductGetter const * productGetter() const
bool hasProductCache() const
ProductID id() const
Accessor for product ID.
EDProductGetter const * productGetter() const
Accessor for product getter.
static std::auto_ptr< RefVectorHolderBase > makeVectorBaseHolder()
boost::remove_cv< typename boost::remove_reference< argument_type >::type >::type key_type
Ref(ProductID const &productID, T const *item, key_type item_key, C const *product)
Constructor for use in the various X::fillView(...) functions.
C const * product() const
Accessor for product collection.
edm::RefVector< Container > RefVector
bool isTransient() const
Checks if this ref is transient (i.e. not persistable).