14 #ifndef OR_TOOLS_BASE_CLEANUP_H_
15 #define OR_TOOLS_BASE_CLEANUP_H_
19 #include "absl/base/macros.h"
24 namespace cleanup_internal {
26 template <
typename Callback>
28 using InvokeT = absl::base_internal::invoke_result_t<Callback>;
33 Storage() : contains_callback_(false), callback_() {}
39 template <
typename TheCallback>
40 explicit Storage(TheCallback&& the_callback)
41 : contains_callback_(true),
42 callback_(std::forward<TheCallback>(the_callback)) {}
44 template <
typename OtherCallback>
51 contains_callback_ = other_storage.ContainsCallback();
52 callback_ = other_storage.ReleaseCallback();
59 contains_callback_ =
false;
60 return std::move(callback_);
68 std::move(callback_)();
72 bool contains_callback_;
77 template <
template <
typename>
class Cleanup,
typename Callback>
79 return cleanup.storage_;
85 template <
typename Callback>
95 template <
typename TheCallback>
96 explicit Cleanup(TheCallback&& the_callback)
97 : storage_(std::forward<TheCallback>(the_callback)) {}
99 template <
typename OtherCallback>
104 if (storage_.ContainsCallback()) storage_.InvokeCallback();
114 friend AccessStorage;
119 template <
int&... PreventExplicitTemplateArguments,
typename Callback>
127 #endif // OR_TOOLS_BASE_CLEANUP_H_