CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
OneToManyWithQualityGeneric.h
Go to the documentation of this file.
1 #ifndef DataFormats_Common_OneToManyWithQualityGeneric_h
2 #define DataFormats_Common_OneToManyWithQualityGeneric_h
6 #if !defined(__CINT__) && !defined(__MAKECINT__) && !defined(__REFLEX__)
7 #include <functional>
8 #else
9 #include "boost/bind.hpp"
10 #endif
11 #include <map>
12 #include <vector>
13 #include <algorithm>
14 
16 
17 namespace edm {
18  template<typename CKey, typename CVal, typename Q, typename index = unsigned int,
19  typename KeyRefProd = typename helper::MapRefViewTrait<CKey>::refprod_type,
20  typename ValRefProd = typename helper::MapRefViewTrait<CVal>::refprod_type,
21  typename KeyRef = typename helper::MapRefViewTrait<CKey>::ref_type,
22  typename ValRef = typename helper::MapRefViewTrait<CVal>::ref_type >
25  typedef KeyRefProd keyrefprod_type;
27  typedef ValRefProd valrefprod_type;
29  typedef std::vector<std::pair<index, Q> > map_assoc;
30 
31  public:
33  typedef std::vector<std::pair<ValRef, Q> > val_type;
35  typedef KeyRef key_type;
37  typedef std::pair<ValRef, Q> data_type;
39  typedef index index_type;
41  typedef std::map<index_type, map_assoc> map_type;
45  typedef std::map<const typename CKey::value_type *,
46  std::vector<std::pair<const typename CVal::value_type *, Q > >
49  typedef std::vector<const typename CKey::value_type *> transient_key_vector;
51  typedef std::vector<std::vector<std::pair<const typename CVal::value_type *, Q > >
54  static void insert(ref_type & ref, map_type & m,
55  const key_type & k, const data_type & v) {
56  const ValRef & vref = v.first;
57  if (k.isNull() || vref.isNull())
59  "can't insert null references in AssociationMap");
60  if (ref.key.isNull()) {
61  ref.key = keyrefprod_type(k);
62  ref.val = valrefprod_type(vref);
63  }
64  helpers::checkRef(ref.key, k); helpers::checkRef(ref.val, vref);
65  index_type ik = index_type(k.key()), iv = index_type(vref.key());
66  m[ik].push_back(std::make_pair(iv, v.second));
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(std::make_pair(ValRef(ref.val, idx->first), idx->second));
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 & m) {
83  // using namespace boost::lambda;
84  for(typename map_type::iterator i = m.begin(), iEnd = m.end(); i != iEnd; ++i) {
85 #if !defined(__CINT__) && !defined(__MAKECINT__) && !defined(__REFLEX__)
86  using std::placeholders::_1;
87  using std::placeholders::_2;
88 #endif
89  map_assoc & v = i->second;
90  // Q std::pair<index, Q>::*quality = &std::pair<index, Q>::second;
91  // std::sort(v.begin(), v.end(),
92  // bind(quality, boost::lambda::_2) < bind(quality, boost::lambda::_1));
93  std::sort(v.begin(), v.end(),
94 #if !defined(__CINT__) && !defined(__MAKECINT__) && !defined(__REFLEX__)
95  std::bind(std::less<Q>(),
96  std::bind(&std::pair<index, Q>::second,_2), std::bind( &std::pair<index, Q>::second,_1)
97 #else
98  boost::bind(std::less<Q>(),
99  boost::bind(&std::pair<index, Q>::second,_2), boost::bind( &std::pair<index, Q>::second,_1)
100 #endif
101  )
102  );
103 
104  }
105  }
107  static transient_map_type transientMap(const ref_type & ref, const map_type & map) {
109  const CKey & ckey = * ref.key;
110  const CVal & cval = * ref.val;
111  for(typename map_type::const_iterator i = map.begin(); i != map.end(); ++ i) {
112  const map_assoc & a = i->second;
113  const typename CKey::value_type * k = & ckey[i->first];
114  std::vector<std::pair<const typename CVal::value_type *, Q> > v;
115  for(typename map_assoc::const_iterator j = a.begin(); j != a.end(); ++j) {
116  const typename CVal::value_type * val = & cval[j->first];
117  v.push_back(std::make_pair(val, j->second));
118  }
119  m.insert(std::make_pair(k, v));
120  }
121  return m;
122  }
126  const CKey & ckey = * ref.key;
127  for(typename map_type::const_iterator i = map.begin(); i != map.end(); ++ i)
128  m.push_back(& ckey[i->first]);
129  return m;
130  }
134  const CVal & cval = * ref.val;
135  for(typename map_type::const_iterator i = map.begin(); i != map.end(); ++ i) {
136  const map_assoc & a = i->second;
137  std::vector<std::pair<const typename CVal::value_type *, Q> > v;
138  m.push_back(v);
139  for(typename map_assoc::const_iterator j = a.begin(); j != a.end(); ++j)
140  m.back().push_back(std::make_pair(& cval[ j->first ], j->second));
141  }
142  return m;
143  }
144  };
145 }
146 
147 #endif
int i
Definition: DBlmapReader.cc:9
static map_type::size_type size(const map_assoc &v)
size of data_type
KeyRefProd keyrefprod_type
reference to &quot;key&quot; collection
uint16_t size_type
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)
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)
int j
Definition: DBlmapReader.cc:9
Container::value_type value_type
helpers::KeyVal< keyrefprod_type, valrefprod_type > ref_type
reference set type
std::vector< std::pair< index, Q > > map_assoc
internal map associated data
tuple idx
DEBUGGING if hasattr(process,&quot;trackMonIterativeTracking2012&quot;): print &quot;trackMonIterativeTracking2012 D...
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
double a
Definition: hdecay.h:121
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&#39;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 &quot;value&quot; collection
std::map< const typename CKey::value_type *, std::vector< std::pair< const typename CVal::value_type *, Q > > > transient_map_type
transient map type