LArSoft  v07_13_02
Liquid Argon Software toolkit - http://larsoft.org/
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 5432 of file GeometryCore.h.

Member Typedef Documentation

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

Definition at line 5449 of file GeometryCore.h.

Constructor & Destructor Documentation

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

Constructor: start from this node.

Definition at line 5435 of file GeometryCore.h.

5436  { 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 2049 of file GeometryCore.cxx.

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

2049  {
2050 
2051  std::vector<TGeoNode const*> node_path(current_path.size());
2052 
2053  std::transform(current_path.begin(), current_path.end(), node_path.begin(),
2054  [](NodeInfo_t const& node_info){ return node_info.self; });
2055  return node_path;
2056 
2057  } // ROOTGeoNodeForwardIterator::path()
std::vector< NodeInfo_t > current_path
which node, which sibling?
void geo::ROOTGeoNodeForwardIterator::init ( TGeoNode const *  start_node)
protected

Definition at line 2070 of file GeometryCore.cxx.

2070  {
2071  current_path.clear();
2072  if (!start_node) return;
2073  current_path.emplace_back(start_node, 0U);
2075  } // 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 5439 of file GeometryCore.h.

5440  { 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 2030 of file GeometryCore.cxx.

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

2030  {
2031  if (current_path.empty()) return *this;
2032  if (current_path.size() == 1) { current_path.pop_back(); return *this; }
2033 
2034  // I am done; all my descendants were also done already;
2035  // first look at my younger siblings
2036  NodeInfo_t& current = current_path.back();
2037  NodeInfo_t const& parent = current_path[current_path.size() - 2];
2038  if (++(current.sibling) < parent.self->GetNdaughters()) {
2039  // my next sibling exists, let's parse his descendents
2040  current.self = parent.self->GetDaughter(current.sibling);
2042  }
2043  else current_path.pop_back(); // no sibling, it's time for mum
2044  return *this;
2045  } // ROOTGeoNodeForwardIterator::operator++
std::vector< NodeInfo_t > current_path
which node, which sibling?
void geo::ROOTGeoNodeForwardIterator::reach_deepest_descendant ( )
protected

Definition at line 2061 of file GeometryCore.cxx.

2061  {
2062  Node_t descendent = current_path.back().self;
2063  while (descendent->GetNdaughters() > 0) {
2064  descendent = descendent->GetDaughter(0);
2065  current_path.emplace_back(descendent, 0U);
2066  } // while
2067  } // 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 5457 of file GeometryCore.h.


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