1 2 // Copyright (C) 2009-2012 Lorenzo Caminiti 3 // Distributed under the Boost Software License, Version 1.0 4 // (see accompanying file LICENSE_1_0.txt or a copy at 5 // http://www.boost.org/LICENSE_1_0.txt) 6 // Home at http://www.boost.org/libs/local_function 7 8 #ifndef SCOPE_EXIT_HPP_ 9 #define SCOPE_EXIT_HPP_ 10 11 #include <boost/local_function.hpp> 12 #include <boost/local_function/detail/preprocessor/line_counter.hpp> 13 #include <boost/function.hpp> 14 #include <boost/preprocessor/cat.hpp> 15 #include <boost/config.hpp> 16 17 //[scope_exit_class 18 struct scope_exit { scope_exitscope_exit19 scope_exit(boost::function<void (void)> f): f_(f) {} ~scope_exitscope_exit20 ~scope_exit(void) { f_(); } 21 private: 22 boost::function<void (void)> f_; 23 }; 24 //] 25 26 // PRIVATE // 27 28 //[scope_exit_end_macro 29 #define SCOPE_EXIT_END_(id) \ 30 BOOST_LOCAL_FUNCTION_NAME(BOOST_PP_CAT(scope_exit_func_, id)) \ 31 scope_exit BOOST_PP_CAT(scope_exit_, id)( \ 32 BOOST_PP_CAT(scope_exit_func_, id)); 33 //] 34 35 // PUBLIC // 36 37 #ifdef BOOST_NO_CXX11_VARIADIC_MACROS 38 # define SCOPE_EXIT(void_or_seq) \ 39 void BOOST_LOCAL_FUNCTION(void_or_seq) 40 #else 41 //[scope_exit_macro 42 # define SCOPE_EXIT(...) \ 43 void BOOST_LOCAL_FUNCTION(__VA_ARGS__) 44 //] 45 #endif 46 47 #define SCOPE_EXIT_END \ 48 SCOPE_EXIT_END_(BOOST_LOCAL_FUNCTION_DETAIL_PP_LINE_COUNTER) 49 50 #endif // #include guard 51 52