fork download
  1. #include <iostream>
  2. #include <memory>
  3. #include <vector>
  4. #include <tuple>
  5.  
  6.  
  7. template<class T>
  8. class NTree {
  9. public:
  10. NTree() {
  11. Root = std::make_shared<Node>();
  12. Pointer = Root;
  13. }
  14. NTree(const T& In) {
  15. Root = std::make_shared<Node>({ In,Root,{} });
  16. Pointer = Root;
  17. }
  18.  
  19. bool MoveParent() {
  20. if (Pointer == nullptr) { return false; }
  21. if (Pointer->Parent == nullptr) { return false; }
  22. Pointer = Pointer->Parent;
  23.  
  24. return true;
  25. }
  26. bool MoveChild(std::size_t P) {
  27. if (Pointer == nullptr) { return false; }
  28.  
  29. if (Pointer->Nodes.size() <= P) { return false; }
  30.  
  31. Pointer = Pointer->Nodes[P];
  32. return true;
  33. }
  34. std::size_t GetChildCount() {
  35. if (Pointer == nullptr) { return 0; }
  36. return Pointer->Nodes.size();
  37. }
  38. bool PushChild(const T& In) {
  39. if (Pointer == nullptr) { return false; }
  40. typename Node::SharedNode X = std::make_shared<Node>();
  41. X->Value = In;
  42. X->Parent = Pointer;
  43. Pointer->Nodes.push_back(X);
  44. //Pointer->Nodes.push_back({ In,Pointer,{} });
  45. return true;
  46. }
  47. bool PopChild(std::size_t P) {
  48. if (Pointer == nullptr) { return false; }
  49.  
  50. if (Pointer->Nodes.size() <= P) { return false; }
  51.  
  52. Pointer->Nodes.erase(Pointer->Nodes.begin() + P);
  53. return true;
  54. }
  55.  
  56. const std::tuple<bool,T&> GetValue() {
  57. return { Pointer != nullptr,Pointer->Value };
  58. }
  59.  
  60. bool SetValue(const T& In) {
  61. if (Pointer == nullptr) { return false; }
  62.  
  63. Pointer->Value = In;
  64. return true;
  65. }
  66.  
  67.  
  68. bool MoveRoot() {
  69. if (Root == nullptr) { return false; }
  70. Pointer = Root;
  71. return true;
  72. }
  73.  
  74. protected:
  75. struct Node {
  76. public:
  77. typedef std::shared_ptr<Node> SharedNode;
  78. T Value;
  79. SharedNode Parent=nullptr;
  80. std::vector<SharedNode> Nodes;
  81. };
  82.  
  83. typename Node::SharedNode Root;// = std::make_shared<Node>();
  84. typename Node::SharedNode Pointer;// = Root;
  85. };
  86.  
  87. int main() {
  88. NTree<int> T;
  89.  
  90. T.SetValue(10);
  91.  
  92. std::cout << std::get<1>(T.GetValue()) << std::endl;
  93.  
  94. T.PushChild(8);
  95. T.MoveChild(0);
  96. std::cout << std::get<1>(T.GetValue()) << std::endl;
  97. T.MoveParent();
  98. std::cout << T.GetChildCount() << std::endl;
  99. T.PopChild(0);
  100.  
  101. std::cout << T.GetChildCount() << std::endl;
  102.  
  103. return 0;
  104. }
Success #stdin #stdout 0s 4520KB
stdin
Standard input is empty
stdout
10
8
1
0