cpp-mate  0.7
Helpful library for C++.
Resource.hpp
1 /*
2  * Copyright (C) 2019-2020 Alexander Kornilov (akornilov.82@gmail.com)
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef CPP_MATE_RESOURCE_HPP
18 #define CPP_MATE_RESOURCE_HPP
19 
20 #include <functional>
21 
22 namespace CppMate {
23 
27 template<typename T>
28 class Resource final
29 {
30 public:
31  Resource(const Resource&) = delete;
32  Resource& operator=(const Resource&) = delete;
33 
37  using Release = std::function<void(const T& resource)>;
38 
44  Resource(const T& resource, const Release& release) noexcept:
45  _resource(resource),
46  _release(release) { }
47 
52  Resource(Resource&& other) noexcept:
53  _resource(std::move(other._resource)),
54  _release(std::move(other._release))
55  {
56  }
57 
61  ~Resource() { if (_release) _release(_resource); }
62 
67  T get() const noexcept { return _resource; }
68 
73  void set(const T& resource) noexcept { _resource = resource; }
74 
80  Resource& operator=(Resource&& other) noexcept {
81  _resource = std::move(other._resource);
82  _release = std::move(other._release);
83  return *this;
84  }
85 
89  operator T() const noexcept { return get(); }
90 
94  operator bool() const noexcept { return static_cast<bool>(get()); }
95 
100  T operator*() const noexcept { return get(); }
101 
107  Resource& operator=(const T& resource) noexcept { set(resource); return *this; }
108 
109 private:
110  T _resource;
111  Release _release;
112 };
113 
114 } // namespace CppMate
115 
116 #endif // CPP_MATE_RESOURCE_HPP
Represents some abstract resource which should be released.
Definition: Resource.hpp:29
void set(const T &resource) noexcept
Sets a new resource without releasing a previous one.
Definition: Resource.hpp:73
Resource & operator=(const Resource &)=delete
Resource(const Resource &)=delete
T get() const noexcept
Gets resource.
Definition: Resource.hpp:67
T operator*() const noexcept
Operator to access the resource via asterisk symbol.
Definition: Resource.hpp:100
Resource & operator=(Resource &&other) noexcept
operator =
Definition: Resource.hpp:80
~Resource()
Definition: Resource.hpp:61
Resource(const T &resource, const Release &release) noexcept
Constructor.
Definition: Resource.hpp:44
Resource(Resource &&other) noexcept
Constructor.
Definition: Resource.hpp:52
std::function< void(const T &resource)> Release
Definition: Resource.hpp:37
Resource & operator=(const T &resource) noexcept
operator =
Definition: Resource.hpp:107
Definition: BinaryData.hpp:28