All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
DataHandleHolderVisitor.cpp
Go to the documentation of this file.
5 #include <tuple>
6 #include <typeinfo>
7 
8 namespace {
9  using std::make_tuple;
10 }
11 
13  : m_ido(ido), m_odo(odo)
14 {
15 }
16 
18  if (!v) {
19  return;
20  }
21 
22  // Loop over inputs and outputs of handles, extra dependiencies and objects to
23  // collect all of them.
24  // Handles and extra dependencies are those of a specific algorith or tool, while
25  // the collection of data objects also contains those of the tree of tools and
26  // algorithms below it.
27 
28  // Loop over input handles and output handles and store those with with non-empty keys
29  // in the container of input objects passed to us and the others in a container of those
30  // we ignore for debug purposes. To avoid multiple for loops, make some tuples and loop
31  // over those.
32  for (auto& hs : {make_tuple(v->inputHandles(), std::ref(m_ido), std::ref(m_ign_i)),
33  make_tuple(v->outputHandles(), std::ref(m_odo), std::ref(m_ign_o))}) {
34  for (const auto& h : std::get<0>(hs)) {
35  if (! h->objKey().empty()) {
36  std::get<1>(hs).emplace(h->fullKey());
37  } else {
38  std::get<2>(hs).emplace(h->fullKey());
39  }
40  }
41  }
42 
43  // The containers of handles are a different type than the on of input deps and input
44  // objects, so we need another loop here.
45  // NOTE: perhaps a view from range v3 can be used to also avoid this second loop.
46  for (auto& hs : {
47  make_tuple(v->extraInputDeps(), std::ref(m_ido), std::ref(m_ign_i)),
48  make_tuple(v->extraOutputDeps(), std::ref(m_odo), std::ref(m_ign_o)),
49  make_tuple(v->inputDataObjs(), std::ref(m_ido), std::ref(m_ign_i)),
50  make_tuple(v->outputDataObjs(), std::ref(m_odo), std::ref(m_ign_o))
51  }) {
52  for (const auto& h : std::get<0>(hs)) {
53  if (! h.key().empty()) {
54  std::get<1>(hs).emplace(h);
55  } else {
56  std::get<2>(hs).emplace(h);
57  }
58  }
59  }
60 }
void visit(const IDataHandleHolder *visitee) override
DataObjIDColl m_ign_o
T make_tuple(T...args)
DataObjIDColl m_ign_i
DataObjIDColl & m_ido
virtual std::vector< Gaudi::DataHandle * > inputHandles() const =0
virtual std::vector< Gaudi::DataHandle * > outputHandles() const =0
virtual const DataObjIDColl & extraOutputDeps() const =0
virtual const DataObjIDColl & extraInputDeps() const =0
virtual const DataObjIDColl & inputDataObjs() const =0
T ref(T...args)
DataObjIDColl & m_odo
DHHVisitor(DataObjIDColl &ido, DataObjIDColl &odo)
virtual const DataObjIDColl & outputDataObjs() const =0