// Copyright (c) the JPEG XL Project Authors. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. #ifndef LIB_JXL_BASE_SCOPE_GUARD_H_ #define LIB_JXL_BASE_SCOPE_GUARD_H_ #include namespace jxl { template class ScopeGuard { public: // Discourage unnecessary moves / copies. ScopeGuard(const ScopeGuard &) = delete; ScopeGuard &operator=(const ScopeGuard &) = delete; ScopeGuard &operator=(ScopeGuard &&) = delete; // Pre-C++17 does not guarantee RVO -> require move constructor. ScopeGuard(ScopeGuard &&other) : callback_(std::move(other.callback_)) { other.armed_ = false; } template explicit ScopeGuard(CallbackParam &&callback) : callback_(std::forward(callback)), armed_(true) {} ~ScopeGuard() { if (armed_) callback_(); } void Disarm() { armed_ = false; } private: Callback callback_; bool armed_; }; template ScopeGuard MakeScopeGuard(Callback &&callback) { return ScopeGuard{std::forward(callback)}; } } // namespace jxl #endif // LIB_JXL_BASE_SCOPE_GUARD_H_