Make Tree_base_node type safe using CRTP.

(removes frightening aliasing breakage warnings)
This commit is contained in:
Sylvain Pion 2007-12-30 16:51:02 +00:00
parent a3b0c313a9
commit b23f61eefd
3 changed files with 30 additions and 31 deletions

View File

@ -44,7 +44,7 @@ template <class C_Data, class C_Window, class C_Interface>
class Range_tree_d; class Range_tree_d;
template <class C_Data, class C_Window, class C_Interface> template <class C_Data, class C_Window, class C_Interface>
struct Range_tree_node: public Tree_node_base struct Range_tree_node: public Tree_node_base<Range_tree_node<C_Data, C_Window, C_Interface> >
{ {
private: private:
typedef C_Data Data; typedef C_Data Data;
@ -57,22 +57,23 @@ struct Range_tree_node: public Tree_node_base
public: public:
friend class Range_tree_d< C_Data, C_Window, C_Interface>; friend class Range_tree_d< C_Data, C_Window, C_Interface>;
typedef Tree_node_base<Range_tree_node<C_Data, C_Window, C_Interface> > Base;
Range_tree_node() Range_tree_node()
: sublayer(0) : sublayer(0)
{} {}
Range_tree_node( Range_tree_node * p_left, Range_tree_node( Range_tree_node * p_left,
Range_tree_node * p_right, Range_tree_node * p_right,
const Data & v_obj, const Data & v_obj,
const Key & v_key ) 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( Range_tree_node * p_left,
Range_tree_node * p_right, Range_tree_node * p_right,
const Key & v_key ) 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() virtual ~Range_tree_node()
@ -112,14 +113,14 @@ protected:
typedef Range_tree_node<C_Data,C_Window,C_Interface> *link_type; typedef Range_tree_node<C_Data,C_Window,C_Interface> *link_type;
static link_type& left(link_type x) { 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) { 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) { static link_type& parent(link_type x) {
return CGAL__static_cast(link_type&, (*x).parent_link); return x->parent_link;
} }
link_type header; link_type header;
@ -128,7 +129,7 @@ protected:
link_type leftmost(){return left(header);} link_type leftmost(){return left(header);}
link_type root() const { link_type root() const {
if(header!=0) if(header!=0)
return CGAL__static_cast(link_type&, header->parent_link); return header->parent_link;
// return parent(header); // return parent(header);
else else
return 0; return 0;

View File

@ -41,7 +41,8 @@ template <class C_Data, class C_Window, class C_Interface>
class Segment_tree_d; class Segment_tree_d;
template <class C_Data, class C_Window, class C_Interface> template <class C_Data, class C_Window, class C_Interface>
struct Segment_tree_node: public Tree_node_base struct Segment_tree_node
: public Tree_node_base<Segment_tree_node<C_Data, C_Window, C_Interface> >
{ {
typedef C_Data Data; typedef C_Data Data;
typedef C_Window Window; typedef C_Window Window;
@ -55,20 +56,22 @@ struct Segment_tree_node: public Tree_node_base
public: public:
friend class Segment_tree_d< C_Data, C_Window, C_Interface>; friend class Segment_tree_d< C_Data, C_Window, C_Interface>;
typedef Tree_node_base<Segment_tree_node<C_Data, C_Window, C_Interface> > Base;
Segment_tree_node() Segment_tree_node()
: Tree_node_base(), sublayer(0) : sublayer(0)
{} {}
Segment_tree_node(const Key& p_left_key, Segment_tree_node(const Key& p_left_key,
const Key& p_right_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(Segment_tree_node * p_left,
Segment_tree_node * p_right, Segment_tree_node * p_right,
const Key& p_left_key, const Key& p_left_key,
const Key& p_right_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(){ ~Segment_tree_node(){
@ -111,13 +114,13 @@ protected:
} }
static link_type left(link_type x) { static link_type left(link_type x) {
return static_cast<link_type>(x->left_link); return x->left_link;
} }
static link_type right(link_type x) { static link_type right(link_type x) {
return static_cast<link_type>(x->right_link); return x->right_link;
} }
static link_type parent(link_type x) { static link_type parent(link_type x) {
return static_cast<link_type>( x->parent_link); return x->parent_link;
} }
link_type header; link_type header;
@ -126,7 +129,7 @@ protected:
link_type leftmost(){return left(header);} link_type leftmost(){return left(header);}
link_type root() const{ link_type root() const{
if(header!=0) if(header!=0)
return static_cast<link_type>(header->parent_link); return header->parent_link;
return 0; return 0;
} }

View File

@ -32,25 +32,20 @@
#define TREE_BASE_NULL 0 #define TREE_BASE_NULL 0
#endif #endif
#ifndef CGAL__static_cast
#define CGAL__static_cast(TYPE,EXPR) (TYPE)(EXPR)
#endif
#define stlvector #define stlvector
CGAL_BEGIN_NAMESPACE CGAL_BEGIN_NAMESPACE
//link type definition of an ordinary vertex of the tree //link type definition of an ordinary vertex of the tree
template < typename Node >
struct Tree_node_base { struct Tree_node_base {
void *parent_link; Node *parent_link;
void *left_link; Node *left_link;
void *right_link; Node *right_link;
Tree_node_base() 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) Tree_node_base(Node* ll, Node* rl)
: parent_link(0), left_link(ll), right_link(rl) : parent_link(0), left_link(ll), right_link(rl)
{} {}
}; };