1// -*- C++ -*- 2 3// Copyright (C) 2005 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 7// terms of the GNU General Public License as published by the 8// Free Software Foundation; either version 2, or (at your option) 9// any later version. 10 11// This library is distributed in the hope that it will be useful, 12// but WITHOUT ANY WARRANTY; without even the implied warranty of 13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14// GNU General Public License for more details. 15 16// You should have received a copy of the GNU General Public License along 17// with this library; see the file COPYING. If not, write to the Free 18// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 19// USA. 20 21// As a special exception, you may use this file as part of a free software 22// library without restriction. Specifically, if other files instantiate 23// templates or use macros or inline functions from this file, or you compile 24// this file and link it with other files to produce an executable, this 25// file does not by itself cause the resulting executable to be covered by 26// the GNU General Public License. This exception does not however 27// invalidate any other reasons why the executable file might be covered by 28// the GNU General Public License. 29 30// Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL. 31 32// Permission to use, copy, modify, sell, and distribute this software 33// is hereby granted without fee, provided that the above copyright 34// notice appears in all copies, and that both that copyright notice and 35// this permission notice appear in supporting documentation. None of 36// the above authors, nor IBM Haifa Research Laboratories, make any 37// representation about the suitability of this software for any 38// purpose. It is provided "as is" without express or implied warranty. 39 40/** 41 * @file cond_key_dtor_entry_dealtor.hpp 42 * Contains a conditional key destructor, used for exception handling. 43 */ 44 45namespace pb_assoc 46{ 47 48 namespace detail 49 { 50 51#define PB_ASSOC_CLASS_T_DEC \ 52 template<class HT_Map> 53 54#define PB_ASSOC_CLASS_C_DEC \ 55 PB_ASSOC_CKDED_CLASS_NAME< \ 56 HT_Map> 57 58 /** 59 * A conditional key destructor, used for exception handling. 60 **/ 61 template<class HT_Map> 62 class PB_ASSOC_CKDED_CLASS_NAME 63 { 64 public: 65 typedef typename HT_Map::entry entry; 66 67 typedef typename HT_Map::entry_allocator entry_allocator; 68 69 typedef typename HT_Map::key_type key_type; 70 71 public: 72 inline 73 PB_ASSOC_CKDED_CLASS_NAME(entry_allocator* p_a, entry* p_e); 74 75 inline 76 ~PB_ASSOC_CKDED_CLASS_NAME(); 77 78 inline void 79 set_key_destruct(); 80 81 inline void 82 set_no_action_destructor(); 83 84 protected: 85 entry_allocator* const m_p_a; 86 entry* const m_p_e; 87 88 bool m_key_destruct; 89 bool m_no_action_destructor; 90 }; 91 92 PB_ASSOC_CLASS_T_DEC 93 inline 94 PB_ASSOC_CLASS_C_DEC:: 95 PB_ASSOC_CKDED_CLASS_NAME(entry_allocator* p_a, entry* p_e) : 96 m_p_a(p_a), 97 m_p_e(p_e), 98 m_key_destruct(false), 99 m_no_action_destructor(false) 100 { } 101 102 PB_ASSOC_CLASS_T_DEC 103 inline void 104 PB_ASSOC_CLASS_C_DEC:: 105 set_key_destruct() 106 { 107 m_key_destruct = true; 108 } 109 110 PB_ASSOC_CLASS_T_DEC 111 inline void 112 PB_ASSOC_CLASS_C_DEC:: 113 set_no_action_destructor() 114 { 115 m_no_action_destructor = true; 116 } 117 118 PB_ASSOC_CLASS_T_DEC 119 inline 120 PB_ASSOC_CLASS_C_DEC:: 121 ~PB_ASSOC_CKDED_CLASS_NAME() 122 { 123 if (m_no_action_destructor) 124 return; 125 126 if (m_key_destruct) 127 m_p_e->m_value.first.~key_type(); 128 129 m_p_a->deallocate(m_p_e, 1); 130 } 131 132#undef PB_ASSOC_CLASS_T_DEC 133#undef PB_ASSOC_CLASS_C_DEC 134 135 } // namespace detail 136 137} // namespace pb_assoc 138 139