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