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