/*
 * Copyright 2016 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkScopeExit_DEFINED
#define SkScopeExit_DEFINED

#include "include/core/SkTypes.h"
#include "include/private/SkMacros.h"

#include <functional>

/** SkScopeExit calls a std:::function<void()> in its destructor. */
class SkScopeExit {
public:
    SkScopeExit() = default;
    SkScopeExit(std::function<void()> f) : fFn(std::move(f)) {}
    SkScopeExit(SkScopeExit&& that) : fFn(std::move(that.fFn)) {}

    ~SkScopeExit() {
        if (fFn) {
            fFn();
        }
    }

    void clear() { fFn = {}; }

    SkScopeExit& operator=(SkScopeExit&& that) {
        fFn = std::move(that.fFn);
        return *this;
    }

private:
    std::function<void()> fFn;

    SkScopeExit(           const SkScopeExit& ) = delete;
    SkScopeExit& operator=(const SkScopeExit& ) = delete;
};

/**
 * SK_AT_SCOPE_EXIT(stmt) evaluates stmt when the current scope ends.
 *
 * E.g.
 *    {
 *        int x = 5;
 *        {
 *           SK_AT_SCOPE_EXIT(x--);
 *           SkASSERT(x == 5);
 *        }
 *        SkASSERT(x == 4);
 *    }
 */
#define SK_AT_SCOPE_EXIT(stmt)                              \
    SkScopeExit SK_MACRO_APPEND_LINE(at_scope_exit_)([&]() { stmt; })

#endif  // SkScopeExit_DEFINED
