| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #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_; |
| }; |
|
|
| } |
|
|