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