All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 5589 of file GeometryCore.h.

Member Typedef Documentation

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

Definition at line 5606 of file GeometryCore.h.

Constructor & Destructor Documentation

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

Constructor: start from this node.

Definition at line 5592 of file GeometryCore.h.

5593  { 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 2046 of file GeometryCore.cxx.

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

Definition at line 2067 of file GeometryCore.cxx.

2067  {
2068  current_path.clear();
2069  if (!start_node) return;
2070  current_path.emplace_back(start_node, 0U);
2072  } // 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 5596 of file GeometryCore.h.

5597  { 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 2027 of file GeometryCore.cxx.

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

Definition at line 2058 of file GeometryCore.cxx.

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


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