CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
OneToMany.h
Go to the documentation of this file.
1 #ifndef DataFormats_Common_OneToMany_h
2 #define DataFormats_Common_OneToMany_h
7 #include <map>
8 #include <vector>
9 
10 namespace edm {
11  template <typename CKey, typename CVal, typename index = unsigned int>
12  class OneToMany {
18  typedef std::vector<index> map_assoc;
19 
20  public:
28  typedef index index_type;
30  typedef std::map<index_type, map_assoc> map_type;
34  typedef std::map<const typename CKey::value_type *, std::vector<const typename CVal::value_type *> >
37  typedef std::vector<const typename CKey::value_type *> transient_key_vector;
39  typedef std::vector<std::vector<const typename CVal::value_type *> > transient_val_vector;
41  static void insert(ref_type &ref, map_type &m, const key_type &k, const data_type &v) {
42  if (k.isNull() || v.isNull())
43  Exception::throwThis(errors::InvalidReference, "can't insert null references in AssociationMap");
44  if (ref.key.isNull()) {
45  if (k.isTransient() || v.isTransient()) {
47  "can't insert transient references in uninitialized AssociationMap");
48  }
49  //another thread might cause productGetter() to change values
50  EDProductGetter const *getter = ref.key.productGetter();
51  if (getter == nullptr) {
53  "Can't insert into AssociationMap unless it was properly initialized.\n"
54  "The most common fix for this is to add arguments to the call to the\n"
55  "AssociationMap constructor that are valid Handle's to the containers.\n"
56  "If you don't have valid handles or either template parameter to the\n"
57  "AssociationMap is a View, then see the comments in AssociationMap.h.\n"
58  "(note this was a new requirement added in the 7_5_X release series)\n");
59  }
60  ref.key = KeyRefProd(k.id(), getter);
61  ref.val = ValRefProd(v.id(), ref.val.productGetter());
62  }
63  helpers::checkRef(ref.key, k);
64  helpers::checkRef(ref.val, v);
65  index_type ik = index_type(k.key()), iv = index_type(v.key());
66  m[ik].push_back(iv);
67  }
68  static void insert(ref_type &ref, map_type &m, const key_type &k, const val_type &v) {
69  for (typename val_type::const_iterator i = v.begin(), iEnd = v.end(); i != iEnd; ++i)
70  insert(ref, m, k, *i);
71  }
73  static val_type val(const ref_type &ref, const map_assoc &iv) {
74  val_type v;
75  for (typename map_assoc::const_iterator idx = iv.begin(), idxEnd = iv.end(); idx != idxEnd; ++idx)
76  v.push_back(edm::Ref<CVal>(ref.val, *idx));
77  return v;
78  }
80  static typename map_type::size_type size(const map_assoc &v) { return v.size(); }
82  static void sort(map_type &) {}
84  static transient_map_type transientMap(const ref_type &ref, const map_type &map) {
86  if (!map.empty()) {
87  const CKey &ckey = *ref.key;
88  const CVal &cval = *ref.val;
89  for (typename map_type::const_iterator i = map.begin(); i != map.end(); ++i) {
90  const map_assoc &a = i->second;
91  const typename CKey::value_type *k = &ckey[i->first];
92  std::vector<const typename CVal::value_type *> v;
93  for (typename map_assoc::const_iterator j = a.begin(); j != a.end(); ++j) {
94  const typename CVal::value_type *val = &cval[*j];
95  v.push_back(val);
96  }
97  m.insert(std::make_pair(k, v));
98  }
99  }
100  return m;
101  }
103  static transient_key_vector transientKeyVector(const ref_type &ref, const map_type &map) {
105  if (!map.empty()) {
106  const CKey &ckey = *ref.key;
107  for (typename map_type::const_iterator i = map.begin(); i != map.end(); ++i)
108  m.push_back(&ckey[i->first]);
109  }
110  return m;
111  }
113  static transient_val_vector transientValVector(const ref_type &ref, const map_type &map) {
115  if (!map.empty()) {
116  const CVal &cval = *ref.val;
117  for (typename map_type::const_iterator i = map.begin(); i != map.end(); ++i) {
118  const map_assoc &a = i->second;
119  std::vector<const typename CVal::value_type *> v;
120  m.push_back(v);
121  for (typename map_assoc::const_iterator j = a.begin(); j != a.end(); ++j)
122  m.back().push_back(&cval[*j]);
123  }
124  }
125  return m;
126  }
127  };
128 } // namespace edm
129 
130 #endif
std::map< const typename CKey::value_type *, std::vector< const typename CVal::value_type * > > transient_map_type
transient map type
Definition: OneToMany.h:35
static void sort(map_type &)
sort
Definition: OneToMany.h:82
helpers::KeyVal< KeyRefProd, ValRefProd > ref_type
reference set type
Definition: OneToMany.h:32
int32_t *__restrict__ iv
static val_type val(const ref_type &ref, const map_assoc &iv)
return values collection
Definition: OneToMany.h:73
edm::Ref< CKey > key_type
insert key type
Definition: OneToMany.h:24
static void insert(ref_type &ref, map_type &m, const key_type &k, const data_type &v)
insert in the map
Definition: OneToMany.h:41
bool isTransient() const
Checks if this ref is transient (i.e. not persistable).
Definition: Ref.h:263
static void insert(ref_type &ref, map_type &m, const key_type &k, const val_type &v)
Definition: OneToMany.h:68
key_type key() const
Accessor for product key.
Definition: Ref.h:250
std::map< index_type, map_assoc > map_type
map type
Definition: OneToMany.h:30
const_iterator end() const
Termination of iteration.
Definition: RefVector.h:228
edm::Ref< CVal > data_type
insert val type
Definition: OneToMany.h:26
uint16_t size_type
static map_type::size_type size(const map_assoc &v)
size of data_type
Definition: OneToMany.h:80
ProductID id() const
Accessor for product ID.
Definition: Ref.h:244
const_iterator begin() const
Initialize an iterator over the RefVector.
Definition: RefVector.h:223
static void throwThis(Code category, char const *message0="", char const *message1="", char const *message2="", char const *message3="", char const *message4="")
Definition: EDMException.cc:83
index index_type
index type
Definition: OneToMany.h:28
edm::RefProd< CKey > KeyRefProd
reference to &quot;key&quot; collection
Definition: OneToMany.h:14
edm::RefProd< CVal > ValRefProd
reference to &quot;value&quot; collection
Definition: OneToMany.h:16
static transient_map_type transientMap(const ref_type &ref, const map_type &map)
fill transient map
Definition: OneToMany.h:84
bool isNull() const
Checks for null.
Definition: Ref.h:235
std::vector< const typename CKey::value_type * > transient_key_vector
transient key vector
Definition: OneToMany.h:37
edm::RefVector< CVal > val_type
values reference collection type
Definition: OneToMany.h:22
double a
Definition: hdecay.h:119
void push_back(value_type const &ref)
Add a Ref&lt;C, T&gt; to the RefVector.
Definition: RefVector.h:67
static transient_val_vector transientValVector(const ref_type &ref, const map_type &map)
fill transient val vector
Definition: OneToMany.h:113
static transient_key_vector transientKeyVector(const ref_type &ref, const map_type &map)
fill transient key vector
Definition: OneToMany.h:103
void checkRef(const RP &rp, const R &r)
throw if r hasn&#39;t the same id as rp
std::vector< std::vector< const typename CVal::value_type * > > transient_val_vector
transient val vector
Definition: OneToMany.h:39
std::vector< index > map_assoc
internal map associated data
Definition: OneToMany.h:18