1*e4b17023SJohn Marino // -*- C++ -*-
2*e4b17023SJohn Marino 
3*e4b17023SJohn Marino // Copyright (C) 2005, 2006, 2009, 2011 Free Software Foundation, Inc.
4*e4b17023SJohn Marino //
5*e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library.  This library is free
6*e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the terms
7*e4b17023SJohn Marino // of the GNU General Public License as published by the Free Software
8*e4b17023SJohn Marino // Foundation; either version 3, or (at your option) any later
9*e4b17023SJohn Marino // version.
10*e4b17023SJohn Marino 
11*e4b17023SJohn Marino // This library is distributed in the hope that it will be useful, but
12*e4b17023SJohn Marino // WITHOUT ANY WARRANTY; without even the implied warranty of
13*e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14*e4b17023SJohn Marino // General Public License for more details.
15*e4b17023SJohn Marino 
16*e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional
17*e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version
18*e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation.
19*e4b17023SJohn Marino 
20*e4b17023SJohn Marino // You should have received a copy of the GNU General Public License and
21*e4b17023SJohn Marino // a copy of the GCC Runtime Library Exception along with this program;
22*e4b17023SJohn Marino // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23*e4b17023SJohn Marino // <http://www.gnu.org/licenses/>.
24*e4b17023SJohn Marino 
25*e4b17023SJohn Marino // Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL.
26*e4b17023SJohn Marino 
27*e4b17023SJohn Marino // Permission to use, copy, modify, sell, and distribute this software
28*e4b17023SJohn Marino // is hereby granted without fee, provided that the above copyright
29*e4b17023SJohn Marino // notice appears in all copies, and that both that copyright notice
30*e4b17023SJohn Marino // and this permission notice appear in supporting documentation. None
31*e4b17023SJohn Marino // of the above authors, nor IBM Haifa Research Laboratories, make any
32*e4b17023SJohn Marino // representation about the suitability of this software for any
33*e4b17023SJohn Marino // purpose. It is provided "as is" without express or implied
34*e4b17023SJohn Marino // warranty.
35*e4b17023SJohn Marino 
36*e4b17023SJohn Marino /**
37*e4b17023SJohn Marino  * @file ov_tree_map_/split_join_fn_imps.hpp
38*e4b17023SJohn Marino  * Contains an implementation class for ov_tree_.
39*e4b17023SJohn Marino  */
40*e4b17023SJohn Marino 
41*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
42*e4b17023SJohn Marino void
43*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
split(key_const_reference r_key,PB_DS_CLASS_C_DEC & other)44*e4b17023SJohn Marino split(key_const_reference r_key, PB_DS_CLASS_C_DEC& other)
45*e4b17023SJohn Marino {
46*e4b17023SJohn Marino   PB_DS_ASSERT_VALID((*this))
47*e4b17023SJohn Marino   PB_DS_ASSERT_VALID(other)
48*e4b17023SJohn Marino 
49*e4b17023SJohn Marino   if (m_size == 0)
50*e4b17023SJohn Marino     {
51*e4b17023SJohn Marino       other.clear();
52*e4b17023SJohn Marino       return;
53*e4b17023SJohn Marino     }
54*e4b17023SJohn Marino 
55*e4b17023SJohn Marino   if (Cmp_Fn::operator()(r_key, PB_DS_V2F(*begin())))
56*e4b17023SJohn Marino     {
57*e4b17023SJohn Marino       value_swap(other);
58*e4b17023SJohn Marino       PB_DS_ASSERT_VALID((*this))
59*e4b17023SJohn Marino       PB_DS_ASSERT_VALID(other)
60*e4b17023SJohn Marino       return;
61*e4b17023SJohn Marino     }
62*e4b17023SJohn Marino 
63*e4b17023SJohn Marino   if (!Cmp_Fn::operator()(r_key, PB_DS_V2F(*(end() - 1))))
64*e4b17023SJohn Marino     {
65*e4b17023SJohn Marino       return;
66*e4b17023SJohn Marino     }
67*e4b17023SJohn Marino 
68*e4b17023SJohn Marino   if (m_size == 1)
69*e4b17023SJohn Marino     {
70*e4b17023SJohn Marino       value_swap(other);
71*e4b17023SJohn Marino       PB_DS_ASSERT_VALID((*this))
72*e4b17023SJohn Marino       PB_DS_ASSERT_VALID(other)
73*e4b17023SJohn Marino       return;
74*e4b17023SJohn Marino     }
75*e4b17023SJohn Marino 
76*e4b17023SJohn Marino   iterator it = upper_bound(r_key);
77*e4b17023SJohn Marino   PB_DS_CLASS_C_DEC new_other(other, other);
78*e4b17023SJohn Marino   new_other.copy_from_ordered_range(it, end());
79*e4b17023SJohn Marino   PB_DS_CLASS_C_DEC new_this(*this, *this);
80*e4b17023SJohn Marino   new_this.copy_from_ordered_range(begin(), it);
81*e4b17023SJohn Marino 
82*e4b17023SJohn Marino   // No exceptions from this point.
83*e4b17023SJohn Marino   other.update(other.node_begin(), (node_update*)(&other));
84*e4b17023SJohn Marino   update(node_begin(), (node_update*)this);
85*e4b17023SJohn Marino   other.value_swap(new_other);
86*e4b17023SJohn Marino   value_swap(new_this);
87*e4b17023SJohn Marino   PB_DS_ASSERT_VALID((*this))
88*e4b17023SJohn Marino   PB_DS_ASSERT_VALID(other)
89*e4b17023SJohn Marino }
90*e4b17023SJohn Marino 
91*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
92*e4b17023SJohn Marino void
93*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
join(PB_DS_CLASS_C_DEC & other)94*e4b17023SJohn Marino join(PB_DS_CLASS_C_DEC& other)
95*e4b17023SJohn Marino {
96*e4b17023SJohn Marino   PB_DS_ASSERT_VALID((*this))
97*e4b17023SJohn Marino   PB_DS_ASSERT_VALID(other)
98*e4b17023SJohn Marino   if (other.m_size == 0)
99*e4b17023SJohn Marino     return;
100*e4b17023SJohn Marino 
101*e4b17023SJohn Marino   if (m_size == 0)
102*e4b17023SJohn Marino     {
103*e4b17023SJohn Marino       value_swap(other);
104*e4b17023SJohn Marino       PB_DS_ASSERT_VALID((*this))
105*e4b17023SJohn Marino       PB_DS_ASSERT_VALID(other)
106*e4b17023SJohn Marino       return;
107*e4b17023SJohn Marino     }
108*e4b17023SJohn Marino 
109*e4b17023SJohn Marino   const bool greater = Cmp_Fn::operator()(PB_DS_V2F(*(end() - 1)),
110*e4b17023SJohn Marino 					  PB_DS_V2F(*other.begin()));
111*e4b17023SJohn Marino 
112*e4b17023SJohn Marino   const bool lesser = Cmp_Fn::operator()(PB_DS_V2F(*(other.end() - 1)),
113*e4b17023SJohn Marino 					 PB_DS_V2F(*begin()));
114*e4b17023SJohn Marino 
115*e4b17023SJohn Marino   if (!greater && !lesser)
116*e4b17023SJohn Marino     __throw_join_error();
117*e4b17023SJohn Marino 
118*e4b17023SJohn Marino   PB_DS_CLASS_C_DEC new_this(*this, *this);
119*e4b17023SJohn Marino 
120*e4b17023SJohn Marino   if (greater)
121*e4b17023SJohn Marino     new_this.copy_from_ordered_range(begin(), end(),
122*e4b17023SJohn Marino 				     other.begin(), other.end());
123*e4b17023SJohn Marino   else
124*e4b17023SJohn Marino     new_this.copy_from_ordered_range(other.begin(), other.end(),
125*e4b17023SJohn Marino 				     begin(), end());
126*e4b17023SJohn Marino 
127*e4b17023SJohn Marino   // No exceptions from this point.
128*e4b17023SJohn Marino   value_swap(new_this);
129*e4b17023SJohn Marino   other.clear();
130*e4b17023SJohn Marino   PB_DS_ASSERT_VALID((*this))
131*e4b17023SJohn Marino   PB_DS_ASSERT_VALID(other)
132*e4b17023SJohn Marino }
133