38 #ifndef LIBPMEMOBJ_CPP_VECTOR_HPP 39 #define LIBPMEMOBJ_CPP_VECTOR_HPP 50 #include <libpmemobj.h> 62 namespace experimental
74 using size_type = std::size_t;
75 using difference_type = std::ptrdiff_t;
76 using reference = value_type &;
77 using const_reference =
const value_type &;
78 using pointer = value_type *;
79 using const_pointer =
const value_type *;
82 using reverse_iterator = std::reverse_iterator<iterator>;
83 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
87 vector(size_type count,
const value_type &value);
88 explicit vector(size_type count);
89 template <
typename InputIt,
90 typename std::enable_if<
92 std::is_constructible<
94 typename std::iterator_traits<
95 InputIt>::reference>::value,
96 InputIt>::type * =
nullptr>
97 vector(InputIt first, InputIt last);
100 vector(std::initializer_list<T> init);
120 reference
at(size_type n);
121 const_reference
at(size_type n)
const;
122 const_reference
const_at(size_type n)
const;
124 const_reference
operator[](size_type n)
const;
126 const_reference
front()
const;
127 const_reference
cfront()
const;
129 const_reference
back()
const;
130 const_reference
cback()
const;
132 const value_type *
data()
const noexcept;
133 const value_type *
cdata()
const noexcept;
142 reverse_iterator
rbegin();
143 const_reverse_iterator
rbegin()
const noexcept;
144 const_reverse_iterator
crbegin()
const noexcept;
145 reverse_iterator
rend();
146 const_reverse_iterator
rend()
const noexcept;
147 const_reverse_iterator
crend()
const noexcept;
150 constexpr
bool empty()
const noexcept;
151 size_type
size()
const noexcept;
152 constexpr size_type
max_size()
const noexcept;
154 size_type
capacity()
const noexcept;
185 void _grow(size_type count, const_reference value);
186 template <
typename InputIt,
187 typename std::enable_if<
189 std::is_constructible<
191 typename std::iterator_traits<
192 InputIt>::reference>::value,
193 InputIt>::type * =
nullptr>
194 void _grow(InputIt first, InputIt last);
195 void _shrink(size_type size_new) noexcept;
205 template <
typename T>
207 template <
typename T>
209 template <
typename T>
210 bool operator<(const vector<T> &lhs,
const vector<T> &rhs);
211 template <
typename T>
212 bool operator<=(const vector<T> &lhs,
const vector<T> &rhs);
213 template <
typename T>
215 template <
typename T>
226 template <
typename T>
229 auto pop = pmemobj_pool_by_ptr(
this);
233 if (pmemobj_tx_stage() != TX_STAGE_WORK)
235 "Default constructor called out of transaction scope.");
259 template <
typename T>
262 auto pop = pmemobj_pool_by_ptr(
this);
266 if (pmemobj_tx_stage() != TX_STAGE_WORK)
268 "Fill constructor called out of transaction scope.");
292 template <
typename T>
295 auto pop = pmemobj_pool_by_ptr(
this);
299 if (pmemobj_tx_stage() != TX_STAGE_WORK)
301 "Fill constructor called out of transaction scope.");
309 pointer dest = _data.get();
310 const_pointer
end = dest + count;
311 for (; dest !=
end; ++dest)
312 detail::create<value_type>(dest);
337 template <
typename T>
338 template <
typename InputIt,
339 typename std::enable_if<
341 std::is_constructible<
343 typename std::iterator_traits<
344 InputIt>::reference>::value,
348 auto pop = pmemobj_pool_by_ptr(
this);
352 if (pmemobj_tx_stage() != TX_STAGE_WORK)
354 "Range constructor called out of transaction scope.");
358 _alloc(static_cast<size_type>(std::distance(first, last)));
379 template <
typename T>
382 auto pop = pmemobj_pool_by_ptr(
this);
386 if (pmemobj_tx_stage() != TX_STAGE_WORK)
388 "Copy constructor called out of transaction scope.");
414 template <
typename T>
417 auto pop = pmemobj_pool_by_ptr(
this);
421 if (pmemobj_tx_stage() != TX_STAGE_WORK)
423 "Move constructor called out of transaction scope.");
426 _capacity = other.capacity();
427 _size = other.size();
428 other._data =
nullptr;
429 other._capacity = other._size = 0;
448 template <
typename T>
460 template <
typename T>
480 template <
typename T>
481 typename vector<T>::reference
484 assert(pmemobj_tx_stage() == TX_STAGE_WORK);
486 throw std::out_of_range(
"vector::at");
487 detail::conditional_add_to_tx(&_data[n]);
500 template <
typename T>
501 typename vector<T>::const_reference
505 throw std::out_of_range(
"vector::at");
521 template <
typename T>
522 typename vector<T>::const_reference
526 throw std::out_of_range(
"vector::const_at");
543 template <
typename T>
546 assert(pmemobj_tx_stage() == TX_STAGE_WORK);
547 detail::conditional_add_to_tx(&_data[n]);
558 template <
typename T>
574 template <
typename T>
575 typename vector<T>::reference
578 assert(pmemobj_tx_stage() == TX_STAGE_WORK);
579 detail::conditional_add_to_tx(&_data[0]);
588 template <
typename T>
589 typename vector<T>::const_reference
602 template <
typename T>
603 typename vector<T>::const_reference
619 template <
typename T>
620 typename vector<T>::reference
623 assert(pmemobj_tx_stage() == TX_STAGE_WORK);
624 detail::conditional_add_to_tx(&_data[size() - 1]);
625 return _data[size() - 1];
633 template <
typename T>
634 typename vector<T>::const_reference
637 return _data[size() - 1];
647 template <
typename T>
648 typename vector<T>::const_reference
651 return _data[size() - 1];
665 template <
typename T>
666 typename vector<T>::value_type *
669 assert(pmemobj_tx_stage() == TX_STAGE_WORK);
670 detail::conditional_add_to_tx(_data.get(), size());
679 template <
typename T>
680 const typename vector<T>::value_type *
693 template <
typename T>
694 const typename vector<T>::value_type *
707 template <
typename T>
711 assert(pmemobj_tx_stage() == TX_STAGE_WORK);
720 template <
typename T>
734 template <
typename T>
748 template <
typename T>
752 assert(pmemobj_tx_stage() == TX_STAGE_WORK);
753 return iterator(_data.get() +
static_cast<std::ptrdiff_t
>(_size));
761 template <
typename T>
765 return const_iterator(_data.get() +
static_cast<std::ptrdiff_t
>(_size));
775 template <
typename T>
779 return const_iterator(_data.get() +
static_cast<std::ptrdiff_t
>(_size));
789 template <
typename T>
790 typename vector<T>::reverse_iterator
793 assert(pmemobj_tx_stage() == TX_STAGE_WORK);
794 return reverse_iterator(
end());
802 template <
typename T>
803 typename vector<T>::const_reverse_iterator
806 return const_reverse_iterator(
cend());
816 template <
typename T>
817 typename vector<T>::const_reverse_iterator
820 return const_reverse_iterator(
cend());
831 template <
typename T>
832 typename vector<T>::reverse_iterator
835 assert(pmemobj_tx_stage() == TX_STAGE_WORK);
836 return reverse_iterator(
begin());
845 template <
typename T>
846 typename vector<T>::const_reverse_iterator
849 return const_reverse_iterator(
cbegin());
860 template <
typename T>
861 typename vector<T>::const_reverse_iterator
864 return const_reverse_iterator(
cbegin());
872 template <
typename T>
882 template <
typename T>
883 typename vector<T>::size_type
893 template <
typename T>
894 constexpr
typename vector<T>::size_type
897 return PMEMOBJ_MAX_ALLOC_SIZE /
sizeof(value_type);
903 template <
typename T>
904 typename vector<T>::size_type
920 template <
typename T>
924 if (_data ==
nullptr)
927 auto pop = pmemobj_pool_by_ptr(
this);
928 assert(pop !=
nullptr);
932 detail::conditional_add_to_tx(_data.get(), _size);
954 template <
typename T>
958 assert(pmemobj_tx_stage() == TX_STAGE_WORK);
959 assert(_data ==
nullptr);
962 if (capacity_new > max_size())
963 throw std::length_error(
"New capacity exceeds max size.");
965 _capacity = capacity_new;
967 if (capacity_new == 0)
976 pmemobj_tx_alloc(
sizeof(value_type) * capacity_new,
977 detail::type_num<value_type>());
981 "Failed to allocate persistent memory object");
999 template <
typename T>
1003 assert(pmemobj_tx_stage() == TX_STAGE_WORK);
1005 if (_data !=
nullptr) {
1007 if (pmemobj_tx_free(*_data.raw_ptr()) != 0)
1009 "failed to delete persistent memory object");
1033 template <
typename T>
1037 assert(pmemobj_tx_stage() == TX_STAGE_WORK);
1038 assert(_capacity >= count + _size);
1040 pointer dest = _data.get() +
static_cast<size_type
>(_size);
1041 const_pointer
end = dest + count;
1042 for (; dest !=
end; ++dest)
1043 detail::create<value_type, const_reference>(dest, value);
1069 template <
typename T>
1070 template <
typename InputIt,
1071 typename std::enable_if<
1073 std::is_constructible<
1075 typename std::iterator_traits<
1076 InputIt>::reference>::value,
1081 assert(pmemobj_tx_stage() == TX_STAGE_WORK);
1082 difference_type diff = std::distance(first, last);
1084 assert(_capacity >= static_cast<size_type>(diff) + _size);
1086 pointer dest = _data.get() +
static_cast<size_type
>(_size);
1087 _size +=
static_cast<size_type
>(diff);
1088 while (first != last)
1089 detail::create<value_type>(dest++, *first++);
1105 template <
typename T>
1109 assert(pmemobj_tx_stage() == TX_STAGE_WORK);
1110 assert(size_new <= _size);
1112 for (size_type i = size_new; i < _size; ++i)
1113 detail::destroy<value_type>(_data[i]);
1128 template <
typename T>
1147 template <
typename T>
1151 return !(lhs == rhs);
1164 template <
typename T>
1168 return std::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(),
1182 template <
typename T>
1186 return !(rhs < lhs);
1200 template <
typename T>
1217 template <
typename T>
1221 return !(lhs < rhs);
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
Custom transaction error class.
Definition: pexceptions.hpp:84
iterator begin()
Returns an iterator to the beginning.
Definition: vector.hpp:709
bool operator>=(const array< T, N > &lhs, const array< T, N > &rhs)
Non-member greater or equal operator.
Definition: array.hpp:631
constexpr bool empty() const noexcept
Checks whether the container is empty.
Definition: vector.hpp:874
~vector()
Destructor.
Definition: vector.hpp:461
constexpr size_type max_size() const noexcept
Definition: vector.hpp:895
void free_data()
Clears the content of a vector and frees all allocated persitent memory for data in transaction...
Definition: vector.hpp:922
reference at(size_type n)
Access element at specific index with bounds checking and add it to a transaction.
Definition: vector.hpp:482
pmem::obj::experimental::array< T, N >::const_iterator cend(const pmem::obj::experimental::array< T, N > &a)
Non-member cend.
Definition: array.hpp:661
Default non-const iterator which adds element to a transaction on every access.
Definition: contiguous_iterator.hpp:420
const_reverse_iterator crbegin() const noexcept
Returns a const reverse iterator to the beginning.
Definition: vector.hpp:818
void _grow(size_type count, const_reference value)
Private helper function.
Definition: vector.hpp:1035
The non-template pool base class.
Definition: pool.hpp:67
const_reference cback() const
Access the last element.
Definition: vector.hpp:649
void _dealloc()
Private helper function.
Definition: vector.hpp:1001
pmem::obj::experimental::array< T, N >::iterator begin(pmem::obj::experimental::array< T, N > &a)
Non-member begin.
Definition: array.hpp:691
Custom pool error class.
Definition: pexceptions.hpp:53
const_reference cfront() const
Access the first element.
Definition: vector.hpp:604
reverse_iterator rbegin()
Returns a reverse iterator to the beginning.
Definition: vector.hpp:791
vector()
Default constructor.
Definition: vector.hpp:227
reference back()
Access the last element and add this element to a transaction.
Definition: vector.hpp:621
iterator end()
Returns an iterator to past the end.
Definition: vector.hpp:750
C++ pmemobj transactions.
Convenience extensions for the resides on pmem property template.
Functions for destroying arrays.
reference operator[](size_type n)
Access element at specific index and add it to a transaction.
Definition: vector.hpp:544
Commonly used functionality.
Iterators for pmem::obj::array.
value_type * data()
Returns raw pointer to the underlying data and adds entire array to a transaction.
Definition: vector.hpp:667
const value_type * cdata() const noexcept
Returns const raw pointer to the underlying data.
Definition: vector.hpp:695
const_iterator cend() const noexcept
Returns a const iterator to the end.
Definition: vector.hpp:777
pmem::obj::experimental::vector - EXPERIMENTAL persistent container with std::vector compatible inter...
Definition: vector.hpp:70
Custom transaction error class.
Definition: pexceptions.hpp:63
const_reference const_at(size_type n) const
Access element at specific index with bounds checking.
Definition: vector.hpp:523
reverse_iterator rend()
Returns a reverse iterator to the end.
Definition: vector.hpp:833
pmem::obj::experimental::array< T, N >::iterator end(pmem::obj::experimental::array< T, N > &a)
Non-member end.
Definition: array.hpp:701
Const iterator.
Definition: contiguous_iterator.hpp:208
void _alloc(size_type size)
Private helper function.
Definition: vector.hpp:956
Persistent smart pointer.
bool operator>(const array< T, N > &lhs, const array< T, N > &rhs)
Non-member greater than operator.
Definition: array.hpp:621
Iterface to access sequence of objects.
size_type capacity() const noexcept
Definition: vector.hpp:905
const_reverse_iterator crend() const noexcept
Returns a const reverse iterator to the beginning.
Definition: vector.hpp:862
reference front()
Access the first element and add this element to a transaction.
Definition: vector.hpp:576
Custom transaction error class.
Definition: pexceptions.hpp:94
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
pmem::obj::experimental::array< T, N >::const_iterator cbegin(const pmem::obj::experimental::array< T, N > &a)
Non-member cbegin.
Definition: array.hpp:651
Definition: allocator.hpp:48
size_type size() const noexcept
Definition: vector.hpp:884
void _shrink(size_type size_new) noexcept
Private helper function.
Definition: vector.hpp:1107
const_iterator cbegin() const noexcept
Returns const iterator to the beginning.
Definition: vector.hpp:736
Persistent_ptr allocation functions for arrays.
static void run(pool_base &pool, std::function< void()> tx, Locks &... locks)
Execute a closure-like transaction and lock locks.
Definition: transaction.hpp:397