MADNESS  version 0.9
deferred_deleter.h
Go to the documentation of this file.
1 /*
2  This file is part of MADNESS.
3 
4  Copyright (C) 2007,2010 Oak Ridge National Laboratory
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10 
11  This program 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
17  along with this program; if not, write to the Free Software
18  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 
20  For more information please contact:
21 
22  Robert J. Harrison
23  Oak Ridge National Laboratory
24  One Bethel Valley Road
25  P.O. Box 2008, MS-6367
26 
27  email: harrisonrj@ornl.gov
28  tel: 865-241-3937
29  fax: 865-572-0680
30 
31 
32  $Id$
33 */
34 
35 #ifndef MADNESS_WORLD_DEFERRED_DELETER_H__INCLUDED
36 #define MADNESS_WORLD_DEFERRED_DELETER_H__INCLUDED
37 
41 
42 namespace madness {
43 
45 
60  template <typename ptrT, typename deleterT = void(*)(ptrT*)>
61  class DeferredDeleter {
62  private:
63  // Hold a shared pointer to the deferred deleter object to make sure it
64  // is available for all deleter objects, even if the gop object is gone.
66  deleterT deleter_;
67 
69  public:
71  template <typename D>
72  static typename enable_if<std::is_same<D, void(*)(ptrT*)>, D>::type
73  default_deleter() { return & madness::detail::checked_delete<ptrT>; }
74 
76  template <typename D>
77  static typename disable_if<std::is_same<D, void(*)(ptrT*)>, D>::type
78  default_deleter() { return D(); }
79 
81 
89  DeferredDeleter(World& w, deleterT d = default_deleter<deleterT>()) :
90  deferred_(detail::DeferredCleanup::get_deferred_cleanup(w)), deleter_(d)
91  { }
92 
94 
97  deferred_(other.deferred_), deleter_(other.deleter_)
98  { }
99 
101 
105  deferred_ = other.deferred_;
106  deleter_ = other.deleter_;
107  return *this;
108  }
109 
111 
115  void operator()(ptrT* p) const {
116  std::shared_ptr<ptrT> temp(p, deleter_); // do not store this pointer
117  // that is the job of deferred_
118  deferred_->add(std::static_pointer_cast<void>(temp));
119  }
120  }; // class DeferredDeleter
121 
123 
136  template <typename ptrT, typename deleterT>
138  return DeferredDeleter<ptrT, deleterT>(w, d);
139  }
140 
142 
149  template <typename ptrT>
151  return DeferredDeleter<ptrT>(w);
152  }
153 
154 } // namespace madness
155 
156 #endif // MADNESS_WORLD_DEFERRED_DELETER_H__INCLUDED
Deferred deleter for smart pointers.
Definition: deferred_cleanup.h:46
DeferredDeleter(World &w, deleterT d=default_deleter< deleterT >())
Constructs a deferred deleter object.
Definition: deferred_deleter.h:89
Grossly simplified Boost-like type traits and templates.
static enable_if< std::is_same< D, void(*)(ptrT *)>, D >::type default_deleter()
Construct a default deleter for a function pointer.
Definition: deferred_deleter.h:73
disable_if from Boost for conditionally instantiating templates based on type
Definition: enable_if.h:78
DeferredDeleter< ptrT, deleterT > make_deferred_deleter(World &w, deleterT d)
Make a defered deleter object for use with std::shared_ptr.
Definition: deferred_deleter.h:137
A parallel world with full functionality wrapping an MPI communicator.
Definition: worldfwd.h:416
void add(const void_ptr &obj)
Adds item to cleanup list.
Definition: deferred_cleanup.cc:54
DeferredDeleter(const DeferredDeleter< ptrT, deleterT > &other)
Copy constructor.
Definition: deferred_deleter.h:96
void operator()(ptrT *p) const
The deferred deletion function.
Definition: deferred_deleter.h:115
static disable_if< std::is_same< D, void(*)(ptrT *)>, D >::type default_deleter()
Construct a default deleter for a functor.
Definition: deferred_deleter.h:78
DeferredDeleter< ptrT, deleterT > & operator=(const DeferredDeleter< ptrT, deleterT > &other)
Copy assignment operator.
Definition: deferred_deleter.h:104
Holds machinery to set up Functions/FuncImpls using various Factories and Interfaces.
Definition: chem/atomutil.cc:45