LArSoft  v10_04_05
Liquid Argon Software toolkit - https://larsoft.org/
geo::ROOTGeoNodeForwardIterator Class Reference

Iterator to navigate through all the nodes. More...

Classes

struct  NodeInfo_t
 

Public Member Functions

 ROOTGeoNodeForwardIterator (TGeoNode const *start_node)
 
TGeoNode const * operator* () const
 Returns the pointer to the current node, or nullptr if none. More...
 
ROOTGeoNodeForwardIteratoroperator++ ()
 Points to the next node, or to nullptr if there are no more. More...
 
std::vector< TGeoNode const * > get_path () const
 Returns the full path of the current node. More...
 

Private Member Functions

void reach_deepest_descendant ()
 

Private Attributes

std::vector< NodeInfo_tcurrent_path
 which node, which sibling? More...
 

Detailed Description

Iterator to navigate through all the nodes.


Note that this is not a fully standard forward iterator in that it lacks of the postfix operator. The reason is that it's too expensive and it should be avoided.

Also I did not bother declaring the standard type definitions (that's just laziness).

An example of iteration:

TGeoNode const* pCurrentNode;

ROOTGeoNodeForwardIterator iNode(geom->ROOTGeoManager()->GetTopNode());
while ((pCurrentNode = *iNode)) {
  // do something with pCurrentNode
  ++iNode;
} // while

These iterators are one use only, and they can't be reset after a loop is completed.

Definition at line 272 of file GeometryCore.cxx.

Constructor & Destructor Documentation

geo::ROOTGeoNodeForwardIterator::ROOTGeoNodeForwardIterator ( TGeoNode const *  start_node)
explicit

Definition at line 670 of file GeometryCore.cxx.

671  {
672  if (start_node) {
673  current_path.push_back({start_node, 0U});
675  }
676  }
std::vector< NodeInfo_t > current_path
which node, which sibling?

Member Function Documentation

std::vector< TGeoNode const * > geo::ROOTGeoNodeForwardIterator::get_path ( ) const

Returns the full path of the current node.

Definition at line 701 of file GeometryCore.cxx.

Referenced by geo::CollectPathsByName::operator()().

702  {
703  std::vector<TGeoNode const*> node_path(current_path.size());
704  std::transform(current_path.begin(),
705  current_path.end(),
706  node_path.begin(),
707  [](NodeInfo_t const& node_info) { return node_info.self; });
708  return node_path;
709  }
std::vector< NodeInfo_t > current_path
which node, which sibling?
TGeoNode const* geo::ROOTGeoNodeForwardIterator::operator* ( ) const
inline

Returns the pointer to the current node, or nullptr if none.

Definition at line 277 of file GeometryCore.cxx.

278  {
279  return current_path.empty() ? nullptr : current_path.back().self;
280  }
std::vector< NodeInfo_t > current_path
which node, which sibling?
ROOTGeoNodeForwardIterator & geo::ROOTGeoNodeForwardIterator::operator++ ( )

Points to the next node, or to nullptr if there are no more.

Definition at line 678 of file GeometryCore.cxx.

References geo::ROOTGeoNodeForwardIterator::NodeInfo_t::self, and geo::ROOTGeoNodeForwardIterator::NodeInfo_t::sibling.

679  {
680  if (current_path.empty()) return *this;
681  if (current_path.size() == 1) {
682  current_path.pop_back();
683  return *this;
684  }
685 
686  // I am done; all my descendants were also done already; first look at my younger
687  // siblings
688  NodeInfo_t& current = current_path.back();
689  NodeInfo_t const& parent = current_path[current_path.size() - 2];
690  if (++(current.sibling) < parent.self->GetNdaughters()) {
691  // my next sibling exists, let's parse his descendents
692  current.self = parent.self->GetDaughter(current.sibling);
694  }
695  else
696  current_path.pop_back(); // no sibling, it's time for mum
697  return *this;
698  }
std::vector< NodeInfo_t > current_path
which node, which sibling?
void geo::ROOTGeoNodeForwardIterator::reach_deepest_descendant ( )
private

Definition at line 712 of file GeometryCore.cxx.

713  {
714  TGeoNode const* descendent = current_path.back().self;
715  while (descendent->GetNdaughters() > 0) {
716  descendent = descendent->GetDaughter(0);
717  current_path.push_back({descendent, 0U});
718  }
719  }
std::vector< NodeInfo_t > current_path
which node, which sibling?

Member Data Documentation

std::vector<NodeInfo_t> geo::ROOTGeoNodeForwardIterator::current_path
private

which node, which sibling?

Definition at line 295 of file GeometryCore.cxx.


The documentation for this class was generated from the following file: