1 #ifndef DataFormats_Common_ValueMap_h 2 #define DataFormats_Common_ValueMap_h 20 template<
typename Map>
25 typedef std::map<ProductID, value_vector>
value_map;
34 if (map.empty())
return;
35 typename id_offset_vector::const_iterator j = map.ids_.begin();
36 const typename id_offset_vector::const_iterator
end = map.ids_.end();
38 const size_t size = map.values_.size();
43 size_t max = (j == end ? size : j->second);
44 typename value_map::iterator
f =
values_.find(
id);
48 values.push_back( map.values_[i++] );
51 template<
typename H,
typename I>
54 size_t size = h->size(), sizeIt = end -
begin;
56 typename value_map::const_iterator
f =
values_.find(
id);
67 for(
typename value_map::const_iterator
i =
values_.begin();
i !=
values_.end(); ++
i) {
69 map_.ids_.push_back(std::make_pair(
id, off));
70 const value_vector &
values =
i->second;
71 for(
typename value_vector::const_iterator j = values.begin(); j != values.end(); ++j) {
72 map_.values_.push_back( *j );
88 "ValueMap::Filler: handle and reference " 89 "collections should the same size\n");
93 e <<
"index map has already been filled for id: " <<
id <<
"\n";
98 "ValueMap: trying to add entries for an already existing product\n");
117 ids_.swap(other.
ids_);
126 template<
typename RefKey>
128 return get(r.id(), r.key());
132 typename id_offset_vector::const_iterator
f = getIdOffset(
id);
133 if(f==ids_.end()) throwNotExisting();
134 offset off = f->second;
136 if(j >=
values_.size()) throwIndexBound();
142 template<
typename RefKey>
144 return get(r.id(), r.key());
155 return getIdOffset(
id) != ids_.end();
158 size_t idSize()
const {
return ids_.size(); }
162 ids_.shrink_to_fit();
174 typename container::const_iterator
begin()
const {
175 return values_->begin() + i_->second;
177 typename container::const_iterator
end()
const {
179 id_offset_vector::const_iterator
end = i_; ++
end;
181 return values_->begin() + end->second;
199 const id_offset_vector::const_iterator &
end,
200 const container *
values) :
203 id_offset_vector::const_iterator
i_,
end_;
207 const_iterator
begin()
const {
return const_iterator(ids_.begin(), ids_.end(), &
values_); }
208 const_iterator
end()
const {
return const_iterator(ids_.end(), ids_.end(), &
values_); }
211 const id_offset_vector &
ids()
const {
return ids_; }
220 id_offset_vector ids_;
222 typename id_offset_vector::const_iterator getIdOffset(
ProductID id)
const {
223 typename id_offset_vector::const_iterator
i = std::lower_bound(ids_.begin(), ids_.end(),
id, IDComparator());
224 if(i==ids_.end())
return i;
225 return i->first ==
id ? i : ids_.end();
260 template <
typename T>
bool operator<(const const_iterator &o) const
const_iterator end() const
id_offset_vector::const_iterator i_
const_iterator(const id_offset_vector::const_iterator &i_, const id_offset_vector::const_iterator &end, const container *values)
Association< C > operator+(const Association< C > &a1, const Association< C > &a2)
std::vector< l1t::Jet >::iterator end_
ValueMap< T > & operator+=(const ValueMap< T > &o)
const id_offset_vector & ids() const
meant to be used in AssociativeIterator, not by the ordinary user
void swap(ValueMap &other)
void insert(const H &h, I begin, I end)
Basic3DVector & operator-=(const Basic3DVector< U > &p)
difference_type operator-(const const_iterator &o) const
const_iterator operator-(difference_type n) const
#define CMS_CLASS_VERSION(_version_)
bool operator()(const std::pair< ProductID, offset > &p, const ProductID &id)
const_iterator & operator++()
ptrdiff_t difference_type
static void throwThis(Code category, char const *message0="", char const *message1="", char const *message2="", char const *message3="", char const *message4="")
size_t rawIndexOf(ProductID id, size_t idx) const
void throwIndexBound() const
container::reference reference_type
bool contains(ProductID id) const
void throwFillSize() const
void swap(IndexRangeAssociation &lhs, IndexRangeAssociation &rhs)
const_iterator operator--(int)
container::const_reference const_reference_type
std::vector< std::pair< ProductID, offset > > id_offset_vector
const_iterator operator+(difference_type n) const
const_iterator & operator--()
bool operator!=(const const_iterator &ci) const
void add(const ValueMap< T > &o)
void throwNotExisting() const
const std::complex< double > I
helper::Filler< ValueMap< T > > Filler
const_iterator operator++(int)
std::map< ProductID, value_vector > value_map
const_iterator begin() const
std::vector< typename Map::value_type > value_vector
container::const_iterator begin() const
reference_type operator[](const RefKey &r)
ValueMap & operator=(ValueMap const &rhs)
std::vector< size_t > index_vector
bool operator==(const const_iterator &ci) const
std::vector< value_type > container
const_reference_type operator[](const RefKey &r) const
Map::id_offset_vector id_offset_vector
void throwFillID(ProductID id) const
const container * values_
container::const_iterator end() const
const T & operator[](size_t i)
Basic3DVector & operator+=(const Basic3DVector< U > &p)
EventID const & max(EventID const &lh, EventID const &rh)