OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [gcc-4.5.1/] [gcc-4.5.1-or32-1.0rc4/] [libstdc++-v3/] [include/] [ext/] [pb_ds/] [detail/] [binomial_heap_base_/] [erase_fn_imps.hpp] - Blame information for rev 519

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 424 jeremybenn
// -*- C++ -*-
2
 
3
// Copyright (C) 2005, 2006, 2009 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 erase_fn_imps.hpp
38
 * Contains an implementation class for a base of binomial heaps.
39
 */
40
 
41
PB_DS_CLASS_T_DEC
42
void
43
PB_DS_CLASS_C_DEC::
44
pop()
45
{
46
  _GLIBCXX_DEBUG_ONLY(assert_valid(true);)
47
    _GLIBCXX_DEBUG_ASSERT(!base_type::empty());
48
 
49
  if (m_p_max == NULL)
50
    find_max();
51
 
52
  _GLIBCXX_DEBUG_ASSERT(m_p_max != NULL);
53
 
54
  node_pointer p_nd = m_p_max;
55
 
56
  remove_parentless_node(m_p_max);
57
 
58
  base_type::actual_erase_node(p_nd);
59
 
60
  m_p_max = NULL;
61
 
62
  _GLIBCXX_DEBUG_ONLY(assert_valid(true);)
63
    }
64
 
65
PB_DS_CLASS_T_DEC
66
void
67
PB_DS_CLASS_C_DEC::
68
remove_parentless_node(node_pointer p_nd)
69
{
70
  _GLIBCXX_DEBUG_ASSERT(p_nd != NULL);
71
  _GLIBCXX_DEBUG_ASSERT(base_type::parent(p_nd) == NULL);
72
 
73
  node_pointer p_cur_root = p_nd == base_type::m_p_root?
74
    p_nd->m_p_next_sibling :
75
    base_type::m_p_root;
76
 
77
  if (p_cur_root != NULL)
78
    p_cur_root->m_p_prev_or_parent = NULL;
79
 
80
  if (p_nd->m_p_prev_or_parent != NULL)
81
    p_nd->m_p_prev_or_parent->m_p_next_sibling = p_nd->m_p_next_sibling;
82
 
83
  if (p_nd->m_p_next_sibling != NULL)
84
    p_nd->m_p_next_sibling->m_p_prev_or_parent = p_nd->m_p_prev_or_parent;
85
 
86
  node_pointer p_child = p_nd->m_p_l_child;
87
 
88
  if (p_child != NULL)
89
    {
90
      p_child->m_p_prev_or_parent = NULL;
91
 
92
      while (p_child->m_p_next_sibling != NULL)
93
        p_child = p_child->m_p_next_sibling;
94
    }
95
 
96
  m_p_max = NULL;
97
 
98
  base_type::m_p_root = join(p_cur_root, p_child);
99
}
100
 
101
PB_DS_CLASS_T_DEC
102
inline void
103
PB_DS_CLASS_C_DEC::
104
clear()
105
{
106
  base_type::clear();
107
 
108
  m_p_max = NULL;
109
}
110
 
111
PB_DS_CLASS_T_DEC
112
void
113
PB_DS_CLASS_C_DEC::
114
erase(point_iterator it)
115
{
116
  _GLIBCXX_DEBUG_ONLY(assert_valid(true);)
117
    _GLIBCXX_DEBUG_ASSERT(!base_type::empty());
118
 
119
  base_type::bubble_to_top(it.m_p_nd);
120
 
121
  remove_parentless_node(it.m_p_nd);
122
 
123
  base_type::actual_erase_node(it.m_p_nd);
124
 
125
  m_p_max = NULL;
126
 
127
  _GLIBCXX_DEBUG_ONLY(assert_valid(true);)
128
    }
129
 
130
PB_DS_CLASS_T_DEC
131
template<typename Pred>
132
typename PB_DS_CLASS_C_DEC::size_type
133
PB_DS_CLASS_C_DEC::
134
erase_if(Pred pred)
135
{
136
  _GLIBCXX_DEBUG_ONLY(assert_valid(true);)
137
 
138
    if (base_type::empty())
139
      {
140
        _GLIBCXX_DEBUG_ONLY(assert_valid(true);)
141
 
142
          return 0;
143
      }
144
 
145
  base_type::to_linked_list();
146
 
147
  node_pointer p_out = base_type::prune(pred);
148
 
149
  size_type ersd = 0;
150
 
151
  while (p_out != NULL)
152
    {
153
      ++ersd;
154
 
155
      node_pointer p_next = p_out->m_p_next_sibling;
156
 
157
      base_type::actual_erase_node(p_out);
158
 
159
      p_out = p_next;
160
    }
161
 
162
  node_pointer p_cur = base_type::m_p_root;
163
 
164
  base_type::m_p_root = NULL;
165
 
166
  while (p_cur != NULL)
167
    {
168
      node_pointer p_next = p_cur->m_p_next_sibling;
169
 
170
      p_cur->m_p_l_child = p_cur->m_p_prev_or_parent = NULL;
171
 
172
      p_cur->m_metadata = 0;
173
 
174
      p_cur->m_p_next_sibling = base_type::m_p_root;
175
 
176
      if (base_type::m_p_root != NULL)
177
        base_type::m_p_root->m_p_prev_or_parent = p_cur;
178
 
179
      base_type::m_p_root = p_cur;
180
 
181
      base_type::m_p_root = fix(base_type::m_p_root);
182
 
183
      p_cur = p_next;
184
    }
185
 
186
  m_p_max = NULL;
187
 
188
  _GLIBCXX_DEBUG_ONLY(assert_valid(true);)
189
 
190
    return ersd;
191
}
192
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.