| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #pragma once |
| |
|
| | #include <functional> |
| | #include <vector> |
| | #include <utility> |
| |
|
| | namespace utilities { |
| |
|
| | template<typename T> |
| | class vector_guard { |
| | public: |
| | vector_guard() = delete; |
| |
|
| | vector_guard(std::vector<T> resources, std::function<void(T&)> destructor) |
| | : instance_(std::move(resources)), destructor_(std::move(destructor)) {} |
| |
|
| | vector_guard(std::function<std::vector<T>()> resource_creator, std::function<void(T&)> destructor) |
| | : instance_(resource_creator()), destructor_(std::move(destructor)) {} |
| |
|
| | vector_guard(vector_guard&& other) noexcept |
| | : instance_(std::exchange(other.instance_, std::vector<T>{})), destructor_(std::move(other.destructor_)) {} |
| |
|
| | vector_guard& operator=(vector_guard&& other) noexcept { |
| | if (this != &other) { |
| | instance_ = std::exchange(other.instance_, std::vector<T>{}); |
| | destructor_ = std::move(other.destructor_); |
| | } |
| | return *this; |
| | } |
| |
|
| | vector_guard(const vector_guard&) = delete; |
| | vector_guard& operator=(const vector_guard&) = delete; |
| |
|
| | ~vector_guard() noexcept { |
| | if (destructor_) { |
| | for (auto& resource : instance_) { |
| | destructor_(resource); |
| | } |
| | } |
| | } |
| |
|
| | std::vector<T>& get() { |
| | return instance_; |
| | } |
| |
|
| | T* data() { |
| | return instance_.data(); |
| | } |
| |
|
| | private: |
| | std::vector<T> instance_; |
| | std::function<void(T&)> destructor_; |
| | }; |
| |
|
| | } |
| |
|