1 #ifndef BOOST_CHECKED_DELETE_HPP_INCLUDED 2 #define BOOST_CHECKED_DELETE_HPP_INCLUDED 3 4 // MS compatible compilers support #pragma once 5 6 #if defined(_MSC_VER) && (_MSC_VER >= 1020) 7 # pragma once 8 #endif 9 10 // 11 // boost/checked_delete.hpp 12 // 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 24 namespace boost 25 { 26 27 // verify that types are complete for increased safety 28 checked_delete(T * x)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 checked_array_delete(T * x)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 44 template<class T> struct checked_deleter 45 { 46 typedef void result_type; 47 typedef T * argument_type; 48 operator ()boost::checked_deleter49 void operator()(T * x) const 50 { 51 // boost:: disables ADL 52 boost::checked_delete(x); 53 } 54 }; 55 56 template<class T> struct checked_array_deleter 57 { 58 typedef void result_type; 59 typedef T * argument_type; 60 operator ()boost::checked_array_deleter61 void operator()(T * x) const 62 { 63 boost::checked_array_delete(x); 64 } 65 }; 66 67 } // namespace boost 68 69 #endif // #ifndef BOOST_CHECKED_DELETE_HPP_INCLUDED 70