Classes | Public Member Functions | Protected Types | Protected Member Functions | Protected Attributes | List of all members
gar::geo::ROOTGeoNodeForwardIterator Class Reference

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

#include <GeometryCore.h>

Classes

struct  NodeInfo_t
 

Public Member Functions

 ROOTGeoNodeForwardIterator (TGeoNode const *start_node)
 Constructor: start from this node. More...
 
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...
 

Protected Types

using Node_t = TGeoNode const *
 

Protected Member Functions

void reach_deepest_descendant ()
 
void init (TGeoNode const *start_node)
 

Protected 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 1310 of file GeometryCore.h.

Member Typedef Documentation

using gar::geo::ROOTGeoNodeForwardIterator::Node_t = TGeoNode const*
protected

Definition at line 1325 of file GeometryCore.h.

Constructor & Destructor Documentation

gar::geo::ROOTGeoNodeForwardIterator::ROOTGeoNodeForwardIterator ( TGeoNode const *  start_node)
inline

Constructor: start from this node.

Definition at line 1313 of file GeometryCore.h.

1313 { init(start_node); }
void init(TGeoNode const *start_node)

Member Function Documentation

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

Returns the full path of the current node.

Definition at line 2013 of file GeometryCore.cxx.

2013  {
2014 
2015  std::vector<TGeoNode const*> node_path(current_path.size());
2016 
2017  std::transform(current_path.begin(), current_path.end(), node_path.begin(),
2018  [](NodeInfo_t const& node_info){ return node_info.self; });
2019  return node_path;
2020 
2021  } // ROOTGeoNodeForwardIterator::path()
std::vector< NodeInfo_t > current_path
which node, which sibling?
void gar::geo::ROOTGeoNodeForwardIterator::init ( TGeoNode const *  start_node)
protected

Definition at line 2034 of file GeometryCore.cxx.

2034  {
2035  current_path.clear();
2036  if (!start_node) return;
2037  current_path.emplace_back(start_node, 0U);
2039  } // ROOTGeoNodeForwardIterator::init()
std::vector< NodeInfo_t > current_path
which node, which sibling?
TGeoNode const* gar::geo::ROOTGeoNodeForwardIterator::operator* ( ) const
inline

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

Definition at line 1316 of file GeometryCore.h.

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

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

Definition at line 1994 of file GeometryCore.cxx.

1994  {
1995  if (current_path.empty()) return *this;
1996  if (current_path.size() == 1) { current_path.pop_back(); return *this; }
1997 
1998  // I am done; all my descendants were also done already;
1999  // first look at my younger siblings
2000  NodeInfo_t& current = current_path.back();
2001  NodeInfo_t const& parent = current_path[current_path.size() - 2];
2002  if (++(current.sibling) < parent.self->GetNdaughters()) {
2003  // my next sibling exists, let's parse his descendents
2004  current.self = parent.self->GetDaughter(current.sibling);
2006  }
2007  else current_path.pop_back(); // no sibling, it's time for mum
2008  return *this;
2009  } // ROOTGeoNodeForwardIterator::operator++
std::vector< NodeInfo_t > current_path
which node, which sibling?
static Entry * current
def parent(G, child, parent_type)
Definition: graph.py:67
void gar::geo::ROOTGeoNodeForwardIterator::reach_deepest_descendant ( )
protected

Definition at line 2025 of file GeometryCore.cxx.

2025  {
2026  Node_t descendent = current_path.back().self;
2027  while (descendent->GetNdaughters() > 0) {
2028  descendent = descendent->GetDaughter(0);
2029  current_path.emplace_back(descendent, 0U);
2030  } // while
2031  } // ROOTGeoNodeForwardIterator::reach_deepest_descendant()
std::vector< NodeInfo_t > current_path
which node, which sibling?

Member Data Documentation

std::vector<NodeInfo_t> gar::geo::ROOTGeoNodeForwardIterator::current_path
protected

which node, which sibling?

Definition at line 1333 of file GeometryCore.h.


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