CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Attributes
edm::helper::IndexRangeAssociation::FastFiller Class Reference

#include <MultiAssociation.h>

Inheritance diagram for edm::helper::IndexRangeAssociation::FastFiller:

Public Member Functions

 FastFiller (IndexRangeAssociation &assoc, ProductID id, unsigned int size)
 Make a filler for a collection with a given product id and size. More...
 
template<typename RefKey >
void insert (const RefKey &r, unsigned int startingOffset, unsigned int size)
 Sets the starting offset for this key. More...
 
void insert (edm::ProductID id, unsigned int key, unsigned int startingOffset, unsigned int size)
 Sets the starting offset for this key (non-templated variant) More...
 
 ~FastFiller ()
 When the FastFiller goes out of scope, it unlocks the map so you can make a new one. More...
 

Private Attributes

IndexRangeAssociationassoc_
 
unsigned int end_
 
const ProductID id_
 
int lastKey_
 last key used to fill (to check that the new key must be strictly greater than lastKey_) More...
 
unsigned int start_
 

Detailed Description

FastFiller for the IndexRangeAssociation: It requires to fill items in strict key order. You can have a single FastFiller for a given map at time You can't access the map for this collection while filling it

Definition at line 103 of file MultiAssociation.h.

Constructor & Destructor Documentation

IndexRangeAssociation::FastFiller::FastFiller ( IndexRangeAssociation assoc,
ProductID  id,
unsigned int  size 
)

Make a filler for a collection with a given product id and size.

Definition at line 45 of file MultiAssociation.cc.

References assoc_, end_, edm::hlt::Exception, errorMatrix2Lands_multiChannel::id, edm::helper::IndexRangeAssociation::id_offsets_, edm::helper::IndexRangeAssociation::isFilling_, pos, edm::helper::IndexRangeAssociation::ref_offsets_, and start_.

45  :
46  assoc_(assoc), id_(id),
47  start_(assoc.ref_offsets_.empty() ? 0 : assoc.ref_offsets_.size() - 1), // must skip the end marker element
48  end_(start_ + size),
49  lastKey_(-1)
50 {
51  if (assoc_.isFilling_) throw cms::Exception("Unsupported Operation") <<
52  "IndexRangeAssociation::FastFiller: you already have one active filler for this map.\n";
53 
54  // Look if the key is there, or find the right place to insert it
55  typedef IndexRangeAssociation::id_offset_vector::iterator iter;
56  iter pos = std::lower_bound(assoc_.id_offsets_.begin(), assoc_.id_offsets_.end(), id, IndexRangeAssociation::IDComparator());
57 
58  // Check for duplicate ProductID
59  if ((pos != assoc_.id_offsets_.end()) && (pos->first == id)) throw cms::Exception("Duplicated Key") <<
60  "IndexRangeAssociation::FastFiller: there is already an entry for ProductID " << id << " in this map.\n";
61 
62  // Lock the map
63  assoc_.isFilling_ = true;
64 
65  // Insert the key, keeping id_offsets_ sorted
67 
68  int lastEnd = (assoc_.ref_offsets_.empty() ? 0 : assoc_.ref_offsets_.back());
69  assoc_.ref_offsets_.resize(end_ + 1, -1);
70  assoc_.ref_offsets_.back() = lastEnd;
71 }
unsigned int size() const
Size of this collection (number of keys)
int lastKey_
last key used to fill (to check that the new key must be strictly greater than lastKey_) ...
std::pair< edm::ProductID, unsigned int > id_off_pair
IndexRangeAssociation::FastFiller::~FastFiller ( )

When the FastFiller goes out of scope, it unlocks the map so you can make a new one.

Definition at line 73 of file MultiAssociation.cc.

References evf::evtn::offset().

73  {
74  // I have to consolidate, replacing "-1" with the correct end offset.
75  // I can start from the end, as I know that the last item is never -1
76  typedef IndexRangeAssociation::offset_vector::iterator IT;
77  //std::cout << "Fixupping [" << start_ << ", " << end_ << "]" << std::endl;
78  //for(IT i = assoc_.ref_offsets_.begin() + start_; i <= assoc_.ref_offsets_.begin() + end_; ++i) { std::cout << " - " << *i << std::endl; }
79  IT top = assoc_.ref_offsets_.begin() + start_;
80  IT it = assoc_.ref_offsets_.begin() + end_;
81  int offset = *it;
82  for (--it; it >= top; --it) {
83  if (*it == -1) {
84  //std::cout << " > replace *it " << *it << " with offset " << offset << " at " << (it - top) << std::endl;
85  *it = offset; // replace -1 with real end offset
86  } else {
87  //std::cout << " > replace offset " << offset << " with *it " << *it << " at " << (it - top) << std::endl;
88  offset = *it; // take as new end offset for the preceding "-1"s
89  }
90  }
91  assoc_.isFilling_ = false; // unlock
92  //std::cout << "Fixupped [" << start_ << ", " << end_ << "]" << std::endl;
93  //for(IT i = assoc_.ref_offsets_.begin() + start_; i <= assoc_.ref_offsets_.begin() + end_; ++i) { std::cout << " - " << *i << std::endl; }
94 }
std::vector< LinkConnSpec >::const_iterator IT
unsigned int offset(bool)

Member Function Documentation

template<typename RefKey >
void edm::helper::IndexRangeAssociation::FastFiller::insert ( const RefKey &  r,
unsigned int  startingOffset,
unsigned int  size 
)
inline

Sets the starting offset for this key.

Definition at line 113 of file MultiAssociation.h.

References edm::helper::IndexRangeAssociation::size().

Referenced by BeautifulSoup.PageElement::_invert().

113  {
114  insert(r.id(), r.key(), startingOffset, size);
115  }
unsigned int size() const
Size of this collection (number of keys)
void insert(const RefKey &r, unsigned int startingOffset, unsigned int size)
Sets the starting offset for this key.
void IndexRangeAssociation::FastFiller::insert ( edm::ProductID  id,
unsigned int  key,
unsigned int  startingOffset,
unsigned int  size 
)

Sets the starting offset for this key (non-templated variant)

Definition at line 97 of file MultiAssociation.cc.

References edm::hlt::Exception, combine::key, edm::helper::IndexRangeAssociation::size(), and edm::helper::IndexRangeAssociation::throwUnexpectedProductID().

Referenced by BeautifulSoup.PageElement::_invert().

97  {
98  if (id != id_) IndexRangeAssociation::throwUnexpectedProductID(id,id_,"FastFiller::insert");
99  if (int(key) <= lastKey_) throw cms::Exception("Bad Key") <<
100  "IndexRangeAssociation::FastFiller: you must fill this in strict key order\n" <<
101  "\tLast key = " << lastKey_ << ", this key = " << key << "\n";
102  if (key >= end_) throw cms::Exception("Bad Key") <<
103  "IndexRangeAssociation::FastFiller: key index out of bounds for this collection\n" <<
104  "\tKey = " << key << ", bound = " << end_ << "\n";
105  if ((assoc_.ref_offsets_.back() != 0) && (int(startingOffset) != assoc_.ref_offsets_.back()))
106  throw cms::Exception("Bad Offset") <<
107  "IndexRangeAssociation::FastFiller: The start for this key is not the end of the preceding key.\n" <<
108  "\tThis offset = " << startingOffset << ", last key = " << lastKey_ <<
109  ", last end offset = " << assoc_.ref_offsets_.back() << "\n";
110  assoc_.ref_offsets_[start_ + key] = startingOffset;
111  lastKey_ = key;
112  assoc_.ref_offsets_.back() += size;
113 }
static void throwUnexpectedProductID(ProductID found, ProductID expected, const char *where)
unsigned int size() const
Size of this collection (number of keys)
int lastKey_
last key used to fill (to check that the new key must be strictly greater than lastKey_) ...
list key
Definition: combine.py:13

Member Data Documentation

IndexRangeAssociation& edm::helper::IndexRangeAssociation::FastFiller::assoc_
private

Definition at line 120 of file MultiAssociation.h.

Referenced by FastFiller().

unsigned int edm::helper::IndexRangeAssociation::FastFiller::end_
private

Definition at line 122 of file MultiAssociation.h.

Referenced by FastFiller().

const ProductID edm::helper::IndexRangeAssociation::FastFiller::id_
private

Definition at line 121 of file MultiAssociation.h.

int edm::helper::IndexRangeAssociation::FastFiller::lastKey_
private

last key used to fill (to check that the new key must be strictly greater than lastKey_)

Definition at line 124 of file MultiAssociation.h.

unsigned int edm::helper::IndexRangeAssociation::FastFiller::start_
private

Definition at line 122 of file MultiAssociation.h.

Referenced by FastFiller().