blob: f502e397fe4752246e39b8925186e275c4b23cbe [file] [log] [blame]
// { dg-do compile }
// { dg-options "-O -fstrict-aliasing -ftree-pre -fno-tree-fre -fno-tree-sra -Wno-return-type" }
typedef __SIZE_TYPE__ size_t;
namespace std
{
template < class _T1, class > struct pair
{
_T1 first;
};
}
namespace __gnu_cxx
{
template < typename _Tp > class new_allocator
{
public:
typedef size_t size_type;
typedef _Tp * pointer;
typedef _Tp const_pointer;
typedef _Tp & reference;
typedef const _Tp & const_reference;
template < typename _Tp1 > struct rebind
{
typedef new_allocator < _Tp1 > other;
};
};
}
namespace std
{
template < typename _Tp > class allocator:
public __gnu_cxx::new_allocator < _Tp >
{};
template < typename, typename, typename > struct binary_function;
template < typename _Tp > struct less:binary_function < _Tp, _Tp, bool >
{};
}
namespace __gnu_cxx
{
namespace typelist
{
struct null_type;
template < typename Root > struct node
{
typedef Root root;
};
template < typename, typename > struct chain;
namespace detail
{
template < typename, int >struct chain_at_index_;
template
<
typename
Hd, typename Tl > struct chain_at_index_ <chain < Hd, Tl >, 0 >
{
typedef Hd type;
};
template
<
typename
Hd, typename Tl, int i > struct chain_at_index_ <chain < Hd, Tl >, i >
{
typedef typename chain_at_index_ < Tl, i - 1 >::type type;
};
}
template < typename Typelist, int i > struct at_index
{
typedef typename Typelist::root root_type;
typedef detail::chain_at_index_ < root_type, i > index_type;
typedef typename index_type::type type;
};
template < typename T1, typename T2 > struct create2
{
typedef node < chain < T1, chain < T2, null_type > > >type;
};
}
}
namespace std
{
namespace tr1
{
template < typename _Tp, _Tp __v > struct integral_constant
{
static const _Tp value = __v;
};
typedef integral_constant < bool, false > false_type;
template < typename, typename > struct is_same:false_type
{};
}
}
using std::tr1::is_same;
namespace __gnu_pbds
{
struct null_mapped_type;
struct rb_tree_tag;
namespace detail
{
template < typename, typename, typename > struct basic_tree_policy_base;
template
<
typename
Const_Node_Iterator,
typename
Allocator
>
struct
basic_tree_policy_base
<Const_Node_Iterator, Const_Node_Iterator, Allocator >
{};
}
template
< typename, typename, typename, typename > struct null_tree_node_update;
template < typename Const_Node_Iterator, typename Node_Iterator, typename, typename Allocator > class tree_order_statistics_node_update:
detail::basic_tree_policy_base
< Const_Node_Iterator, Node_Iterator, Allocator >
{
public:
typedef Allocator allocator_type;
typedef typename allocator_type::size_type size_type;
typedef size_type metadata_type;
typedef Const_Node_Iterator const_node_iterator;
typedef Node_Iterator node_iterator;
typedef
typename
allocator_type::template
rebind < metadata_type >::other::reference metadata_reference;
void operator () (node_iterator, const_node_iterator) const;
};
template
<
typename
Const_Node_Iterator,
class
Node_Iterator,
class
Cmp_Fn,
class
Allocator
>
inline
void
tree_order_statistics_node_update
<
Const_Node_Iterator,
Node_Iterator,
Cmp_Fn,
Allocator
>::operator
() (node_iterator node_it, const_node_iterator end_nd_it) const
{
node_iterator l_child_it;
size_type
l_rank = (l_child_it == end_nd_it) ? : l_child_it.get_metadata ();
node_iterator r_child_it = node_it.get_r_child ();
size_type
r_rank = (r_child_it == end_nd_it) ? : r_child_it.get_metadata ();
const_cast
< metadata_reference > (node_it.get_metadata ()) = l_rank + r_rank;
}
namespace
{
template < typename, typename, typename, bool > struct value_type_base;
template
<
typename
Key,
typename
Allocator
> struct value_type_base <Key, null_mapped_type, Allocator, false >
{
typedef Key value_type;
typedef
typename
Allocator::template rebind < value_type >::other value_type_allocator;
typedef typename value_type_allocator::pointer pointer;
typedef typename value_type_allocator::const_pointer const_pointer;
typedef typename value_type_allocator::reference reference;
typedef typename value_type_allocator::const_reference const_reference;
};
template
<
typename
Key,
typename
Mapped, typename Alloc, bool Store_Extra > struct vt_base_selector
{
typedef value_type_base < Key, Mapped, Alloc, Store_Extra > type;
};
template
<
typename
Key,
typename
Mapped,
typename
Alloc,
bool
Store_Extra
>
struct
types_traits:vt_base_selector < Key, Mapped, Alloc, Store_Extra >::type
{};
template < typename, class, class > struct dumconst_node_iterator;
template
<
typename
Key,
typename
Mapped,
class,
class
Node_And_It_Traits, class Allocator > class bin_search_tree_no_data_
{
protected:
typedef
typename
Allocator::template
rebind
< typename Node_And_It_Traits::node >::other::pointer node_pointer;
typedef
typename
types_traits
< Key, Mapped, Allocator, false >::const_reference const_reference;
typedef typename Node_And_It_Traits::point_iterator point_iterator;
typedef typename Node_And_It_Traits::node_update node_update;
void rotate_right (node_pointer);
template
<
typename
Node_Update_ > void apply_update (node_pointer, Node_Update_ *);
};
template
<
typename
Key,
typename
Mapped,
class
Cmp_Fn,
class
Node_And_It_Traits,
class
Allocator
>
void
bin_search_tree_no_data_
<
Key,
Mapped,
Cmp_Fn, Node_And_It_Traits, Allocator >::rotate_right (node_pointer p_x)
{
node_pointer p_y = p_x->m_p_parent;
p_y->m_p_right = p_x;
apply_update (p_x, this);
apply_update (p_x->m_p_parent, (node_update *) this);
}
template
<
typename
Key,
typename
Mapped,
class
Cmp_Fn,
class
Node_And_It_Traits,
class
Allocator
>
template
<
typename
Node_Update_
>
void
bin_search_tree_no_data_
<
Key,
Mapped,
Cmp_Fn,
Node_And_It_Traits,
Allocator >::apply_update (node_pointer p_nd, Node_Update_ *)
{
node_update ()((p_nd), ((0)));
}
}
namespace detail
{
template < typename Key, typename Mapped, typename Cmp_Fn, typename Node_And_It_Traits, typename Allocator > class rb_tree_no_data_:
bin_search_tree_no_data_
< Key, Mapped, Cmp_Fn, Node_And_It_Traits, Allocator >
{
typedef
bin_search_tree_no_data_
< Key, Mapped, Cmp_Fn, Node_And_It_Traits, Allocator > base_type;
typedef typename base_type::node_pointer node_pointer;
public:
typedef typename base_type::const_reference const_reference;
typedef typename base_type::point_iterator point_iterator;
std::pair < point_iterator, bool > insert (const_reference);
void insert_fixup (node_pointer);
};
template
<
typename
Key,
typename
Mapped,
typename
Cmp_Fn,
typename
Node_And_It_Traits,
typename
Allocator
>
std::pair
<
typename
rb_tree_no_data_
<
Key,
Mapped,
Cmp_Fn,
Node_And_It_Traits,
Allocator
>::point_iterator,
bool
>
rb_tree_no_data_
<
Key,
Mapped,
Cmp_Fn, Node_And_It_Traits, Allocator >::insert (const_reference)
{
std::pair < point_iterator, bool > ins_pair;
{
insert_fixup (ins_pair.first.m_p_nd);
}
}
template
<
typename
Key,
typename
Mapped,
typename
Cmp_Fn,
typename
Node_And_It_Traits,
typename
Allocator
>
void
rb_tree_no_data_
<
Key,
Mapped,
Cmp_Fn,
Node_And_It_Traits, Allocator >::insert_fixup (node_pointer p_nd)
{
{
{
{
this->rotate_right (p_nd);
}
}
}
}
template
<
typename,
typename, typename, typename, typename > struct container_base_dispatch;
template
<
typename
Key,
typename
Policy_Tl,
typename
Alloc
>
struct
container_base_dispatch
<Key, null_mapped_type, rb_tree_tag, Policy_Tl, Alloc >
{
typedef __gnu_cxx::typelist::at_index < Policy_Tl, 0 > at0;
typedef typename at0::type at0t;
typedef __gnu_cxx::typelist::at_index < Policy_Tl, 1 > at1;
typedef typename at1::type at1t;
typedef
rb_tree_no_data_ < Key, null_mapped_type, at0t, at1t, Alloc > type;
};
template
<
typename
Node_Pointer,
typename,
typename,
typename,
typename, typename, bool, class > class bin_search_tree_const_it_
{
public:
Node_Pointer m_p_nd;
};
template
<
typename
Node,
class
Const_Iterator,
class Iterator, class Allocator > class bin_search_tree_const_node_it_
{
typedef
typename
Allocator::template rebind < Node >::other::pointer node_pointer;
public:
typedef typename Node::metadata_type metadata_type;
typedef
typename
Allocator::template
rebind
< metadata_type >::other::const_reference const_metadata_reference;
bin_search_tree_const_node_it_ (node_pointer p_nd):
m_p_nd ((p_nd))
{}
const_metadata_reference get_metadata ()
{
return (m_p_nd->get_metadata ());
}
bin_search_tree_const_node_it_ ()
{}
bin_search_tree_const_node_it_
< Node, Const_Iterator, Iterator, Allocator > get_r_child ()
{
return ((m_p_nd->m_p_right));
}
bool operator == (bin_search_tree_const_node_it_)
{ return true; }
node_pointer m_p_nd;
};
template
<
typename,
typename,
class,
template
<
typename,
class,
class, class > class, class, class > struct bin_search_tree_traits;
template
<
typename
Key,
class
Cmp_Fn,
template
<
typename,
class,
class,
class
>
class
Node_Update,
class
Node,
class
Allocator
>
struct
bin_search_tree_traits
<Key, null_mapped_type, Cmp_Fn, Node_Update, Node, Allocator >
{
typedef
types_traits < Key, null_mapped_type, Allocator, false > type_traits;
typedef Node node;
typedef
bin_search_tree_const_it_
<
typename
Allocator::template
rebind
<
node
>::other::pointer,
typename
type_traits::value_type,
typename
type_traits::pointer,
typename
type_traits::const_pointer,
typename
type_traits::reference,
typename
type_traits::const_reference, true, Allocator > const_point_iterator;
typedef const_point_iterator point_iterator;
typedef
bin_search_tree_const_node_it_
<
Node,
const_point_iterator, point_iterator, Allocator > const_node_iterator;
typedef const_node_iterator node_iterator;
typedef
Node_Update
< const_node_iterator, node_iterator, Cmp_Fn, Allocator > node_update;
};
template < typename Node_Update, bool > struct tree_metadata_helper
{
typedef typename Node_Update::metadata_type type;
};
template
<
typename
Key,
typename
Data,
class
Cmp_Fn,
template
<
typename,
class,
class,
class
>
class Node_Update, class Allocator > struct tree_node_metadata_selector
{
typedef
dumconst_node_iterator < Key, Data, Allocator > dumconst_node_it;
enum
{
null_update = is_same < Node_Update < dumconst_node_it,
dumconst_node_it,
Cmp_Fn,
Allocator >,
null_tree_node_update < dumconst_node_it,
dumconst_node_it,
Cmp_Fn,
Allocator > >::value
};
typedef
typename
tree_metadata_helper
<
Node_Update
<
dumconst_node_it,
dumconst_node_it, Cmp_Fn, Allocator >, null_update >::type type;
};
template
<
typename,
typename,
class,
template
<
typename,
class, class, class > class, class, class > struct tree_traits;
template < typename Value_Type, class Metadata, class Allocator > struct rb_tree_node_
{
typedef Metadata metadata_type;
typedef
typename
Allocator::template
rebind
<
rb_tree_node_
< Value_Type, Metadata, Allocator > >::other::pointer node_pointer;
typedef
typename
Allocator::template
rebind < metadata_type >::other::reference metadata_reference;
metadata_reference get_metadata ()
{
return m_metadata;
}
node_pointer m_p_right;
node_pointer m_p_parent;
metadata_type m_metadata;
};
template
<
typename
Key,
typename
Mapped,
typename
Cmp_Fn,
template
<
typename,
class,
class,
class
>
class
Node_Update,
typename
Allocator
>
struct
tree_traits
<Key,
Mapped,
Cmp_Fn,
Node_Update,
rb_tree_tag,
Allocator
>:bin_search_tree_traits
<
Key,
Mapped,
Cmp_Fn,
Node_Update,
rb_tree_node_
<
typename
types_traits
<
Key,
Mapped,
Allocator,
false
>::value_type,
typename
tree_node_metadata_selector
<
Key,
Mapped, Cmp_Fn, Node_Update, Allocator >::type, Allocator >, Allocator >
{};
}
template < typename Key, typename Mapped, typename Tag, typename Policy_Tl, typename Allocator > class container_base:
public
detail::container_base_dispatch
< Key, Mapped, Tag, Policy_Tl, Allocator >::type
{};
template < typename Key, typename Mapped, typename Tag, typename, typename Policy_Tl, typename Allocator > class basic_tree:
public
container_base < Key, Mapped, Tag, Policy_Tl, Allocator >
{};
template
<
typename
Key,
typename
Mapped,
typename
Cmp_Fn
=
std::less
<
Key
>,
typename
Tag
=
rb_tree_tag,
template
<
typename,
typename,
typename,
typename
>
class
Node_Update
=
null_tree_node_update,
typename
Allocator
=
std::allocator
<
char
> >class
tree:public
basic_tree
<
Key,
Mapped,
Tag,
detail::tree_traits
<
Key,
Mapped,
Cmp_Fn,
Node_Update,
Tag,
Allocator
>,
typename
__gnu_cxx::typelist::create2
<
Cmp_Fn,
detail::tree_traits
< Key, Mapped, Cmp_Fn, Node_Update, Tag, Allocator > >::type, Allocator >
{};
}
using namespace std;
using namespace __gnu_pbds;
typedef
tree
<
int,
null_mapped_type,
less < int >, rb_tree_tag, tree_order_statistics_node_update > set_t;
int main ()
{
set_t s;
s.insert (12);
}