19 #ifndef UNITY_UTIL_RESOURCEPTR_H 20 #define UNITY_UTIL_RESOURCEPTR_H 23 #include <type_traits> 40 LockAdopter(T& mutex) noexcept
41 : m_(mutex, std::adopt_lock)
43 assert(!mutex.try_lock());
47 std::unique_lock<T> m_;
118 template<
typename R,
typename D>
153 bool has_resource() const noexcept;
154 explicit operator
bool() const noexcept;
155 D& get_deleter() noexcept;
156 D const& get_deleter() const noexcept;
174 mutable
std::mutex m_;
176 typedef
std::lock_guard<decltype(m_)> AutoLock;
177 typedef LockAdopter<decltype(m_)> AdoptLock;
180 template<typename R, typename D>
182 : initialized_(false)
184 static_assert(!std::is_pointer<deleter_type>::value,
185 "constructed with null function pointer deleter");
193 template<
typename R,
typename D>
195 : delete_(d), initialized_(false)
236 template<
typename R,
typename D>
238 : resource_(r), delete_(d), initialized_(true)
250 template<
typename R,
typename D>
252 : resource_(
std::move(r.resource_)), delete_(r.delete_), initialized_(r.initialized_)
254 r.initialized_ =
false;
264 template<
typename R,
typename D>
271 initialized_ =
false;
277 resource_ = std::move(r.resource_);
278 initialized_ = r.initialized_;
279 r.initialized_ =
false;
289 template<
typename R,
typename D>
310 template<
typename R,
typename D>
318 std::lock(m_, other.m_);
320 AdoptLock right(other.m_);
323 swap(resource_, other.resource_);
324 swap(delete_, other.delete_);
325 swap(initialized_, other.initialized_);
341 template<
typename R,
typename D>
356 template<
typename R,
typename D>
361 bool has_old = initialized_;
366 old_resource = resource_;
372 delete_(old_resource);
382 template<
typename R,
typename D>
390 throw std::logic_error(
"release() called on ResourcePtr without resource");
392 initialized_ =
false;
403 template<
typename R,
typename D>
412 initialized_ =
false;
425 template<
typename R,
typename D>
433 throw std::logic_error(
"get() called on ResourcePtr without resource");
442 template<
typename R,
typename D>
454 template<
typename R,
typename D>
465 template<
typename R,
typename D>
477 template<
typename R,
typename D>
496 template<
typename R,
typename D>
504 std::lock(m_, rhs.m_);
506 AdoptLock right(rhs.m_);
510 return !rhs.initialized_;
512 else if (!rhs.initialized_)
518 return resource_ == rhs.resource_;
530 template<
typename R,
typename D>
534 return !(*
this == rhs);
547 template<
typename R,
typename D>
555 std::lock(m_, rhs.m_);
557 AdoptLock right(rhs.m_);
561 return rhs.initialized_;
563 else if (!rhs.initialized_)
569 return resource_ < rhs.resource_;
586 template<
typename R,
typename D>
601 std::lock(m_, rhs.m_);
603 AdoptLock right(rhs.m_);
605 return resource_ < rhs.resource_ || resource_ == rhs.resource_;
620 template<
typename R,
typename D>
624 return !(*
this <= rhs);
638 template<
typename R,
typename D>
642 return !(*
this < rhs);
658 template<
typename R,
typename D>
659 struct equal_to<
unity::util::ResourcePtr<R, D>>
674 template<
typename R,
typename D>
675 struct not_equal_to<
unity::util::ResourcePtr<R, D>>
690 template<
typename R,
typename D>
691 struct less<
unity::util::ResourcePtr<R, D>>
706 template<
typename R,
typename D>
707 struct less_equal<
unity::util::ResourcePtr<R, D>>
722 template<
typename R,
typename D>
723 struct greater<
unity::util::ResourcePtr<R, D>>
738 template<
typename R,
typename D>
739 struct greater_equal<
unity::util::ResourcePtr<R, D>>
bool operator!=(ResourcePtr const &rhs) const
Compares two instances for inequality.
Definition: ResourcePtr.h:532
bool operator<(ResourcePtr const &rhs) const
Returns true if this is less than rhs.
Definition: ResourcePtr.h:548
Class to guarantee deallocation of arbitrary resources.
Definition: ResourcePtr.h:119
bool operator()(unity::util::ResourcePtr< R, D > const &lhs, unity::util::ResourcePtr< R, D > const &rhs) const
Definition: ResourcePtr.h:712
bool operator()(unity::util::ResourcePtr< R, D > const &lhs, unity::util::ResourcePtr< R, D > const &rhs) const
Definition: ResourcePtr.h:696
R element_type
Definition: ResourcePtr.h:130
bool operator>(ResourcePtr const &rhs) const
Returns true if this is greater than rhs.
Definition: ResourcePtr.h:622
Definition: ResourcePtr.h:651
bool operator()(unity::util::ResourcePtr< R, D > const &lhs, unity::util::ResourcePtr< R, D > const &rhs) const
Definition: ResourcePtr.h:664
ResourcePtr & operator=(ResourcePtr const &)=delete
bool operator>=(ResourcePtr const &rhs) const
Returns true if this is greater than or equal to rhs.
Definition: ResourcePtr.h:640
R release()
Definition: ResourcePtr.h:384
bool operator()(unity::util::ResourcePtr< R, D > const &lhs, unity::util::ResourcePtr< R, D > const &rhs) const
Definition: ResourcePtr.h:680
bool operator()(unity::util::ResourcePtr< R, D > const &lhs, unity::util::ResourcePtr< R, D > const &rhs) const
Definition: ResourcePtr.h:744
Top-level namespace for all things Unity-related.
Definition: Version.h:37
bool operator==(ResourcePtr const &rhs) const
Compares two instances for equality.
Definition: ResourcePtr.h:497
bool operator()(unity::util::ResourcePtr< R, D > const &lhs, unity::util::ResourcePtr< R, D > const &rhs) const
Definition: ResourcePtr.h:728
void swap(ResourcePtr &other)
Definition: ResourcePtr.h:311
D deleter_type
Definition: ResourcePtr.h:137
R get() const
Definition: ResourcePtr.h:427
bool has_resource() const noexcept
Definition: ResourcePtr.h:444
void reset(R r)
Definition: ResourcePtr.h:357
bool operator<=(ResourcePtr const &rhs) const
Returns true if this is less than or equal to rhs.
Definition: ResourcePtr.h:587
void dealloc()
Definition: ResourcePtr.h:404
~ResourcePtr() noexcept
Definition: ResourcePtr.h:290
D & get_deleter() noexcept
Definition: ResourcePtr.h:467