Classes | Public Member Functions | Protected Types | Protected Member Functions | Protected Attributes | List of all members
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 5590 of file GeometryCore.h.

Member Typedef Documentation

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

Definition at line 5607 of file GeometryCore.h.

Constructor & Destructor Documentation

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

Constructor: start from this node.

Definition at line 5593 of file GeometryCore.h.

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

Member Function Documentation

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

Returns the full path of the current node.

Definition at line 1957 of file GeometryCore.cxx.

1957  {
1958 
1959  std::vector<TGeoNode const*> node_path(current_path.size());
1960 
1961  std::transform(current_path.begin(), current_path.end(), node_path.begin(),
1962  [](NodeInfo_t const& node_info){ return node_info.self; });
1963  return node_path;
1964 
1965  } // ROOTGeoNodeForwardIterator::path()
std::vector< NodeInfo_t > current_path
which node, which sibling?
void geo::ROOTGeoNodeForwardIterator::init ( TGeoNode const *  start_node)
protected

Definition at line 1978 of file GeometryCore.cxx.

1978  {
1979  current_path.clear();
1980  if (!start_node) return;
1981  current_path.emplace_back(start_node, 0U);
1983  } // ROOTGeoNodeForwardIterator::init()
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 5597 of file GeometryCore.h.

5598  { return current_path.empty()? nullptr: current_path.back().self; }
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 1938 of file GeometryCore.cxx.

1938  {
1939  if (current_path.empty()) return *this;
1940  if (current_path.size() == 1) { current_path.pop_back(); return *this; }
1941 
1942  // I am done; all my descendants were also done already;
1943  // first look at my younger siblings
1944  NodeInfo_t& current = current_path.back();
1945  NodeInfo_t const& parent = current_path[current_path.size() - 2];
1946  if (++(current.sibling) < parent.self->GetNdaughters()) {
1947  // my next sibling exists, let's parse his descendents
1948  current.self = parent.self->GetDaughter(current.sibling);
1950  }
1951  else current_path.pop_back(); // no sibling, it's time for mum
1952  return *this;
1953  } // 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 geo::ROOTGeoNodeForwardIterator::reach_deepest_descendant ( )
protected

Definition at line 1969 of file GeometryCore.cxx.

1969  {
1970  Node_t descendent = current_path.back().self;
1971  while (descendent->GetNdaughters() > 0) {
1972  descendent = descendent->GetDaughter(0);
1973  current_path.emplace_back(descendent, 0U);
1974  } // while
1975  } // ROOTGeoNodeForwardIterator::reach_deepest_descendant()
std::vector< NodeInfo_t > current_path
which node, which sibling?

Member Data Documentation

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

which node, which sibling?

Definition at line 5615 of file GeometryCore.h.


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