diff --git a/src/README.md b/src/README.md index b0ad536..7b38162 100644 --- a/src/README.md +++ b/src/README.md @@ -12,6 +12,10 @@ A quick circular buffer template class. An improved version based on Onigmo 5.13.5. In particular, **the addition of iterator makes it possible to match gap buffer or nonadjacent memory blocks.** Please refer to the sample files for how to use. +## ScopeGuard.h + +A class of which the sole purpose is to run the function f in its destructor. This is useful for guaranteeing your cleanup code is executed. + ## Spin.h A high-performance spin mutex and locker. \ No newline at end of file diff --git a/src/ScopeGuard.h b/src/ScopeGuard.h new file mode 100644 index 0000000..ff1113d --- /dev/null +++ b/src/ScopeGuard.h @@ -0,0 +1,57 @@ + /* + * Copyright 2020, WindTerm. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef SCOPEGUARD_H +#define SCOPEGUARD_H + +class ScopeGuard { + typedef std::function GuardFunction; + +public: + ScopeGuard(GuardFunction acquire, GuardFunction release) + : m_active(true) + , m_release(std::move(release)) + { + acquire(); + } + + ~ScopeGuard() { + if (m_active) { + m_release(); + } + } + + ScopeGuard() = delete; + ScopeGuard(const ScopeGuard &) = delete; + ScopeGuard &operator=(const ScopeGuard &) = delete; + + ScopeGuard(ScopeGuard &&other) + : m_active(other.m_active) + , m_release(std::move(other.m_release)) + { + other.cancel(); + } + + void cancel() { + m_active = false; + } + +private: + bool m_active; + GuardFunction m_release; +}; + +#endif // SCOPEGUARD_H