// Copyright 2019 The MathWorks, Inc. /** * @file * @brief Tree node that comprises the search tree */ #ifndef PLANNINGCODEGEN_TREENODE_HPP #define PLANNINGCODEGEN_TREENODE_HPP #include #include #include namespace nav { // Forward declaration template class TreeNodeMatchesFunctor; template class TreeNode { template friend class SearchTree; protected: std::size_t m_dim; public: TreeNode(std::size_t dim) : m_dim(dim) , m_state(dim, 0.0) { m_parent = nullptr; m_targetReached = false; m_costFromParent = static_cast(0.0); m_costFromRoot = static_cast(0.0); } ~TreeNode() { /*tree node destructor*/ } boolean_T isTargetReached() { return m_targetReached; } TreeNode* getChild(int32_T idx) { return m_children[idx]; } std::vector& getState() { return m_state; } void setState(std::vector newState) { m_state = newState; } std::size_t getNodeID() { return m_nodeID; } T getCostFromRoot() { return m_costFromRoot; } T getCostFromParent() { return m_costFromParent; } void setNodeID(std::size_t id) { m_nodeID = id; } void addToChildren(TreeNode* newNode) { m_children.push_back(newNode); newNode->m_parent = this; } void removeChild(TreeNode* nodePtr) { // erase-remove idiom m_children.erase(std::remove_if(m_children.begin(), m_children.end(), nav::TreeNodeMatchesFunctor(nodePtr))); } public: TreeNode* m_parent; T m_costFromParent; T m_costFromRoot; std::vector trajectoryFromParent; protected: boolean_T m_targetReached; std::vector*> m_children; std::vector m_state; std::size_t m_nodeID; }; template class TreeNodeMatchesFunctor { TreeNode* m_nodePtr; public: TreeNodeMatchesFunctor(TreeNode* nodePtr) : m_nodePtr(nodePtr) {} bool operator()(TreeNode* ptr) const { return m_nodePtr == ptr; } }; } // namespace nav #endif