1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
#include "OtherThingAlgorithm.h"
#include "FWCore/Framework/interface/Event.h"
#include "DataFormats/TestObjects/interface/OtherThing.h"
#include "DataFormats/Common/interface/Handle.h"
#include "DataFormats/Common/interface/RefToPtr.h"
namespace edmtest {
void OtherThingAlgorithm::run(edm::Handle<ThingCollection> const& parentHandle,
OtherThingCollection& result,
bool useRefs,
bool refsAreTransient) const {
const size_t numToMake = 20;
result.reserve(numToMake);
ThingCollection const* null = nullptr;
ThingCollection const* parent = nullptr;
if (useRefs) {
parent = parentHandle.product();
}
for (size_t i = 0; i < numToMake; ++i) {
OtherThing element;
if (!useRefs) {
element.a = i;
} else if (refsAreTransient) {
element.a = i;
element.refProd = edm::RefProd<ThingCollection>(parent);
element.ref = edm::Ref<ThingCollection>(element.refProd, i);
element.refVec.push_back(element.ref);
element.refVec.push_back(element.ref);
element.refVec.push_back(edm::Ref<ThingCollection>(parent, 19 - i));
edm::RefVector<ThingCollection>::iterator ri = element.refVec.begin();
element.refVec.erase(ri);
element.oneNullOneNot.push_back(edm::Ref<ThingCollection>(null, 0));
element.oneNullOneNot.push_back(edm::Ref<ThingCollection>(parent, 0));
assert(element.oneNullOneNot.size() == 2); // we'll check this in our tests
element.ptr = edm::Ptr<Thing>(&parent->at(i), i);
assert(element.ptr == edm::refToPtr(element.ref));
element.ptrVec.push_back(element.ptr);
element.ptrVec.push_back(edm::Ptr<Thing>(&parent->at(19 - i), 19 - i));
element.ptrOneNullOneNot.push_back(edm::Ptr<Thing>(nullptr, 0ul));
element.ptrOneNullOneNot.push_back(edm::Ptr<Thing>(&parent->at(0), 0ul));
assert(element.ptrOneNullOneNot.size() == 2); // we'll check this in our tests
edm::RefProd<ThingCollection> refProd = edm::RefProd<ThingCollection>(parentHandle);
edm::Ref<ThingCollection> ref = edm::Ref<ThingCollection>(refProd, i);
element.refToBaseProd = edm::RefToBaseProd<Thing>(refProd);
element.refToBase = edm::RefToBase<Thing>(ref);
} else {
element.a = i;
element.refProd = edm::RefProd<ThingCollection>(parentHandle);
element.ref = edm::Ref<ThingCollection>(element.refProd, i);
element.refVec.push_back(element.ref);
element.refVec.push_back(element.ref);
element.refVec.push_back(edm::Ref<ThingCollection>(parentHandle, 19 - i));
edm::RefVector<ThingCollection>::iterator ri = element.refVec.begin();
element.refVec.erase(ri);
element.oneNullOneNot.push_back(edm::Ref<ThingCollection>(parentHandle.id()));
element.oneNullOneNot.push_back(edm::Ref<ThingCollection>(parentHandle, 0));
assert(element.oneNullOneNot.size() == 2); // we'll check this in our tests
element.ptr = edm::Ptr<Thing>(parentHandle, i);
assert(element.ptr == edm::refToPtr(element.ref));
element.ptrVec.push_back(element.ptr);
element.ptrVec.push_back(edm::Ptr<Thing>(parentHandle, 19 - i));
element.ptrOneNullOneNot.push_back(edm::Ptr<Thing>(parentHandle.id()));
element.ptrOneNullOneNot.push_back(edm::Ptr<Thing>(parentHandle, 0));
assert(element.ptrOneNullOneNot.size() == 2); // we'll check this in our tests
edm::RefProd<ThingCollection> refProd = edm::RefProd<ThingCollection>(parentHandle);
edm::Ref<ThingCollection> ref = edm::Ref<ThingCollection>(refProd, i);
element.refToBaseProd = edm::RefToBaseProd<Thing>(element.refProd);
element.refToBase = edm::RefToBase<Thing>(element.ref);
}
result.push_back(element);
// element.refVec.clear(); // no need to clear; 'element' is created anew on every loop
}
}
} // namespace edmtest
|