1 #ifndef DataFormats_Common_MultiAssociation_h
2 #define DataFormats_Common_MultiAssociation_h
53 #include <boost/shared_ptr.hpp>
54 #include <boost/utility.hpp>
55 #include <boost/range.hpp>
75 typedef std::pair<unsigned int, unsigned int>
range;
81 template<
typename RefKey>
83 return get(r.id(), r.key());
112 template<
typename RefKey>
113 void insert(
const RefKey &
r,
unsigned int startingOffset,
unsigned int size) {
114 insert(r.id(), r.key(), startingOffset,
size);
156 typedef boost::sub_range<Collection>
range;
161 template<
typename RefKey>
163 return get(r.id(), r.key());
167 template<
typename RefKey>
169 return get(r.id(), r.key());
173 template<
typename RefKey>
210 template<
typename HandleType>
220 template<
typename KeyRef>
233 template<
typename HandleType>
243 template<
typename HandleType>
260 template<
typename KeyRef>
265 template<
typename KeyRef>
277 template<
typename HandleType>
284 typedef helper::IndexRangeAssociation
Indices;
296 typename MultiAssociation<C>::const_range
306 return range(
data_.begin()+idxrange.first,
data_.begin()+idxrange.second);
315 for (
typename const_range::const_iterator it = values.begin(), ed = values.end(); it != ed; ++it) {
323 indexFiller_->insert(
id, key, assoc_.data_.size(), vals.size());
324 for (
typename Collection::const_iterator it = vals.begin(), ed = vals.end(); it != ed; ++it) {
325 assoc_.data_.push_back(*it);
330 template<
typename KeyRef>
333 (*tempValues_)[k.key()] =
vals;
337 template<
typename KeyRef>
340 vals.swap((*tempValues_)[k.key()]);
348 for (
typename TempValues::const_iterator it = tempValues_->begin(), ed = tempValues_->end(); it != ed; ++it) {
349 filler.
setValues(id_, it->first, it->second);
unsigned int dataSize() const
Returns the number of values.
static void throwUnexpectedProductID(ProductID found, ProductID expected, const char *where)
boost::sub_range< const Collection > const_range
range operator[](const RefKey &r)
Get a range of values for this key (fast)
boost::shared_ptr< TempValues > tempValues_
FastFiller(MultiAssociation &assoc, edm::ProductID id, unsigned int size)
void swapValues(const KeyRef &k, Collection &refs)
const_range get(const edm::ProductID &id, unsigned int t) const
Get a range of values for this product id and index (fast)
offset_vector ref_offsets_
Collection getValues(const RefKey &r) const
Get a copy of the values for this key (slow!)
bool empty() const
True if it's empty (no keys)
LazyFiller(MultiAssociation &assoc, const HandleType &handle, bool fillOnExit=false)
unsigned int size() const
Returns the number of keys.
FastFiller(IndexRangeAssociation &assoc, ProductID id, unsigned int size)
Make a filler for a collection with a given product id and size.
std::map< unsigned int, Collection > TempValues
LazyFiller lazyFiller(const HandleType &h, bool fillOnExit=false)
#define CMS_CLASS_VERSION(_version_)
boost::sub_range< Collection > range
void swap(IndexRangeAssociation &other)
edm::helper::IndexRangeAssociation::FastFiller IndexFiller
unsigned int size() const
Size of this collection (number of keys)
MultiAssociation & assoc_
void swap(IndexRangeAssociation &lhs, IndexRangeAssociation &rhs)
int lastKey_
last key used to fill (to check that the new key must be strictly greater than lastKey_) ...
~FastFiller()
When the FastFiller goes out of scope, it unlocks the map so you can make a new one.
range operator[](const RefKey &r) const
IndexRangeAssociation & assoc_
bool contains(ProductID id) const
True if this IndexRangeAssociation has info for this product id.
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
const_range operator[](const RefKey &r) const
Get a range of values for this key (fast)
std::pair< unsigned int, unsigned int > range
void insert(const RefKey &r, unsigned int startingOffset, unsigned int size)
Sets the starting offset for this key.
boost::shared_ptr< IndexFiller > indexFiller_
FastFiller fastFiller(const HandleType &handle)
void setFillOnExit(bool fillOnExit)
If set to true, the LazyFiller wil call 'fill()' when it goes out of scope.
std::vector< int > offset_vector
bool operator()(const id_off_pair &p, const edm::ProductID &id) const
id_offset_vector id_offsets_
range get(const edm::ProductID &id, unsigned int t) const
FastFiller(MultiAssociation &assoc, const HandleType &handle)
void swap(MultiAssociation &other)
bool contains(const edm::ProductID &id) const
True if there are keys from this product id.
MultiAssociation & assoc_
bool empty() const
Returns true if there are no keys.
volatile std::atomic< bool > shutdown_flag false
std::pair< edm::ProductID, unsigned int > id_off_pair
std::vector< id_off_pair > id_offset_vector
void setValues(const KeyRef &k, const Collection &refs)
Sets the Collection values associated to this key, making copies of those in refs.
void setValues(const KeyRef &k, const Collection &refs)
Sets the Collection values associated to this key, making copies of those in refs.