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;
|
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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue