File indexing completed on 2024-04-06 12:11:44
0001 #include "Fireworks/Core/interface/TEveElementIter.h"
0002 #include "Fireworks/Core/interface/fwLog.h"
0003 #include "TEveElement.h"
0004 #include "TNamed.h"
0005 #include <iostream>
0006 #include <stack>
0007 TEveElementIter::TEveElementIter(TEveElement* element, const char* regular_expression ) {
0008 if (regular_expression)
0009 regexp = TPRegexp(regular_expression);
0010 std::stack<std::pair<TEveElement*, TEveElement::List_i> > parents;
0011 parents.push(std::pair<TEveElement*, TEveElement::List_i>(element, element->BeginChildren()));
0012
0013 unsigned int index = 0;
0014 unsigned int indexLimit = 1000000;
0015 while (!parents.empty() && ++index < indexLimit) {
0016
0017 if (parents.top().second == parents.top().first->EndChildren()) {
0018 addElement(parents.top().first);
0019 parents.pop();
0020 if (!parents.empty())
0021 ++(parents.top().second);
0022 continue;
0023 }
0024
0025
0026 if ((*parents.top().second)->NumChildren() > 0) {
0027 parents.push(std::pair<TEveElement*, TEveElement::List_i>(*(parents.top().second),
0028 (*parents.top().second)->BeginChildren()));
0029 continue;
0030 }
0031
0032
0033 addElement(*(parents.top().second));
0034 ++(parents.top().second);
0035 }
0036 if (index >= indexLimit) {
0037 fwLog(fwlog::kError) << " tree loop limit is reached!\n"
0038 << "You either have a tree with loops or navigation logic is broken." << std::endl;
0039 elements.clear();
0040 }
0041 iter = elements.begin();
0042 }
0043
0044 TEveElement* TEveElementIter::next() {
0045 if (iter == elements.end())
0046 return nullptr;
0047 ++iter;
0048 return current();
0049 }
0050
0051 TEveElement* TEveElementIter::current() {
0052 if (iter == elements.end())
0053 return nullptr;
0054 else
0055 return *iter;
0056 }
0057
0058 TEveElement* TEveElementIter::reset() {
0059 iter = elements.begin();
0060 return current();
0061 }
0062
0063 void TEveElementIter::addElement(TEveElement* element) {
0064 if (!element)
0065 return;
0066 TNamed* named = dynamic_cast<TNamed*>(element);
0067 if (named && !regexp.MatchB(named->GetName()))
0068 return;
0069 elements.push_back(element);
0070 }