Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

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