From b23f61eefd7e87cec1e1c4b4d90a6e18f6329437 Mon Sep 17 00:00:00 2001 From: Sylvain Pion Date: Sun, 30 Dec 2007 16:51:02 +0000 Subject: [PATCH] Make Tree_base_node type safe using CRTP. (removes frightening aliasing breakage warnings) --- SearchStructures/include/CGAL/Range_tree_d.h | 21 ++++++++++--------- .../include/CGAL/Segment_tree_d.h | 21 +++++++++++-------- SearchStructures/include/CGAL/Tree_base.h | 19 +++++++---------- 3 files changed, 30 insertions(+), 31 deletions(-) diff --git a/SearchStructures/include/CGAL/Range_tree_d.h b/SearchStructures/include/CGAL/Range_tree_d.h index da9acb99a08..545b66237b4 100644 --- a/SearchStructures/include/CGAL/Range_tree_d.h +++ b/SearchStructures/include/CGAL/Range_tree_d.h @@ -44,7 +44,7 @@ template class Range_tree_d; template -struct Range_tree_node: public Tree_node_base +struct Range_tree_node: public Tree_node_base > { private: typedef C_Data Data; @@ -56,23 +56,24 @@ struct Range_tree_node: public Tree_node_base //typedef Range_tree_d< C_Data, C_Window, C_Interface> rT_d; public: friend class Range_tree_d< C_Data, C_Window, C_Interface>; - + + typedef Tree_node_base > Base; + Range_tree_node() : sublayer(0) {} - - + Range_tree_node( Range_tree_node * p_left, Range_tree_node * p_right, const Data & v_obj, const Key & v_key ) - : Tree_node_base(p_left, p_right), object( v_obj ), key( v_key ), sublayer(0) + : Base(p_left, p_right), object( v_obj ), key( v_key ), sublayer(0) {} Range_tree_node( Range_tree_node * p_left, Range_tree_node * p_right, const Key & v_key ) - : Tree_node_base(p_left, p_right), key( v_key ), sublayer(0) + : Base(p_left, p_right), key( v_key ), sublayer(0) {} virtual ~Range_tree_node() @@ -112,14 +113,14 @@ protected: typedef Range_tree_node *link_type; static link_type& left(link_type x) { - return CGAL__static_cast(link_type&, (*x).left_link); + return x->left_link; } static link_type& right(link_type x) { - return CGAL__static_cast(link_type&, (*x).right_link); + return x->right_link; } static link_type& parent(link_type x) { - return CGAL__static_cast(link_type&, (*x).parent_link); + return x->parent_link; } link_type header; @@ -128,7 +129,7 @@ protected: link_type leftmost(){return left(header);} link_type root() const { if(header!=0) - return CGAL__static_cast(link_type&, header->parent_link); + return header->parent_link; // return parent(header); else return 0; diff --git a/SearchStructures/include/CGAL/Segment_tree_d.h b/SearchStructures/include/CGAL/Segment_tree_d.h index 984623a5cd9..04a99d5d0f5 100644 --- a/SearchStructures/include/CGAL/Segment_tree_d.h +++ b/SearchStructures/include/CGAL/Segment_tree_d.h @@ -41,7 +41,8 @@ template class Segment_tree_d; template -struct Segment_tree_node: public Tree_node_base +struct Segment_tree_node + : public Tree_node_base > { typedef C_Data Data; typedef C_Window Window; @@ -54,21 +55,23 @@ struct Segment_tree_node: public Tree_node_base Tree_base *sublayer; public: friend class Segment_tree_d< C_Data, C_Window, C_Interface>; - + + typedef Tree_node_base > Base; + Segment_tree_node() - : Tree_node_base(), sublayer(0) + : sublayer(0) {} Segment_tree_node(const Key& p_left_key, const Key& p_right_key) - : Tree_node_base(), left_key(p_left_key), right_key(p_right_key), sublayer(0) + : left_key(p_left_key), right_key(p_right_key), sublayer(0) {} Segment_tree_node(Segment_tree_node * p_left, Segment_tree_node * p_right, const Key& p_left_key, const Key& p_right_key) - : Tree_node_base(p_left,p_right), left_key(p_left_key), right_key(p_right_key), sublayer(0) + : Base(p_left,p_right), left_key(p_left_key), right_key(p_right_key), sublayer(0) {} ~Segment_tree_node(){ @@ -111,13 +114,13 @@ protected: } static link_type left(link_type x) { - return static_cast(x->left_link); + return x->left_link; } static link_type right(link_type x) { - return static_cast(x->right_link); + return x->right_link; } static link_type parent(link_type x) { - return static_cast( x->parent_link); + return x->parent_link; } link_type header; @@ -126,7 +129,7 @@ protected: link_type leftmost(){return left(header);} link_type root() const{ if(header!=0) - return static_cast(header->parent_link); + return header->parent_link; return 0; } diff --git a/SearchStructures/include/CGAL/Tree_base.h b/SearchStructures/include/CGAL/Tree_base.h index 0d7910923c9..48e8bd11f95 100644 --- a/SearchStructures/include/CGAL/Tree_base.h +++ b/SearchStructures/include/CGAL/Tree_base.h @@ -32,26 +32,21 @@ #define TREE_BASE_NULL 0 #endif -#ifndef CGAL__static_cast -#define CGAL__static_cast(TYPE,EXPR) (TYPE)(EXPR) -#endif - #define stlvector CGAL_BEGIN_NAMESPACE - - //link type definition of an ordinary vertex of the tree +template < typename Node > struct Tree_node_base { - void *parent_link; - void *left_link; - void *right_link; + Node *parent_link; + Node *left_link; + Node *right_link; Tree_node_base() - :parent_link(0), left_link(0), right_link(0) + : parent_link(0), left_link(0), right_link(0) {} - Tree_node_base(void* ll, void* rl) - :parent_link(0), left_link(ll), right_link(rl) + Tree_node_base(Node* ll, Node* rl) + : parent_link(0), left_link(ll), right_link(rl) {} };