19 #ifndef LOMIRI_UTIL_RESOURCEPTR_H
20 #define LOMIRI_UTIL_RESOURCEPTR_H
23 #include <type_traits>
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>
155 explicit operator
bool() const noexcept;
175 mutable std::mutex m_;
177 typedef std::lock_guard<decltype(m_)> AutoLock;
178 typedef LockAdopter<decltype(m_)> AdoptLock;
181 template<typename R, typename D>
183 : initialized_(false)
185 static_assert(!std::is_pointer<deleter_type>::value,
186 "constructed with null function pointer deleter");
194 template<
typename R,
typename D>
196 : delete_(d), initialized_(false)
237 template<
typename R,
typename D>
239 : resource_(r), delete_(d), initialized_(true)
251 template<
typename R,
typename D>
253 : resource_(std::move(r.resource_)), delete_(r.delete_), initialized_(r.initialized_)
255 r.initialized_ =
false;
265 template<
typename R,
typename D>
272 initialized_ =
false;
278 resource_ = std::move(r.resource_);
279 initialized_ = r.initialized_;
280 r.initialized_ =
false;
290 template<
typename R,
typename D>
311 template<
typename R,
typename D>
319 std::lock(m_, other.m_);
321 AdoptLock right(other.m_);
324 swap(resource_, other.resource_);
325 swap(delete_, other.delete_);
326 swap(initialized_, other.initialized_);
342 template<
typename R,
typename D>
357 template<
typename R,
typename D>
362 bool has_old = initialized_;
367 old_resource = resource_;
373 delete_(old_resource);
383 template<
typename R,
typename D>
391 throw std::logic_error(
"release() called on ResourcePtr without resource");
393 initialized_ =
false;
404 template<
typename R,
typename D>
413 initialized_ =
false;
426 template<
typename R,
typename D>
434 throw std::logic_error(
"get() called on ResourcePtr without resource");
443 template<
typename R,
typename D>
455 template<
typename R,
typename D>
459 return has_resource();
466 template<
typename R,
typename D>
478 template<
typename R,
typename D>
497 template<
typename R,
typename D>
505 std::lock(m_, rhs.m_);
507 AdoptLock right(rhs.m_);
511 return !rhs.initialized_;
513 else if (!rhs.initialized_)
519 return resource_ == rhs.resource_;
531 template<
typename R,
typename D>
535 return !(*
this == rhs);
548 template<
typename R,
typename D>
556 std::lock(m_, rhs.m_);
558 AdoptLock right(rhs.m_);
562 return rhs.initialized_;
564 else if (!rhs.initialized_)
570 return resource_ < rhs.resource_;
587 template<
typename R,
typename D>
602 std::lock(m_, rhs.m_);
604 AdoptLock right(rhs.m_);
606 return resource_ < rhs.resource_ || resource_ == rhs.resource_;
621 template<
typename R,
typename D>
625 return !(*
this <= rhs);
639 template<
typename R,
typename D>
643 return !(*
this < rhs);
659 template<
typename R,
typename D>
660 struct equal_to<
lomiri::util::ResourcePtr<R, D>>
675 template<
typename R,
typename D>
676 struct not_equal_to<
lomiri::util::ResourcePtr<R, D>>
691 template<
typename R,
typename D>
692 struct less<
lomiri::util::ResourcePtr<R, D>>
707 template<
typename R,
typename D>
708 struct less_equal<
lomiri::util::ResourcePtr<R, D>>
723 template<
typename R,
typename D>
724 struct greater<
lomiri::util::ResourcePtr<R, D>>
739 template<
typename R,
typename D>
740 struct greater_equal<
lomiri::util::ResourcePtr<R, D>>
void dealloc()
Definition: ResourcePtr.h:405
D deleter_type
Definition: ResourcePtr.h:138
~ResourcePtr() noexcept
Definition: ResourcePtr.h:291
bool operator<(ResourcePtr const &rhs) const
Returns true if this is less than rhs.
Definition: ResourcePtr.h:549
bool operator<=(ResourcePtr const &rhs) const
Returns true if this is less than or equal to rhs.
Definition: ResourcePtr.h:588
bool operator()(lomiri::util::ResourcePtr< R, D > const &lhs, lomiri::util::ResourcePtr< R, D > const &rhs) const
Definition: ResourcePtr.h:697
bool operator!=(ResourcePtr const &rhs) const
Compares two instances for inequality.
Definition: ResourcePtr.h:533
bool operator>=(ResourcePtr const &rhs) const
Returns true if this is greater than or equal to rhs.
Definition: ResourcePtr.h:641
bool operator()(lomiri::util::ResourcePtr< R, D > const &lhs, lomiri::util::ResourcePtr< R, D > const &rhs) const
Definition: ResourcePtr.h:745
bool has_resource() const noexcept
Definition: ResourcePtr.h:445
R element_type
Definition: ResourcePtr.h:131
void reset(R r)
Definition: ResourcePtr.h:358
void swap(ResourcePtr &other)
Definition: ResourcePtr.h:312
bool operator==(ResourcePtr const &rhs) const
Compares two instances for equality.
Definition: ResourcePtr.h:498
D & get_deleter() noexcept
Definition: ResourcePtr.h:468
bool operator()(lomiri::util::ResourcePtr< R, D > const &lhs, lomiri::util::ResourcePtr< R, D > const &rhs) const
Definition: ResourcePtr.h:681
bool operator>(ResourcePtr const &rhs) const
Returns true if this is greater than rhs.
Definition: ResourcePtr.h:623
R get() const
Definition: ResourcePtr.h:428
bool operator()(lomiri::util::ResourcePtr< R, D > const &lhs, lomiri::util::ResourcePtr< R, D > const &rhs) const
Definition: ResourcePtr.h:713
bool operator()(lomiri::util::ResourcePtr< R, D > const &lhs, lomiri::util::ResourcePtr< R, D > const &rhs) const
Definition: ResourcePtr.h:729
Class to guarantee deallocation of arbitrary resources.
Definition: ResourcePtr.h:120
Top-level namespace for all things Lomiri-related.
Definition: Version.h:37
bool operator()(lomiri::util::ResourcePtr< R, D > const &lhs, lomiri::util::ResourcePtr< R, D > const &rhs) const
Definition: ResourcePtr.h:665
ResourcePtr & operator=(ResourcePtr const &)=delete
R release()
Definition: ResourcePtr.h:385