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 cc_hash_table_map_/cond_key_dtor_entry_dealtor.hpp
  38.  * Contains a conditional key destructor, used for exception handling.
  39.  */
  40.  
  41. namespace __gnu_pbds
  42. {
  43.   namespace detail
  44.   {
  45.     /// Conditional dey destructor, cc_hash.
  46.     template<typename HT_Map>
  47.     class cond_dealtor
  48.     {
  49.     public:
  50.       typedef typename HT_Map::entry            entry;
  51.       typedef typename HT_Map::entry_allocator  entry_allocator;
  52.       typedef typename HT_Map::key_type         key_type;
  53.  
  54.       cond_dealtor(entry_allocator* p_a, entry* p_e)
  55.       : m_p_a(p_a), m_p_e(p_e), m_key_destruct(false),
  56.         m_no_action_destructor(false)
  57.       { }
  58.  
  59.       inline
  60.       ~cond_dealtor();
  61.  
  62.       void
  63.       set_key_destruct()
  64.       { m_key_destruct = true; }
  65.  
  66.       void
  67.       set_no_action_destructor()
  68.       { m_no_action_destructor = true; }
  69.  
  70.     protected:
  71.       entry_allocator* const                    m_p_a;
  72.       entry* const                              m_p_e;
  73.  
  74.       bool                                      m_key_destruct;
  75.       bool                                      m_no_action_destructor;
  76.     };
  77.  
  78.     template<typename HT_Map>
  79.     inline
  80.     cond_dealtor<HT_Map>::
  81.     ~cond_dealtor()
  82.     {
  83.       if (m_no_action_destructor)
  84.         return;
  85.       if (m_key_destruct)
  86.         m_p_e->m_value.first.~key_type();
  87.       m_p_a->deallocate(m_p_e, 1);
  88.     }
  89.   } // namespace detail
  90. } // namespace __gnu_pbds
  91.