19 #ifndef UNITY_UTIL_RESOURCEPTR_H
20 #define UNITY_UTIL_RESOURCEPTR_H
39 LockAdopter(T& mutex) noexcept
40 : m_(mutex, std::adopt_lock)
42 assert(!mutex.try_lock());
46 std::unique_lock<T> m_;
117 template<
typename R,
typename D>
152 explicit operator
bool() const noexcept;
172 mutable
std::mutex m_;
174 typedef
std::lock_guard<decltype(m_)> AutoLock;
175 typedef LockAdopter<decltype(m_)> AdoptLock;
183 template<typename R, typename D>
185 : delete_(d), initialized_(false)
226 template<
typename R,
typename D>
228 : resource_(r), delete_(d), initialized_(true)
240 template<
typename R,
typename D>
242 : resource_(
std::move(r.resource_)), delete_(r.delete_), initialized_(r.initialized_)
244 r.initialized_ =
false;
254 template<
typename R,
typename D>
261 initialized_ =
false;
267 resource_ = std::move(r.resource_);
268 initialized_ = r.initialized_;
269 r.initialized_ =
false;
279 template<
typename R,
typename D>
300 template<
typename R,
typename D>
308 std::lock(m_, other.m_);
310 AdoptLock right(other.m_);
313 swap(resource_, other.resource_);
314 swap(delete_, other.delete_);
315 swap(initialized_, other.initialized_);
331 template<
typename R,
typename D>
346 template<
typename R,
typename D>
351 bool has_old = initialized_;
356 old_resource = resource_;
362 delete_(old_resource);
372 template<
typename R,
typename D>
380 throw std::logic_error(
"release() called on ResourcePtr without resource");
382 initialized_ =
false;
393 template<
typename R,
typename D>
402 initialized_ =
false;
415 template<
typename R,
typename D>
423 throw std::logic_error(
"get() called on ResourcePtr without resource");
432 template<
typename R,
typename D>
444 template<
typename R,
typename D>
448 return has_resource();
455 template<
typename R,
typename D>
467 template<
typename R,
typename D>
486 template<
typename R,
typename D>
494 std::lock(m_, rhs.m_);
496 AdoptLock right(rhs.m_);
500 return !rhs.initialized_;
502 else if (!rhs.initialized_)
508 return resource_ == rhs.resource_;
520 template<
typename R,
typename D>
524 return !(*
this == rhs);
537 template<
typename R,
typename D>
545 std::lock(m_, rhs.m_);
547 AdoptLock right(rhs.m_);
551 return rhs.initialized_;
553 else if (!rhs.initialized_)
559 return resource_ < rhs.resource_;
576 template<
typename R,
typename D>
591 std::lock(m_, rhs.m_);
593 AdoptLock right(rhs.m_);
595 return resource_ < rhs.resource_ || resource_ == rhs.resource_;
610 template<
typename R,
typename D>
614 return !(*
this <= rhs);
628 template<
typename R,
typename D>
632 return !(*
this < rhs);
648 template<
typename R,
typename D>
649 struct equal_to<
unity::util::ResourcePtr<R, D>>
664 template<
typename R,
typename D>
665 struct not_equal_to<
unity::util::ResourcePtr<R, D>>
680 template<
typename R,
typename D>
681 struct less<
unity::util::ResourcePtr<R, D>>
696 template<
typename R,
typename D>
697 struct less_equal<
unity::util::ResourcePtr<R, D>>
712 template<
typename R,
typename D>
713 struct greater<
unity::util::ResourcePtr<R, D>>
728 template<
typename R,
typename D>
729 struct greater_equal<
unity::util::ResourcePtr<R, D>>
bool operator!=(ResourcePtr const &rhs) const
Compares two instances for inequality.
Definition: ResourcePtr.h:522
bool operator<(ResourcePtr const &rhs) const
Returns true if this is less than rhs.
Definition: ResourcePtr.h:538
Class to guarantee deallocation of arbitrary resources.
Definition: ResourcePtr.h:118
bool operator()(unity::util::ResourcePtr< R, D > const &lhs, unity::util::ResourcePtr< R, D > const &rhs) const
Definition: ResourcePtr.h:702
bool operator()(unity::util::ResourcePtr< R, D > const &lhs, unity::util::ResourcePtr< R, D > const &rhs) const
Definition: ResourcePtr.h:686
R element_type
Definition: ResourcePtr.h:129
bool operator>(ResourcePtr const &rhs) const
Returns true if this is greater than rhs.
Definition: ResourcePtr.h:612
Definition: ResourcePtr.h:641
bool operator()(unity::util::ResourcePtr< R, D > const &lhs, unity::util::ResourcePtr< R, D > const &rhs) const
Definition: ResourcePtr.h:654
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:630
R release()
Definition: ResourcePtr.h:374
bool operator()(unity::util::ResourcePtr< R, D > const &lhs, unity::util::ResourcePtr< R, D > const &rhs) const
Definition: ResourcePtr.h:670
bool operator()(unity::util::ResourcePtr< R, D > const &lhs, unity::util::ResourcePtr< R, D > const &rhs) const
Definition: ResourcePtr.h:734
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:487
ResourcePtr(ResourcePtr const &)=delete
bool operator()(unity::util::ResourcePtr< R, D > const &lhs, unity::util::ResourcePtr< R, D > const &rhs) const
Definition: ResourcePtr.h:718
void swap(ResourcePtr &other)
Definition: ResourcePtr.h:301
D deleter_type
Definition: ResourcePtr.h:136
R get() const
Definition: ResourcePtr.h:417
bool has_resource() const noexcept
Definition: ResourcePtr.h:434
void reset(R r)
Definition: ResourcePtr.h:347
bool operator<=(ResourcePtr const &rhs) const
Returns true if this is less than or equal to rhs.
Definition: ResourcePtr.h:577
void dealloc()
Definition: ResourcePtr.h:394
~ResourcePtr() noexcept
Definition: ResourcePtr.h:280
D & get_deleter() noexcept
Definition: ResourcePtr.h:457