38 #ifndef LIBPMEMOBJ_CPP_PERSISTENT_PTR_HPP 39 #define LIBPMEMOBJ_CPP_PERSISTENT_PTR_HPP 50 #include <libpmemobj.h> 131 template <
typename T>
134 persistent_ptr() =
default;
164 typename pmem::detail::sp_dereference<T>::type
operator*() const
173 typename pmem::detail::sp_member_access<T>::type
operator->() const
186 template <
typename I,
187 typename std::enable_if<std::is_integral<I>::value,
189 typename pmem::detail::sp_array_access<T>::type
operator[](I i)
const 193 (i < pmem::detail::sp_extent<T>::value ||
194 pmem::detail::sp_extent<T>::value == 0) &&
195 "persistent array index out of bounds");
197 return this->
get()[i];
206 detail::conditional_add_to_tx(
this);
207 this->oid.off +=
sizeof(T);
218 PMEMoid noid = this->oid;
230 detail::conditional_add_to_tx(
this);
231 this->oid.off -=
sizeof(T);
242 PMEMoid noid = this->oid;
254 detail::conditional_add_to_tx(
this);
255 this->oid.off +=
static_cast<std::uint64_t
>(s) *
sizeof(T);
266 detail::conditional_add_to_tx(
this);
267 this->oid.off -=
static_cast<std::uint64_t
>(s) *
sizeof(T);
280 pop.
persist(this->
get(),
sizeof(T));
292 pmemobjpool *pop = pmemobj_pool_by_oid(this->
raw());
296 "Cannot get pool from persistent pointer");
298 pmemobj_persist(pop, this->
get(),
sizeof(T));
309 pop.
flush(this->
get(),
sizeof(T));
321 pmemobjpool *pop = pmemobj_pool_by_oid(this->
raw());
325 "Cannot get pool from persistent pointer");
327 pmemobj_flush(pop, this->
get(),
sizeof(T));
412 template <
typename T,
typename Y>
416 return OID_EQUALS(lhs.raw(), rhs.raw());
422 template <
typename T,
typename Y>
426 return !(lhs == rhs);
432 template <
typename T>
436 return lhs.get() ==
nullptr;
442 template <
typename T>
446 return lhs.get() ==
nullptr;
452 template <
typename T>
456 return lhs.get() !=
nullptr;
462 template <
typename T>
466 return lhs.get() !=
nullptr;
476 template <
typename T,
typename Y>
480 if (lhs.raw().pool_uuid_lo == rhs.raw().pool_uuid_lo)
481 return lhs.
raw().off < rhs.raw().off;
483 return lhs.raw().pool_uuid_lo < rhs.raw().pool_uuid_lo;
491 template <
typename T,
typename Y>
503 template <
typename T,
typename Y>
515 template <
typename T,
typename Y>
527 template <
typename T>
529 operator<(persistent_ptr<T>
const &lhs, std::nullptr_t) noexcept
531 return std::less<typename persistent_ptr<T>::element_type *>()(
538 template <
typename T>
540 operator<(std::nullptr_t, persistent_ptr<T>
const &rhs) noexcept
542 return std::less<typename persistent_ptr<T>::element_type *>()(
549 template <
typename T>
551 operator<=(persistent_ptr<T>
const &lhs, std::nullptr_t) noexcept
553 return !(
nullptr < lhs);
559 template <
typename T>
561 operator<=(std::nullptr_t, persistent_ptr<T>
const &rhs) noexcept
563 return !(rhs <
nullptr);
569 template <
typename T>
573 return nullptr < lhs;
579 template <
typename T>
583 return rhs <
nullptr;
589 template <
typename T>
593 return !(lhs <
nullptr);
599 template <
typename T>
603 return !(
nullptr < rhs);
609 template <
typename T>
610 inline persistent_ptr<T>
614 noid.pool_uuid_lo = lhs.raw().pool_uuid_lo;
615 noid.off = lhs.raw().off +
static_cast<std::uint64_t
>(s) *
sizeof(T);
623 template <
typename T>
624 inline persistent_ptr<T>
628 noid.pool_uuid_lo = lhs.raw().pool_uuid_lo;
629 noid.off = lhs.raw().off -
static_cast<std::uint64_t
>(s) *
sizeof(T);
641 template <
typename T,
typename Y,
642 typename =
typename std::enable_if<
643 std::is_same<typename std::remove_cv<T>::type,
644 typename std::remove_cv<Y>::type>::value>>
648 assert(lhs.raw().pool_uuid_lo == rhs.raw().pool_uuid_lo);
649 auto d =
static_cast<std::ptrdiff_t
>(lhs.raw().off - rhs.raw().off);
651 return d /
static_cast<std::ptrdiff_t
>(
sizeof(T));
657 template <
typename T>
659 operator<<(std::ostream &os, persistent_ptr<T>
const &pptr)
661 PMEMoid raw_oid = pptr.raw();
662 os << std::hex <<
"0x" << raw_oid.pool_uuid_lo <<
", 0x" << raw_oid.off
bool operator==(standard_alloc_policy< T > const &, standard_alloc_policy< T2 > const &)
Determines if memory from another allocator can be deallocated from this one.
Definition: allocator.hpp:400
persistent_ptr< T > & operator++()
Prefix increment operator.
Definition: persistent_ptr.hpp:204
Persistent_ptr base class.
Definition: persistent_ptr_base.hpp:68
void persist(void)
Persists what the persistent pointer points to.
Definition: persistent_ptr.hpp:290
Helper template for persistent ptr specialization.
Persistent pointer class.
Definition: common.hpp:72
pmem::detail::sp_array_access< T >::type operator[](I i) const noexcept
Array access operator.
Definition: persistent_ptr.hpp:189
pmem::detail::sp_member_access< T >::type operator->() const noexcept
Member access operator.
Definition: persistent_ptr.hpp:173
The non-template pool base class.
Definition: pool.hpp:67
Custom pool error class.
Definition: pexceptions.hpp:53
persistent_ptr< T > & operator-=(std::ptrdiff_t s)
Subtraction assignment operator.
Definition: persistent_ptr.hpp:264
persistent_ptr(persistent_ptr< const void > const &rhs) noexcept
Explicit const void specialization of the converting constructor.
Definition: persistent_ptr.hpp:148
persistent_ptr< T > operator++(int)
Postfix increment operator.
Definition: persistent_ptr.hpp:216
void persist(pool_base &pop)
Persists the content of the underlying object.
Definition: persistent_ptr.hpp:278
bool bool_type
The used bool_type.
Definition: persistent_ptr.hpp:362
void flush(pool_base &pop)
Flushes what the persistent pointer points to.
Definition: persistent_ptr.hpp:307
PMEMobj pool class.
Definition: persistent_ptr.hpp:59
persistent_ptr< T > operator--(int)
Postfix decrement operator.
Definition: persistent_ptr.hpp:240
persistent_ptr< T > operator+(persistent_ptr< T > const &lhs, std::ptrdiff_t s)
Addition operator for persistent pointers.
Definition: persistent_ptr.hpp:611
Commonly used functionality.
std::random_access_iterator_tag iterator_category
The persistent_ptr iterator category.
Definition: persistent_ptr.hpp:371
persistent_ptr< T > & operator--()
Prefix decrement operator.
Definition: persistent_ptr.hpp:228
persistent_ptr< T > & operator+=(std::ptrdiff_t s)
Addition assignment operator.
Definition: persistent_ptr.hpp:252
void flush(void)
Flushes what the persistent pointer points to.
Definition: persistent_ptr.hpp:319
void persist(const void *addr, size_t len) noexcept
Performs persist operation on a given chunk of memory.
Definition: pool.hpp:284
static persistent_ptr< T > pointer_to(T &ref)
Create a persistent pointer from a given reference.
Definition: persistent_ptr.hpp:343
persistent_ptr< T > operator-(persistent_ptr< T > const &lhs, std::ptrdiff_t s)
Subtraction operator for persistent pointers.
Definition: persistent_ptr.hpp:625
const PMEMoid & raw() const noexcept
Get PMEMoid encapsulated by this object.
Definition: persistent_ptr_base.hpp:304
pmem::detail::sp_dereference< T >::type operator*() const noexcept
Dereference operator.
Definition: persistent_ptr.hpp:164
Resides on pmem class.
Definition: p.hpp:64
bool operator!=(const allocator< T, P, Tr > &lhs, const OtherAllocator &rhs)
Determines if memory from another allocator can be deallocated from this one.
Definition: allocator.hpp:516
T value_type
The type of the value pointed to by the persistent_ptr.
Definition: persistent_ptr.hpp:381
Definition: allocator.hpp:48
void flush(const void *addr, size_t len) noexcept
Performs flush operation on a given chunk of memory.
Definition: pool.hpp:320
Base class for persistent_ptr.
std::ptrdiff_t difference_type
The persistent_ptr difference type.
Definition: persistent_ptr.hpp:376
persistent_ptr(persistent_ptr< void > const &rhs) noexcept
Explicit void specialization of the converting constructor.
Definition: persistent_ptr.hpp:140
T & reference
The reference type of the value pointed to by the persistent_ptr.
Definition: persistent_ptr.hpp:386