From 71607c5efb3b85fe89a0ed86c21d583c28f773a8 Mon Sep 17 00:00:00 2001 From: grisenti Date: Sat, 17 Dec 2022 16:05:33 +0100 Subject: [PATCH] HPL1: fix const correctness in dgTree --- .../engine/libraries/newton/core/dgTree.cpp | 58 ++++++++++++++++--- .../engine/libraries/newton/core/dgTree.h | 12 ++-- 2 files changed, 58 insertions(+), 12 deletions(-) diff --git a/engines/hpl1/engine/libraries/newton/core/dgTree.cpp b/engines/hpl1/engine/libraries/newton/core/dgTree.cpp index 8a9bceb36d3..094114a4db6 100644 --- a/engines/hpl1/engine/libraries/newton/core/dgTree.cpp +++ b/engines/hpl1/engine/libraries/newton/core/dgTree.cpp @@ -22,26 +22,26 @@ #include "dgStdafx.h" #include "dgTree.h" -dgRedBackNode *dgRedBackNode::Minimum() const { - dgRedBackNode *ptr = (dgRedBackNode *) this; +const dgRedBackNode *dgRedBackNode::Minimum() const { + const dgRedBackNode *ptr = this; for (; ptr->m_left; ptr = ptr->m_left) { } return ptr; } -dgRedBackNode *dgRedBackNode::Maximum() const { - dgRedBackNode *ptr = (dgRedBackNode *) this; +const dgRedBackNode *dgRedBackNode::Maximum() const { + const dgRedBackNode *ptr = this; for (; ptr->m_right; ptr = ptr->m_right) { } return ptr; } -dgRedBackNode *dgRedBackNode::Prev() const { +const dgRedBackNode *dgRedBackNode::Prev() const { if (m_left) { return m_left->Maximum(); } - dgRedBackNode *node = (dgRedBackNode *) this; + const dgRedBackNode *node = this; dgRedBackNode *ptr = m_parent; for (; ptr && node == ptr->m_left; ptr = ptr->m_parent) { node = ptr; @@ -50,13 +50,55 @@ dgRedBackNode *dgRedBackNode::Prev() const { } -dgRedBackNode *dgRedBackNode::Next() const { +const dgRedBackNode *dgRedBackNode::Next() const { if (m_right) { return m_right->Minimum(); } - dgRedBackNode *node = (dgRedBackNode *) this; + const dgRedBackNode *node = this; + dgRedBackNode *ptr = m_parent; + for (; ptr && node == ptr->m_right; ptr = ptr->m_parent) { + node = ptr; + } + return ptr; +} + +dgRedBackNode *dgRedBackNode::Minimum() { + dgRedBackNode *ptr = this; + for (; ptr->m_left; ptr = ptr->m_left) { + } + return ptr; +} + +dgRedBackNode *dgRedBackNode::Maximum() { + dgRedBackNode *ptr = this; + for (; ptr->m_right; ptr = ptr->m_right) { + } + return ptr; +} + +dgRedBackNode *dgRedBackNode::Prev() { + if (m_left) { + return m_left->Maximum(); + } + + dgRedBackNode *node = this; + dgRedBackNode *ptr = m_parent; + for (; ptr && node == ptr->m_left; ptr = ptr->m_parent) { + node = ptr; + } + return ptr; + +} + +dgRedBackNode *dgRedBackNode::Next() { + + if (m_right) { + return m_right->Minimum(); + } + + dgRedBackNode *node = this; dgRedBackNode *ptr = m_parent; for (; ptr && node == ptr->m_right; ptr = ptr->m_parent) { node = ptr; diff --git a/engines/hpl1/engine/libraries/newton/core/dgTree.h b/engines/hpl1/engine/libraries/newton/core/dgTree.h index d500563cb28..3190ce27952 100644 --- a/engines/hpl1/engine/libraries/newton/core/dgTree.h +++ b/engines/hpl1/engine/libraries/newton/core/dgTree.h @@ -64,10 +64,14 @@ public: inline void SetInTreeFlag(dgUnsigned32 flag); void RemoveAll(); - dgRedBackNode *Prev() const; - dgRedBackNode *Next() const; - dgRedBackNode *Minimum() const; - dgRedBackNode *Maximum() const; + const dgRedBackNode *Prev() const; + const dgRedBackNode *Next() const; + const dgRedBackNode *Minimum() const; + const dgRedBackNode *Maximum() const; + dgRedBackNode *Prev(); + dgRedBackNode *Next(); + dgRedBackNode *Minimum(); + dgRedBackNode *Maximum(); void Remove(dgRedBackNode **const head); void Unlink(dgRedBackNode **const head); void InsertFixup(dgRedBackNode **const head);