1 #ifndef DataFormats_Common_OneToManyWithQualityGeneric_h 2 #define DataFormats_Common_OneToManyWithQualityGeneric_h 13 template<
typename CKey,
typename CVal,
typename Q,
typename index =
unsigned int,
24 typedef std::vector<std::pair<index, Q> >
map_assoc;
28 typedef std::vector<std::pair<ValRef, Q> >
val_type;
36 typedef std::map<index_type, map_assoc>
map_type;
41 std::vector<std::pair<const typename CVal::value_type *, Q > >
46 typedef std::vector<std::vector<std::pair<const typename CVal::value_type *, Q > >
49 static void insert(ref_type& ref, map_type &
m,
50 const key_type &
k,
const data_type &
v) {
51 const ValRef & vref = v.first;
52 if (k.isNull() || vref.isNull())
54 "can't insert null references in AssociationMap");
55 if(ref.
key.isNull()) {
56 if(k.isTransient() || vref.isTransient()) {
58 "can't insert transient references in uninitialized AssociationMap");
62 if(getter ==
nullptr) {
64 "Can't insert into AssociationMap unless it was properly initialized.\n" 65 "The most common fix for this is to add arguments to the call to the\n" 66 "AssociationMap constructor that are valid Handle's to the containers.\n" 67 "If you don't have valid handles or either template parameter to the\n" 68 "AssociationMap is a View, then see the comments in AssociationMap.h.\n" 69 "(note this was a new requirement added in the 7_5_X release series)\n");
71 ref.
key = KeyRefProd(k.id(), getter);
72 ref.
val = ValRefProd(vref.id(), ref.
val.productGetter());
76 m[ik].push_back(std::make_pair(iv, v.second));
78 static void insert(ref_type & ref, map_type &
m,
const key_type &
k,
const val_type &
v) {
79 for(
typename val_type::const_iterator
i = v.begin(), iEnd = v.end();
i != iEnd; ++
i)
83 static val_type
val(
const ref_type & ref,
const map_assoc & iv) {
85 for(
typename map_assoc::const_iterator
idx = iv.begin(), idxEnd = iv.end();
idx != idxEnd; ++
idx)
86 v.push_back(std::make_pair(ValRef(ref.
val,
idx->first),
idx->second));
96 static void sort(map_type &
m) {
98 for(
typename map_type::iterator
i = m.begin(), iEnd = m.end();
i != iEnd; ++
i) {
99 using std::placeholders::_1;
100 using std::placeholders::_2;
101 map_assoc &
v =
i->second;
106 std::bind(std::less<Q>(),
117 const CKey & ckey = * ref.
key;
118 const CVal & cval = * ref.
val;
119 for(
typename map_type::const_iterator
i = map.begin();
i != map.end(); ++
i) {
120 const map_assoc &
a =
i->second;
121 const typename CKey::value_type *
k = & ckey[
i->first];
122 std::vector<std::pair<const typename CVal::value_type *, Q> >
v;
123 for(
typename map_assoc::const_iterator j = a.begin(); j != a.end(); ++j) {
125 v.push_back(std::make_pair(val, j->second));
127 m.insert(std::make_pair(k, v));
134 transient_key_vector
m;
136 const CKey & ckey = * ref.
key;
137 for(
typename map_type::const_iterator
i = map.begin();
i != map.end(); ++
i)
138 m.push_back(& ckey[
i->first]);
146 const CVal & cval = * ref.
val;
147 for(
typename map_type::const_iterator
i = map.begin();
i != map.end(); ++
i) {
148 const map_assoc &
a =
i->second;
149 std::vector<std::pair<const typename CVal::value_type *, Q> >
v;
151 for(
typename map_assoc::const_iterator j = a.begin(); j != a.end(); ++j)
152 m.back().push_back(std::make_pair(& cval[ j->first ], j->second));
static map_type::size_type size(const map_assoc &v)
size of data_type
KeyRefProd keyrefprod_type
reference to "key" collection
static void sort(map_type &m)
sort
static transient_val_vector transientValVector(const ref_type &ref, const map_type &map)
fill transient val vector
static val_type val(const ref_type &ref, const map_assoc &iv)
return values collection
static void throwThis(Code category, char const *message0="", char const *message1="", char const *message2="", char const *message3="", char const *message4="")
std::vector< std::pair< ValRef, Q > > val_type
values reference collection type
U second(std::pair< T, U > const &p)
KeyRef key_type
insert key type
Container::value_type value_type
static transient_key_vector transientKeyVector(const ref_type &ref, const map_type &map)
fill transient key vector
static void insert(ref_type &ref, map_type &m, const key_type &k, const val_type &v)
RefProd< C > refprod_type
helpers::KeyVal< keyrefprod_type, valrefprod_type > ref_type
reference set type
index index_type
index type
std::vector< std::pair< index, Q > > map_assoc
internal map associated data
static transient_map_type transientMap(const ref_type &ref, const map_type &map)
fill transient map
std::pair< ValRef, Q > data_type
insert val type
std::vector< std::vector< std::pair< const typename CVal::value_type *, Q > > > transient_val_vector
transient val vector
std::vector< const typename CKey::value_type * > transient_key_vector
transient key vector
void checkRef(const RP &rp, const R &r)
throw if r hasn't the same id as rp
static void insert(ref_type &ref, map_type &m, const key_type &k, const data_type &v)
insert in the map
std::map< index_type, map_assoc > map_type
map type
ValRefProd valrefprod_type
reference to "value" collection
std::map< const typename CKey::value_type *, std::vector< std::pair< const typename CVal::value_type *, Q > > > transient_map_type
transient map type