選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

Node.cpp 1.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include "Node.h"
  2. #include "TagNode.h"
  3. Node::Node(NodeType type) {
  4. nodeType = type;
  5. }
  6. Node::~Node() {
  7. }
  8. std::vector<std::string> Node::getSourceList() {
  9. std::vector<std::string> returnVec;
  10. for (std::shared_ptr<Node>& child : children) {
  11. auto childSrcs = child->getSourceList();
  12. returnVec.insert(returnVec.end(),
  13. childSrcs.begin(),
  14. childSrcs.end());
  15. }
  16. return returnVec;
  17. }
  18. std::shared_ptr<Node> Node::findTagNodeParent(std::string tag, std::shared_ptr<Node> node) {
  19. if (!node.get()) {
  20. // found root?
  21. return nullptr;
  22. }
  23. TagNode *tagNode = dynamic_cast<TagNode*>(node.get());
  24. if (tagNode) {
  25. if (tagNode->tag == tag) {
  26. return node;
  27. }
  28. }
  29. return Node::findTagNodeParent(tag, node->parent);
  30. }
  31. void Node::findTagNodeChild(std::string tag, std::shared_ptr<Node> node, std::vector< std::shared_ptr<Node> > &results) {
  32. // check self
  33. TagNode *tagNode = dynamic_cast<TagNode*>(node.get());
  34. if (tagNode) {
  35. if (tagNode->tag == tag) {
  36. results.push_back(node);
  37. return;
  38. }
  39. }
  40. // check children
  41. for(auto child : node->children) {
  42. Node::findTagNodeChild(tag, child, results);
  43. }
  44. // not in us or any of our children
  45. return;
  46. }