1    	// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2    	// vim: ts=8 sw=2 smarttab
3    	/*
4    	 * Ceph - scalable distributed file system
5    	 *
6    	 * Copyright (C) 2016 Red Hat
7    	 *
8    	 * This is free software; you can redistribute it and/or
9    	 * modify it under the terms of the GNU Lesser General Public
10   	 * License version 2.1, as published by the Free Software
11   	 * Foundation.  See file COPYING.
12   	 *
13   	 */
14   	
15   	#ifndef SCOPE_GUARD
16   	#define SCOPE_GUARD
17   	
18   	#include <utility>
19   	
20   	template <typename F>
21   	struct scope_guard {
22   	  F f;
23   	  scope_guard() = delete;
24   	  scope_guard(const scope_guard &) = delete;
25   	  scope_guard(scope_guard &&) = default;
26   	  scope_guard & operator=(const scope_guard &) = delete;
27   	  scope_guard & operator=(scope_guard &&) = default;
28   	  scope_guard(const F& f) : f(f) {}
29   	  scope_guard(F &&f) : f(std::move(f)) {}
30   	  template<typename... Args>
31   	  scope_guard(std::in_place_t, Args&& ...args) : f(std::forward<Args>(args)...) {}
(1) Event exn_spec_violation: An exception of type "boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_get> >" is thrown but the throw list "throw()" doesn't allow it to be thrown. This will cause a call to unexpected() which usually calls terminate().
Also see events: [fun_call_w_exception]
32   	  ~scope_guard() {
(2) Event fun_call_w_exception: Called function throws an exception of type "boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_get> >". [details]
Also see events: [exn_spec_violation]
33   	    std::move(f)(); // Support at-most-once functions
34   	  }
35   	};
36   	
37   	template <typename F>
38   	scope_guard<F> make_scope_guard(F &&f) {
39   	  return scope_guard<F>(std::forward<F>(f));
40   	}
41   	
42   	template<typename F, typename... Args>
43   	scope_guard<F> make_scope_guard(std::in_place_type_t<F>, Args&& ...args) {
44   	  return { std::in_place, std::forward<Args>(args)... };
45   	}
46   	
47   	#endif
48