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;
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:
typedef C_Data Data;
@ -57,22 +57,23 @@ struct Range_tree_node: public Tree_node_base
public:
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()
: 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<C_Data,C_Window,C_Interface> *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;

View File

@ -41,7 +41,8 @@ template <class C_Data, class C_Window, class C_Interface>
class Segment_tree_d;
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_Window Window;
@ -55,20 +56,22 @@ struct Segment_tree_node: public Tree_node_base
public:
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()
: 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<link_type>(x->left_link);
return x->left_link;
}
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) {
return static_cast<link_type>( 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<link_type>(header->parent_link);
return header->parent_link;
return 0;
}

View File

@ -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)
{}
};