/* Copyright (C) 2019-2025 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef GDBSUPPORT_FORWARD_SCOPE_EXIT_H
#define GDBSUPPORT_FORWARD_SCOPE_EXIT_H

#include "gdbsupport/scope-exit.h"
#include <functional>

/* A forward_scope_exit is like scope_exit, but instead of giving it a
   callable, you instead specialize it for a given cleanup function,
   and the generated class automatically has a constructor with the
   same interface as the cleanup function.  forward_scope_exit
   captures the arguments passed to the ctor, and in turn passes those
   as arguments to the wrapped cleanup function, when it is called at
   scope exit time, from within the forward_scope_exit dtor.  The
   forward_scope_exit class can take any number of arguments, and is
   cancelable if needed.

   This allows usage like this:

      void
      delete_longjmp_breakpoint (int arg)
      {
	// Blah, blah, blah...
      }

      using longjmp_breakpoint_cleanup
	= FORWARD_SCOPE_EXIT (delete_longjmp_breakpoint);

   This above created a new cleanup class `longjmp_breakpoint_cleanup`
   than can then be used like this:

      longjmp_breakpoint_cleanup obj (thread);

      // Blah, blah, blah...

      obj.release ();  // Optional cancel if needed.

   forward_scope_exit is also handy when you would need to wrap a
   scope_exit in a std::optional:

      std::optional<longjmp_breakpoint_cleanup> cleanup;
      if (some condition)
	cleanup.emplace (thread);
      ...
      if (cleanup)
	cleanup->release ();

   since with scope exit, you would have to know the scope_exit's
   callable template type when you create the std::optional:

     gdb:optional<scope_exit<what goes here?>>

   The "forward" naming fits both purposes shown above -- the class
   "forwards" ctor arguments to the wrapped cleanup function at scope
   exit time, and can also be used to "forward declare"
   scope_exit-like objects.  */

namespace detail
{

/* Function and Signature are passed in the same type, in order to
   extract Function's arguments' types in the specialization below.
   Those are used to generate the constructor.  */

template<typename Function, Function *function, typename Signature>
struct forward_scope_exit_policy;

template<typename Function, Function *function,
	 typename Res, typename... Args>
class forward_scope_exit_policy<Function, function, Res (Args...)>
{
public:
  explicit forward_scope_exit_policy (Args ...args)
    : m_bind_function (function, args...)
  {
    /* Nothing.  */
  }

  DISABLE_COPY_AND_ASSIGN (forward_scope_exit_policy);

  void on_exit ()
  {
    m_bind_function ();
  }

private:
  /* The function and the arguments passed to the ctor, all packed in
     a std::bind.  */
  decltype (std::bind (function, std::declval<Args> ()...))
    m_bind_function;
};

template<typename Function, Function *function, typename Signature>
using forward_scope_exit
	= scope_exit_base<forward_scope_exit_policy<Function, function,
						    Signature>>;

} /* namespace detail */

/* This is the "public" entry point.  It's a macro to avoid having to
   name FUNC more than once.  */

#define FORWARD_SCOPE_EXIT(FUNC) \
  detail::forward_scope_exit<decltype (FUNC), FUNC, decltype (FUNC)>

#endif /* GDBSUPPORT_FORWARD_SCOPE_EXIT_H */
