1// -*- C++ -*-
2
3// Copyright (C) 2005, 2006, 2007, 2008, 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 constructor_destructor_fn_imps.hpp
38 * Contains implementations of PB_DS_CLASS_NAME.
39 */
40
41PB_DS_CLASS_T_DEC
42typename PB_DS_CLASS_C_DEC::entry_allocator
43PB_DS_CLASS_C_DEC::s_entry_allocator;
44
45PB_DS_CLASS_T_DEC
46Eq_Fn PB_DS_CLASS_C_DEC::s_eq_fn;
47
48PB_DS_CLASS_T_DEC
49null_lu_metadata PB_DS_CLASS_C_DEC::s_null_lu_metadata;
50
51PB_DS_CLASS_T_DEC
52Update_Policy PB_DS_CLASS_C_DEC::s_update_policy;
53
54PB_DS_CLASS_T_DEC
55type_to_type<
56  typename PB_DS_CLASS_C_DEC::update_metadata> PB_DS_CLASS_C_DEC::s_metadata_type_indicator;
57
58PB_DS_CLASS_T_DEC
59template<typename It>
60void
61PB_DS_CLASS_C_DEC::
62copy_from_range(It first_it, It last_it)
63{
64  while (first_it != last_it)
65    insert(*(first_it++));
66}
67
68PB_DS_CLASS_T_DEC
69PB_DS_CLASS_C_DEC::
70PB_DS_CLASS_NAME() : m_p_l(NULL)
71{ _GLIBCXX_DEBUG_ONLY(assert_valid();) }
72
73PB_DS_CLASS_T_DEC
74template<typename It>
75PB_DS_CLASS_C_DEC::
76PB_DS_CLASS_NAME(It first_it, It last_it) : m_p_l(NULL)
77{
78  copy_from_range(first_it, last_it);
79  _GLIBCXX_DEBUG_ONLY(assert_valid(););
80}
81
82PB_DS_CLASS_T_DEC
83PB_DS_CLASS_C_DEC::
84PB_DS_CLASS_NAME(const PB_DS_CLASS_C_DEC& other) :
85#ifdef _GLIBCXX_DEBUG
86  debug_base(),
87#endif
88m_p_l(NULL)
89{
90  __try
91    {
92      for (const_iterator it = other.begin(); it != other.end(); ++it)
93        {
94	  entry_pointer p_l = allocate_new_entry(*it,
95			PB_DS_TYPES_TRAITS_C_DEC::m_no_throw_copies_indicator);
96
97	  p_l->m_p_next = m_p_l;
98	  m_p_l = p_l;
99        }
100    }
101  __catch(...)
102    {
103      deallocate_all();
104      __throw_exception_again;
105    }
106  _GLIBCXX_DEBUG_ONLY(assert_valid();)
107}
108
109PB_DS_CLASS_T_DEC
110void
111PB_DS_CLASS_C_DEC::
112swap(PB_DS_CLASS_C_DEC& other)
113{
114  _GLIBCXX_DEBUG_ONLY(assert_valid();)
115  _GLIBCXX_DEBUG_ONLY(other.assert_valid();)
116  _GLIBCXX_DEBUG_ONLY(debug_base::swap(other);)
117  std::swap(m_p_l, other.m_p_l);
118  _GLIBCXX_DEBUG_ONLY(assert_valid();)
119  _GLIBCXX_DEBUG_ONLY(other.assert_valid();)
120}
121
122PB_DS_CLASS_T_DEC
123void
124PB_DS_CLASS_C_DEC::
125deallocate_all()
126{
127  entry_pointer p_l = m_p_l;
128  while (p_l != NULL)
129    {
130      entry_pointer p_next_l = p_l->m_p_next;
131      actual_erase_entry(p_l);
132      p_l = p_next_l;
133    }
134  m_p_l = NULL;
135}
136
137PB_DS_CLASS_T_DEC
138PB_DS_CLASS_C_DEC::
139~PB_DS_CLASS_NAME()
140{ deallocate_all(); }
141
142