blob: 0980511a9eabee2bb6cff3f373898fc72f77deeb [file] [log] [blame]
Jeff Thompson3d613fd2013-10-15 15:39:04 -07001#ifndef NDNBOOST_CHECKED_DELETE_HPP_INCLUDED
2#define NDNBOOST_CHECKED_DELETE_HPP_INCLUDED
Jeff Thompsonf7d49942013-08-01 16:47:40 -07003
4// MS compatible compilers support #pragma once
5
6#if defined(_MSC_VER) && (_MSC_VER >= 1020)
7# pragma once
8#endif
9
10//
Jeff Thompson9939dcd2013-10-15 15:12:24 -070011// ndnboost/checked_delete.hpp
Jeff Thompsonf7d49942013-08-01 16:47:40 -070012//
13// Copyright (c) 2002, 2003 Peter Dimov
14// Copyright (c) 2003 Daniel Frey
15// Copyright (c) 2003 Howard Hinnant
16//
17// Distributed under the Boost Software License, Version 1.0. (See
18// accompanying file LICENSE_1_0.txt or copy at
19// http://www.boost.org/LICENSE_1_0.txt)
20//
21// See http://www.boost.org/libs/utility/checked_delete.html for documentation.
22//
23
24namespace ndnboost
25{
26
27// verify that types are complete for increased safety
28
29template<class T> inline void checked_delete(T * x)
30{
31 // intentionally complex - simplification causes regressions
32 typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
33 (void) sizeof(type_must_be_complete);
34 delete x;
35}
36
37template<class T> inline void checked_array_delete(T * x)
38{
39 typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
40 (void) sizeof(type_must_be_complete);
41 delete [] x;
42}
43
44template<class T> struct checked_deleter
45{
46 typedef void result_type;
47 typedef T * argument_type;
48
49 void operator()(T * x) const
50 {
51 // ndnboost:: disables ADL
52 ndnboost::checked_delete(x);
53 }
54};
55
56template<class T> struct checked_array_deleter
57{
58 typedef void result_type;
59 typedef T * argument_type;
60
61 void operator()(T * x) const
62 {
63 ndnboost::checked_array_delete(x);
64 }
65};
66
67} // namespace ndnboost
68
Jeff Thompson3d613fd2013-10-15 15:39:04 -070069#endif // #ifndef NDNBOOST_CHECKED_DELETE_HPP_INCLUDED