mirror of https://github.com/CGAL/cgal
Make Tree_base_node type safe using CRTP.
(removes frightening aliasing breakage warnings)
This commit is contained in:
parent
a3b0c313a9
commit
b23f61eefd
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue