38 #ifndef PMEMOBJ_PERSISTENT_PTR_HPP 39 #define PMEMOBJ_PERSISTENT_PTR_HPP 125 template <
typename Y,
126 typename =
typename std::enable_if<
127 std::is_convertible<Y *, T *>::value>::type>
157 detail::conditional_add_to_tx(
this);
158 this->oid = std::move(r.oid);
176 detail::conditional_add_to_tx(
this);
177 this_type(r).swap(*
this);
193 template <
typename Y,
194 typename =
typename std::enable_if<
195 std::is_convertible<Y *, T *>::value>::type>
199 detail::conditional_add_to_tx(
this);
200 this_type(r).swap(*
this);
208 typename nvml::detail::sp_dereference<T>::type
operator*() const
217 typename nvml::detail::sp_member_access<T>::type
operator->() const
228 typename nvml::detail::sp_array_access<T>::type
231 assert(i >= 0 && (i < nvml::detail::sp_extent<T>::value ||
232 nvml::detail::sp_extent<T>::value == 0) &&
233 "persistent array index out of bounds");
248 return (element_type *)pmemobj_direct(this->oid);
257 std::swap(this->oid, other.oid);
263 explicit operator bool()
const noexcept
265 return get() !=
nullptr;
299 detail::conditional_add_to_tx(
this);
300 this->oid.off +=
sizeof(T);
310 PMEMoid noid = this->oid;
321 detail::conditional_add_to_tx(
this);
322 this->oid.off -=
sizeof(T);
332 PMEMoid noid = this->oid;
344 detail::conditional_add_to_tx(
this);
345 this->oid.off += s *
sizeof(T);
356 detail::conditional_add_to_tx(
this);
357 this->oid.off -= s *
sizeof(T);
370 pop.
persist(this->
get(),
sizeof(T));
382 pmemobjpool *pop = pmemobj_pool_by_oid(this->
raw());
386 "persistent pointer");
388 pmemobj_persist(pop, this->
get(),
sizeof(T));
399 pop.
flush(this->
get(),
sizeof(T));
411 pmemobjpool *pop = pmemobj_pool_by_oid(this->
raw());
415 "persistent pointer");
417 pmemobj_flush(pop, this->
get(),
sizeof(T));
433 static_assert(!std::is_polymorphic<element_type>::value,
434 "Polymorphic types are not supported");
456 template <
typename T,
typename Y>
460 return OID_EQUALS(lhs.raw(), rhs.raw());
466 template <
typename T,
typename Y>
470 return !(lhs == rhs);
476 template <
typename T>
480 return lhs.
get() ==
nullptr;
486 template <
typename T>
490 return lhs.get() ==
nullptr;
496 template <
typename T>
500 return lhs.
get() !=
nullptr;
506 template <
typename T>
510 return lhs.get() !=
nullptr;
520 template <
typename T,
typename Y>
524 if (lhs.raw().pool_uuid_lo == rhs.raw().pool_uuid_lo)
525 return lhs.
raw().off < rhs.raw().off;
527 return lhs.raw().pool_uuid_lo < rhs.raw().pool_uuid_lo;
535 template <
typename T,
typename Y>
547 template <
typename T,
typename Y>
559 template <
typename T,
typename Y>
571 template <
typename T>
573 operator<(const persistent_ptr<T> &lhs, std::nullptr_t) noexcept
575 return std::less<typename persistent_ptr<T>::element_type *>()(
582 template <
typename T>
584 operator<(std::nullptr_t, const persistent_ptr<T> &rhs) noexcept
586 return std::less<typename persistent_ptr<T>::element_type *>()(
593 template <
typename T>
595 operator<=(const persistent_ptr<T> &lhs, std::nullptr_t) noexcept
597 return !(
nullptr < lhs);
603 template <
typename T>
605 operator<=(std::nullptr_t, const persistent_ptr<T> &rhs) noexcept
607 return !(rhs <
nullptr);
613 template <
typename T>
617 return nullptr < lhs;
623 template <
typename T>
627 return rhs <
nullptr;
633 template <
typename T>
637 return !(lhs <
nullptr);
643 template <
typename T>
647 return !(
nullptr < rhs);
653 template <
typename T>
658 noid.pool_uuid_lo = lhs.
raw().pool_uuid_lo;
659 noid.off = lhs.
raw().off + (s *
sizeof(T));
666 template <
typename T>
671 noid.pool_uuid_lo = lhs.
raw().pool_uuid_lo;
672 noid.off = lhs.
raw().off - (s *
sizeof(T));
683 template <
typename T>
687 assert(lhs.
raw().pool_uuid_lo == rhs.
raw().pool_uuid_lo);
688 ptrdiff_t d = lhs.
raw().off - rhs.
raw().off;
690 return d /
sizeof(T);
696 template <
typename T>
698 operator<<(std::ostream &os, const persistent_ptr<T> &pptr)
700 PMEMoid raw_oid = pptr.raw();
701 os << std::hex <<
"0x" << raw_oid.pool_uuid_lo <<
", 0x" << raw_oid.off
void swap(persistent_ptr &other) noexcept
Swaps two persistent_ptr objects of the same type.
Definition: persistent_ptr.hpp:255
Persistent pointer class.
Definition: persistent_ptr.hpp:72
PMEMoid * raw_ptr() noexcept
Get pointer to PMEMoid encapsulated by this object.
Definition: persistent_ptr.hpp:289
Helper template for persistent ptr specialization.
persistent_ptr< T > operator-(const persistent_ptr< T > &lhs, std::ptrdiff_t s)
Subtraction operator for persistent pointers.
Definition: persistent_ptr.hpp:668
bool operator>=(const persistent_ptr< T > &lhs, const persistent_ptr< Y > &rhs) noexcept
Greater or equal than operator.
Definition: persistent_ptr.hpp:561
persistent_ptr(persistent_ptr &&r) noexcept
Defaulted move constructor.
Definition: persistent_ptr.hpp:146
nvml::detail::sp_element< T >::type element_type
Type of an actual object with all qualifier removed, used for easy underlying type access...
Definition: persistent_ptr.hpp:83
persistent_ptr< T > & operator--()
Prefix decrement operator.
Definition: persistent_ptr.hpp:319
The non-template pool base class.
Definition: pool.hpp:64
nvml::detail::sp_member_access< T >::type operator->() const noexcept
Member access operator.
Definition: persistent_ptr.hpp:217
bool operator==(const persistent_ptr< T > &lhs, const persistent_ptr< Y > &rhs) noexcept
Equality operator.
Definition: persistent_ptr.hpp:458
nvml::detail::sp_dereference< T >::type operator*() const noexcept
Dereference operator.
Definition: persistent_ptr.hpp:208
persistent_ptr()
Default constructor, zeroes the PMEMoid.
Definition: persistent_ptr.hpp:88
persistent_ptr< T > operator++(int)
Postfix increment operator.
Definition: persistent_ptr.hpp:308
persistent_ptr< T > operator+(const persistent_ptr< T > &lhs, std::ptrdiff_t s)
Addition operator for persistent pointers.
Definition: persistent_ptr.hpp:655
Commonly used functionality.
void persist(pool_base &pop)
Persists the content of the underlying object.
Definition: persistent_ptr.hpp:368
persistent_ptr< T > & operator-=(std::ptrdiff_t s)
Subtraction assignment operator.
Definition: persistent_ptr.hpp:354
persistent_ptr(PMEMoid oid) noexcept
PMEMoid constructor.
Definition: persistent_ptr.hpp:114
persistent_ptr< T > operator--(int)
Postfix decrement operator.
Definition: persistent_ptr.hpp:330
const PMEMoid & raw() const noexcept
Get PMEMoid encapsulated by this object.
Definition: persistent_ptr.hpp:276
persistent_ptr(std::nullptr_t) noexcept
Default null constructor, zeroes the PMEMoid.
Definition: persistent_ptr.hpp:102
bool operator>(const persistent_ptr< T > &lhs, const persistent_ptr< Y > &rhs) noexcept
Greater than operator.
Definition: persistent_ptr.hpp:549
persistent_ptr< T > & operator++()
Prefix increment operator.
Definition: persistent_ptr.hpp:297
PMEMobj pool class.
Definition: persistent_ptr.hpp:55
persistent_ptr(const persistent_ptr< Y > &r) noexcept
Copy constructor from a different persistent_ptr<>.
Definition: persistent_ptr.hpp:128
persistent_ptr< T > & operator+=(std::ptrdiff_t s)
Addition assignment operator.
Definition: persistent_ptr.hpp:342
void flush(const void *addr, size_t len) noexcept
Performs flush operation on a given chunk of memory.
Definition: pool.hpp:234
void flush(pool_base &pop)
Flushes what the persistent pointer points to.
Definition: persistent_ptr.hpp:397
bool operator!=(const persistent_ptr< T > &lhs, const persistent_ptr< Y > &rhs) noexcept
Inequality operator.
Definition: persistent_ptr.hpp:468
void persist(const void *addr, size_t len) noexcept
Performs persist operation on a given chunk of memory.
Definition: pool.hpp:198
persistent_ptr & operator=(const persistent_ptr &r)
Assignment operator.
Definition: persistent_ptr.hpp:174
Definition: condition_variable.hpp:48
persistent_ptr & operator=(const persistent_ptr< Y > &r)
Converting assignment operator from a different persistent_ptr<>.
Definition: persistent_ptr.hpp:197
void flush(void)
Flushes what the persistent pointer points to.
Definition: persistent_ptr.hpp:409
void persist(void)
Persists what the persistent pointer points to.
Definition: persistent_ptr.hpp:380
persistent_ptr & operator=(persistent_ptr &&r)
Defaulted move assignment operator.
Definition: persistent_ptr.hpp:155
nvml::detail::sp_array_access< T >::type operator[](std::ptrdiff_t i) const noexcept
Array access operator.
Definition: persistent_ptr.hpp:229
element_type * get() const noexcept
Get a direct pointer.
Definition: persistent_ptr.hpp:246
Custom pool error class.
Definition: pexceptions.hpp:53