/* * Original work: Copyright (c) 2014, Oculus VR, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * RakNet License.txt file in the licenses directory of this source tree. An additional grant * of patent rights can be found in the RakNet Patents.txt file in the same directory. * * * Modified work: Copyright (c) 2017, SLikeSoft UG (haftungsbeschränkt) * * This source code was modified by SLikeSoft. Modifications are licensed under the MIT-style * license found in the license.txt file in the root directory of this source tree. */ /// \file DS_Tree.h /// \internal /// \brief Just a regular tree /// #ifndef __DS_TREE_H #define __DS_TREE_H #include "Export.h" #include "DS_List.h" #include "DS_Queue.h" #include "memoryoverride.h" /// 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(SLNet::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++) SLNet::OP_DELETE(output[i], _FILE_AND_LINE_); */ // Already recursive to do this unsigned int i; for (i=0; i < children.Size(); i++) SLNet::OP_DELETE(children[i], _FILE_AND_LINE_); } } #endif