19 #ifndef UNITY_UTIL_RESOURCEPTR_H
20 #define UNITY_UTIL_RESOURCEPTR_H
22 #include <unity/util/NonCopyable.h>
41 LockAdopter(T& mutex) noexcept
42 : m_(mutex, std::adopt_lock)
44 assert(!mutex.try_lock());
48 std::unique_lock<T> m_;
119 template<
typename R,
typename D>
150 explicit operator
bool() const noexcept;
170 mutable std::mutex m_;
172 typedef std::lock_guard<decltype(m_)> AutoLock;
173 typedef LockAdopter<decltype(m_)> AdoptLock;
181 template<typename R, typename D>
183 : delete_(d), initialized_(false)
224 template<
typename R,
typename D>
226 : resource_(r), delete_(d), initialized_(true)
238 template<
typename R,
typename D>
240 : resource_(std::move(r.resource_)), delete_(r.delete_), initialized_(r.initialized_)
242 r.initialized_ =
false;
252 template<
typename R,
typename D>
259 initialized_ =
false;
265 resource_ = std::move(r.resource_);
266 initialized_ = r.initialized_;
267 r.initialized_ =
false;
277 template<
typename R,
typename D>
298 template<
typename R,
typename D>
306 std::lock(m_, other.m_);
308 AdoptLock right(other.m_);
311 swap(resource_, other.resource_);
312 swap(delete_, other.delete_);
313 swap(initialized_, other.initialized_);
329 template<
typename R,
typename D>
344 template<
typename R,
typename D>
349 bool has_old = initialized_;
354 old_resource = resource_;
360 delete_(old_resource);
370 template<
typename R,
typename D>
378 throw std::logic_error(
"release() called on ResourcePtr without resource");
380 initialized_ =
false;
391 template<
typename R,
typename D>
400 initialized_ =
false;
413 template<
typename R,
typename D>
421 throw std::logic_error(
"get() called on ResourcePtr without resource");
430 template<
typename R,
typename D>
442 template<
typename R,
typename D>
446 return has_resource();
453 template<
typename R,
typename D>
465 template<
typename R,
typename D>
484 template<
typename R,
typename D>
492 std::lock(m_, rhs.m_);
494 AdoptLock right(rhs.m_);
498 return !rhs.initialized_;
500 else if (!rhs.initialized_)
506 return resource_ == rhs.resource_;
518 template<
typename R,
typename D>
522 return !(*
this == rhs);
536 template<
typename R,
typename D>
544 std::lock(m_, rhs.m_);
546 AdoptLock right(rhs.m_);
550 return rhs.initialized_;
552 else if (!rhs.initialized_)
558 return resource_ < rhs.resource_;
574 template<
typename R,
typename D>
589 std::lock(m_, rhs.m_);
591 AdoptLock right(rhs.m_);
593 return resource_ < rhs.resource_ || resource_ == rhs.resource_;
607 template<
typename R,
typename D>
611 return !(*
this <= rhs);
626 template<
typename R,
typename D>
630 return !(*
this < rhs);
646 template<
typename R,
typename D>
647 struct equal_to<unity::util::ResourcePtr<R, D>>
662 template<
typename R,
typename D>
663 struct not_equal_to<unity::util::ResourcePtr<R, D>>
678 template<
typename R,
typename D>
679 struct less<unity::util::ResourcePtr<R, D>>
694 template<
typename R,
typename D>
695 struct less_equal<unity::util::ResourcePtr<R, D>>
710 template<
typename R,
typename D>
711 struct greater<unity::util::ResourcePtr<R, D>>
726 template<
typename R,
typename D>
727 struct greater_equal<unity::util::ResourcePtr<R, D>>