1*3f982cf4SFabien Sanglard // Copyright 2018 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard // found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglard #ifndef OSP_IMPL_WITH_DESTRUCTION_CALLBACK_H_ 6*3f982cf4SFabien Sanglard #define OSP_IMPL_WITH_DESTRUCTION_CALLBACK_H_ 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglard #include "platform/base/macros.h" 9*3f982cf4SFabien Sanglard 10*3f982cf4SFabien Sanglard namespace openscreen { 11*3f982cf4SFabien Sanglard namespace osp { 12*3f982cf4SFabien Sanglard 13*3f982cf4SFabien Sanglard // A decoration for classes which allows a callback to be run just after 14*3f982cf4SFabien Sanglard // destruction. Setting the callback is optional. 15*3f982cf4SFabien Sanglard class WithDestructionCallback { 16*3f982cf4SFabien Sanglard public: 17*3f982cf4SFabien Sanglard using DestructionCallbackFunctionPointer = void (*)(void*); 18*3f982cf4SFabien Sanglard 19*3f982cf4SFabien Sanglard WithDestructionCallback(); 20*3f982cf4SFabien Sanglard ~WithDestructionCallback(); 21*3f982cf4SFabien Sanglard 22*3f982cf4SFabien Sanglard // Sets the function to be called from the destructor. 23*3f982cf4SFabien Sanglard void SetDestructionCallback(DestructionCallbackFunctionPointer function, 24*3f982cf4SFabien Sanglard void* state); 25*3f982cf4SFabien Sanglard 26*3f982cf4SFabien Sanglard private: 27*3f982cf4SFabien Sanglard DestructionCallbackFunctionPointer destruction_callback_function_ = nullptr; 28*3f982cf4SFabien Sanglard void* destruction_callback_state_ = nullptr; 29*3f982cf4SFabien Sanglard 30*3f982cf4SFabien Sanglard OSP_DISALLOW_COPY_AND_ASSIGN(WithDestructionCallback); 31*3f982cf4SFabien Sanglard }; 32*3f982cf4SFabien Sanglard 33*3f982cf4SFabien Sanglard } // namespace osp 34*3f982cf4SFabien Sanglard } // namespace openscreen 35*3f982cf4SFabien Sanglard 36*3f982cf4SFabien Sanglard #endif // OSP_IMPL_WITH_DESTRUCTION_CALLBACK_H_ 37