Chris@16: // (C) Copyright Jonathan Turkanis 2004-2005. Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.) Chris@16: Chris@16: // Contains the definition of move_ptrs::default_deleter, the default Chris@16: // Deleter template argument to move_ptr. Uses a technique of Daniel Chris@16: // Wallin to capture the type of a pointer at the time the deleter Chris@16: // is constructed, so that move_ptrs can delete objects of incomplete Chris@16: // type by default. Chris@16: Chris@16: #ifndef BOOST_MOVE_PTR_DEFAULT_DELETER_HPP_INCLUDED Chris@16: #define BOOST_MOVE_PTR_DEFAULT_DELETER_HPP_INCLUDED Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace ptr_container_detail { namespace move_ptrs { Chris@16: Chris@16: namespace ptr_container_detail { Chris@16: Chris@16: template Chris@16: struct deleter_base { Chris@16: typedef void (*deleter)(T*); Chris@16: deleter_base(deleter d) { delete_ = d; } Chris@16: void operator() (T* t) const { delete_(t); } Chris@16: static deleter delete_; Chris@16: }; Chris@16: Chris@16: template Chris@16: typename deleter_base::deleter Chris@16: deleter_base::delete_; Chris@16: Chris@16: template Chris@16: struct scalar_deleter : deleter_base { Chris@16: typedef deleter_base base; Chris@16: scalar_deleter() : base(do_delete) { } Chris@16: static void do_delete(T* t) { checked_delete(t); } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct array_deleter Chris@16: : deleter_base::type> Chris@16: { Chris@16: typedef typename remove_bounds::type element_type; Chris@16: typedef deleter_base base; Chris@16: array_deleter() : base(do_delete) { } Chris@16: static void do_delete(element_type* t) { checked_array_delete(t); } Chris@16: }; Chris@16: Chris@16: } // End namespace ptr_container_detail. Chris@16: Chris@16: template Chris@16: struct default_deleter Chris@16: : mpl::if_< Chris@16: is_array, Chris@16: ptr_container_detail::array_deleter, Chris@16: ptr_container_detail::scalar_deleter Chris@16: >::type Chris@16: { Chris@16: default_deleter() { } Chris@16: template Chris@16: default_deleter(default_deleter tt) { } Chris@16: }; Chris@16: Chris@16: } } } // End namespaces ptr_container_detail, move_ptrs, boost. Chris@16: Chris@16: #endif // #ifndef BOOST_MOVE_PTR_DEFAULT_DELETER_HPP_INCLUDED