/* * Copyright (c) 2014, Oculus VR, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * */ /// \file DS_Tree.h /// \internal /// \brief Just a regular tree /// #ifndef __DS_TREE_H #define __DS_TREE_H #include "Export.hpp" #include "DS_List.hpp" #include "DS_Queue.hpp" #include "RakMemoryOverride.hpp" /// The namespace DataStructures was only added to avoid compiler errors for commonly named data structures /// As these data structures are stand-alone, you can use them outside of RakNet for your own projects if you wish. namespace DataStructures { template class RAK_DLL_EXPORT Tree { public: Tree(); Tree(TreeType &inputData); ~Tree(); void LevelOrderTraversal(DataStructures::List &output); void AddChild(TreeType &newData); void DeleteDecendants(void); TreeType data; DataStructures::List children; }; template Tree::Tree() { } template Tree::Tree(TreeType &inputData) { data=inputData; } template Tree::~Tree() { DeleteDecendants(); } template void Tree::LevelOrderTraversal(DataStructures::List &output) { unsigned i; Tree *node; DataStructures::Queue*> queue; for (i=0; i < children.Size(); i++) queue.Push(children[i]); while (queue.Size()) { node=queue.Pop(); output.Insert(node, _FILE_AND_LINE_); for (i=0; i < node->children.Size(); i++) queue.Push(node->children[i]); } } template void Tree::AddChild(TreeType &newData) { children.Insert(RakNet::OP_NEW(newData, _FILE_AND_LINE_)); } template void Tree::DeleteDecendants(void) { /* DataStructures::List output; LevelOrderTraversal(output); unsigned i; for (i=0; i < output.Size(); i++) RakNet::OP_DELETE(output[i], _FILE_AND_LINE_); */ // Already recursive to do this unsigned int i; for (i=0; i < children.Size(); i++) RakNet::OP_DELETE(children[i], _FILE_AND_LINE_); } } #endif