31#ifndef ETL_MEMORY_INCLUDED
32#define ETL_MEMORY_INCLUDED
48#if defined(ETL_IN_UNIT_TEST) || ETL_USING_STL
72 template <
typename Iterator>
73 ETL_CONSTEXPR
typename Iterator::pointer
to_address(
const Iterator& itr) ETL_NOEXCEPT
85 template <
typename TOutputIterator,
typename T>
86 TOutputIterator
uninitialized_fill(TOutputIterator o_begin, TOutputIterator o_end,
const T& value)
88 std::uninitialized_fill(o_begin, o_end, value);
99 template <
typename TOutputIterator,
typename T,
typename TCounter>
100 TOutputIterator
uninitialized_fill(TOutputIterator o_begin, TOutputIterator o_end,
const T& value, TCounter& count)
102 count += int32_t(etl::distance(o_begin, o_end));
104 std::uninitialized_fill(o_begin, o_end, value);
114 template <
typename TOutputIterator,
typename T>
118 etl::fill(o_begin, o_end, value);
128 template <
typename TOutputIterator,
typename T>
129 typename etl::enable_if<!etl::is_trivially_constructible<typename etl::iterator_traits<TOutputIterator>::value_type>::value, TOutputIterator>::type
132 typedef typename etl::iterator_traits<TOutputIterator>::value_type
value_type;
134 while (o_begin != o_end)
149 template <
typename TOutputIterator,
typename T,
typename TCounter>
150 typename etl::enable_if<etl::is_trivially_constructible<typename etl::iterator_traits<TOutputIterator>::value_type>::value, TOutputIterator>::type
151 uninitialized_fill(TOutputIterator o_begin, TOutputIterator o_end,
const T& value, TCounter& count)
153 count += int32_t(etl::distance(o_begin, o_end));
155 etl::fill(o_begin, o_end, value);
166 template <
typename TOutputIterator,
typename T,
typename TCounter>
167 typename etl::enable_if<!etl::is_trivially_constructible<typename etl::iterator_traits<TOutputIterator>::value_type>::value, TOutputIterator>::type
168 uninitialized_fill(TOutputIterator o_begin, TOutputIterator o_end,
const T& value, TCounter& count)
170 count += int32_t(etl::distance(o_begin, o_end));
178#if ETL_USING_STL && ETL_USING_CPP11
184 template <
typename TOutputIterator,
typename TSize,
typename T>
187 return std::uninitialized_fill_n(o_begin, n, value);
196 template <
typename TOutputIterator,
typename TSize,
typename T,
typename TCounter>
197 TOutputIterator
uninitialized_fill_n(TOutputIterator o_begin, TSize n,
const T& value, TCounter& count)
201 return std::uninitialized_fill_n(o_begin, n, value);
209 template <
typename TOutputIterator,
typename TSize,
typename T>
221 template <
typename TOutputIterator,
typename TSize,
typename T,
typename TCounter>
236 template <
typename TInputIterator,
typename TOutputIterator>
237 TOutputIterator
uninitialized_copy(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin)
239 return std::uninitialized_copy(i_begin, i_end, o_begin);
248 template <
typename TInputIterator,
typename TOutputIterator,
typename TCounter>
249 TOutputIterator
uninitialized_copy(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin, TCounter& count)
251 count += int32_t(etl::distance(i_begin, i_end));
253 return std::uninitialized_copy(i_begin, i_end, o_begin);
261 template <
typename TInputIterator,
typename TOutputIterator>
263 uninitialized_copy(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin)
265 return etl::copy(i_begin, i_end, o_begin);
273 template <
typename TInputIterator,
typename TOutputIterator>
274 typename etl::enable_if<!etl::is_trivially_constructible<typename etl::iterator_traits<TOutputIterator>::value_type>::value, TOutputIterator>::type
275 uninitialized_copy(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin)
277 typedef typename etl::iterator_traits<TOutputIterator>::value_type
value_type;
279 TOutputIterator o_end = o_begin;
281 while (i_begin != i_end)
297 template <
typename TInputIterator,
typename TOutputIterator,
typename TCounter>
298 typename etl::enable_if<etl::is_trivially_constructible<typename etl::iterator_traits<TOutputIterator>::value_type>::value, TOutputIterator>::type
299 uninitialized_copy(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin, TCounter& count)
301 TOutputIterator o_end = etl::copy(i_begin, i_end, o_begin);
302 count += int32_t(etl::distance(i_begin, i_end));
313 template <
typename TInputIterator,
typename TOutputIterator,
typename TCounter>
314 typename etl::enable_if<!etl::is_trivially_constructible<typename etl::iterator_traits<TOutputIterator>::value_type>::value, TOutputIterator>::type
315 uninitialized_copy(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin, TCounter& count)
319 count += int32_t(etl::distance(i_begin, i_end));
325#if ETL_USING_STL && ETL_USING_CPP11
331 template <
typename TInputIterator,
typename TSize,
typename TOutputIterator>
334 return std::uninitialized_copy_n(i_begin, n, o_begin);
343 template <
typename TInputIterator,
typename TSize,
typename TOutputIterator,
typename TCounter>
344 TOutputIterator
uninitialized_copy_n(TInputIterator i_begin, TSize n, TOutputIterator o_begin, TCounter& count)
348 return std::uninitialized_copy_n(i_begin, n, o_begin);
356 template <
typename TInputIterator,
typename TSize,
typename TOutputIterator>
368 template <
typename TInputIterator,
typename TSize,
typename TOutputIterator,
typename TCounter>
369 TOutputIterator
uninitialized_copy_n(TInputIterator i_begin, TSize n, TOutputIterator o_begin, TCounter& count)
378#if ETL_USING_STL && ETL_USING_CPP17
384 template <
typename TInputIterator,
typename TOutputIterator>
385 TOutputIterator
uninitialized_move(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin)
387 return std::uninitialized_move(i_begin, i_end, o_begin);
396 template <
typename TInputIterator,
typename TOutputIterator,
typename TCounter>
397 TOutputIterator
uninitialized_move(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin, TCounter& count)
399 count += int32_t(etl::distance(i_begin, i_end));
401 return std::uninitialized_move(i_begin, i_end, o_begin);
409 template <
typename TInputIterator,
typename TOutputIterator>
410 typename etl::enable_if<etl::is_trivially_constructible<typename etl::iterator_traits<TOutputIterator>::value_type>::value, TOutputIterator>::type
411 uninitialized_move(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin)
413 return etl::move(i_begin, i_end, o_begin);
421 template <
typename TInputIterator,
typename TOutputIterator>
422 typename etl::enable_if<!etl::is_trivially_constructible<typename etl::iterator_traits<TOutputIterator>::value_type>::value, TOutputIterator>::type
423 uninitialized_move(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin)
425 typedef typename etl::iterator_traits<TOutputIterator>::value_type
value_type;
427 TOutputIterator o_end = o_begin;
429 while (i_begin != i_end)
445 template <
typename TInputIterator,
typename TOutputIterator,
typename TCounter>
446 typename etl::enable_if<etl::is_trivially_constructible<typename etl::iterator_traits<TOutputIterator>::value_type>::value, TOutputIterator>::type
447 uninitialized_move(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin, TCounter& count)
449 TOutputIterator o_end = etl::move(i_begin, i_end, o_begin);
450 count += int32_t(etl::distance(i_begin, i_end));
461 template <
typename TInputIterator,
typename TOutputIterator,
typename TCounter>
462 typename etl::enable_if<!etl::is_trivially_constructible<typename etl::iterator_traits<TOutputIterator>::value_type>::value, TOutputIterator>::type
463 uninitialized_move(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin, TCounter& count)
467 count += int32_t(etl::distance(i_begin, i_end));
479 template <
typename TInputIterator,
typename TOutputIterator>
480 TOutputIterator
uninitialized_move(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin)
483 return ETL_OR_STD::uninitialized_copy(i_begin, i_end, o_begin);
492 template <
typename TInputIterator,
typename TOutputIterator,
typename TCounter>
493 TOutputIterator
uninitialized_move(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin, TCounter& count)
495 count += int32_t(etl::distance(i_begin, i_end));
498 return ETL_OR_STD::uninitialized_copy(i_begin, i_end, o_begin);
503#if ETL_USING_STL && ETL_USING_CPP17
509 template <
typename TInputIterator,
typename TSize,
typename TOutputIterator>
512 return std::uninitialized_move(i_begin, i_begin + n, o_begin);
521 template <
typename TInputIterator,
typename TSize,
typename TOutputIterator,
typename TCounter>
522 TOutputIterator
uninitialized_move_n(TInputIterator i_begin, TSize n, TOutputIterator o_begin, TCounter& count)
524 count += TCounter(n);
526 return std::uninitialized_move(i_begin, i_begin + n, o_begin);
534 template <
typename TInputIterator,
typename TSize,
typename TOutputIterator>
535 typename etl::enable_if<etl::is_trivially_constructible<typename etl::iterator_traits<TOutputIterator>::value_type>::value, TOutputIterator>::type
538 return etl::move(i_begin, i_begin + n, o_begin);
546 template <
typename TInputIterator,
typename TSize,
typename TOutputIterator>
547 typename etl::enable_if<!etl::is_trivially_constructible<typename etl::iterator_traits<TOutputIterator>::value_type>::value, TOutputIterator>::type
550 typedef typename etl::iterator_traits<TOutputIterator>::value_type
value_type;
552 TOutputIterator o_end = o_begin;
570 template <
typename TInputIterator,
typename TSize,
typename TOutputIterator,
typename TCounter>
571 typename etl::enable_if<etl::is_trivially_constructible<typename etl::iterator_traits<TOutputIterator>::value_type>::value, TOutputIterator>::type
574 TOutputIterator o_end = etl::move(i_begin, i_begin + n, o_begin);
575 count += TCounter(n);
586 template <
typename TInputIterator,
typename TSize,
typename TOutputIterator,
typename TCounter>
587 typename etl::enable_if<!etl::is_trivially_constructible<typename etl::iterator_traits<TOutputIterator>::value_type>::value, TOutputIterator>::type
592 count += TCounter(n);
604 template <
typename TInputIterator,
typename TSize,
typename TOutputIterator>
609 return std::uninitialized_copy_n(i_begin, n, o_begin);
621 template <
typename TInputIterator,
typename TSize,
typename TOutputIterator,
typename TCounter>
622 TOutputIterator
uninitialized_move_n(TInputIterator i_begin, TSize n, TOutputIterator o_begin, TCounter& count)
624 count += TCounter(n);
628 return std::uninitialized_copy_n(i_begin, n, o_begin);
635#if ETL_USING_STL && ETL_USING_CPP17
641 template <
typename TOutputIterator>
645 std::uninitialized_default_construct(o_begin, o_end);
654 template <
typename TOutputIterator,
typename TCounter>
655 typename etl::enable_if<etl::is_trivially_constructible<typename etl::iterator_traits<TOutputIterator>::value_type>::value,
void>::type
658 count = int32_t(etl::distance(o_begin, o_end));
660 std::uninitialized_default_construct(o_begin, o_end);
668 template <
typename TOutputIterator>
669 typename etl::enable_if<etl::is_trivially_constructible<typename etl::iterator_traits<TOutputIterator>::value_type>::value,
void>::type
680 template <
typename TOutputIterator>
685 typedef typename etl::iterator_traits<TOutputIterator>::value_type
value_type;
687 while (o_begin != o_end)
700 template <
typename TOutputIterator,
typename TCounter>
704 count = int32_t(etl::distance(o_begin, o_end));
713 template <
typename TOutputIterator,
typename TCounter>
717 count += int32_t(etl::distance(o_begin, o_end));
723#if ETL_USING_STL && ETL_USING_CPP17
729 template <
typename TOutputIterator,
typename TSize>
732 return std::uninitialized_default_construct_n(o_begin, n);
741 template <
typename TOutputIterator,
typename TSize,
typename TCounter>
746 return std::uninitialized_default_construct_n(o_begin, n);
754 template <
typename TOutputIterator,
typename TSize>
755 typename etl::enable_if<etl::is_trivially_constructible<typename etl::iterator_traits<TOutputIterator>::value_type>::value, TOutputIterator>::type
758 TOutputIterator o_end = o_begin + n;
767 template <
typename TOutputIterator,
typename TSize>
771 TOutputIterator o_end = o_begin + n;
784 template <
typename TOutputIterator,
typename TSize,
typename TCounter>
788 TOutputIterator o_end = o_begin + n;
801 template <
typename TOutputIterator,
typename TSize,
typename TCounter>
805 TOutputIterator o_end = o_begin + n;
815#if ETL_USING_STL && ETL_USING_CPP17
821 template <
typename TOutputIterator>
824 std::uninitialized_value_construct(o_begin, o_end);
833 template <
typename TOutputIterator,
typename TCounter>
836 count += int32_t(etl::distance(o_begin, o_end));
838 std::uninitialized_value_construct(o_begin, o_end);
846 template <
typename TOutputIterator>
847 typename etl::enable_if<etl::is_trivially_constructible<typename etl::iterator_traits<TOutputIterator>::value_type>::value,
void>::type
850 typedef typename etl::iterator_traits<TOutputIterator>::value_type
value_type;
860 template <
typename TOutputIterator>
864 typedef typename etl::iterator_traits<TOutputIterator>::value_type
value_type;
866 while (o_begin != o_end)
879 template <
typename TOutputIterator,
typename TCounter>
882 count += int32_t(etl::distance(o_begin, o_end));
888#if ETL_USING_STL && ETL_USING_CPP17
894 template <
typename TOutputIterator,
typename TSize>
897 return std::uninitialized_value_construct_n(o_begin, n);
906 template <
typename TOutputIterator,
typename TSize,
typename TCounter>
911 return std::uninitialized_value_construct_n(o_begin, n);
919 template <
typename TOutputIterator,
typename TSize>
922 TOutputIterator o_end = o_begin + n;
935 template <
typename TOutputIterator,
typename TSize,
typename TCounter>
938 TOutputIterator o_end = o_begin + n;
948#if ETL_USING_STL && ETL_USING_CPP20
954 template <
typename T,
typename... TArgs>
957 return std::construct_at(p, etl::forward<TArgs>(args)...);
965 template <
typename T,
typename... TArgs>
968 return ::new (
const_cast<void*
>(
static_cast<const volatile void*
>(p))) T(etl::forward<TArgs>(args)...);
976 template <
typename T>
979 return ::new (
const_cast<void*
>(
static_cast<const volatile void*
>(p))) T();
986 template <
typename T,
typename TArg>
989 return ::new (
const_cast<void*
>(
static_cast<const volatile void*
>(p))) T(arg);
993#if ETL_USING_STL && ETL_USING_CPP20
999 template <
typename T>
1012 template <
typename T,
typename TCounter>
1025 template <
typename T>
1026 typename etl::enable_if<etl::is_trivially_destructible<T>::value,
void>::type
1036 template <
typename T>
1049 template <
typename T,
typename TCounter>
1062 template <
typename T,
typename TCounter>
1071#if ETL_USING_STL && ETL_USING_CPP17
1077 template <
typename TIterator>
1078 void destroy(TIterator i_begin, TIterator i_end)
1080 std::destroy(i_begin, i_end);
1089 template <
typename TIterator,
typename TCounter>
1090 void destroy(TIterator i_begin, TIterator i_end, TCounter& count)
1092 count -= int32_t(etl::distance(i_begin, i_end));
1094 std::destroy(i_begin, i_end);
1102 template <
typename TIterator>
1103 typename etl::enable_if<etl::is_trivially_destructible<typename etl::iterator_traits<TIterator>::value_type>::value,
void>::type
1113 template <
typename TIterator>
1117 while (i_begin != i_end)
1130 template <
typename TIterator,
typename TCounter>
1132 destroy(TIterator i_begin, TIterator i_end, TCounter& count)
1134 count -= int32_t(etl::distance(i_begin, i_end));
1143 template <
typename TIterator,
typename TCounter>
1145 destroy(TIterator i_begin, TIterator i_end, TCounter& count)
1147 count -= int32_t(etl::distance(i_begin, i_end));
1149 while (i_begin != i_end)
1157#if ETL_USING_STL && ETL_USING_CPP17
1163 template <
typename TIterator,
typename TSize>
1164 TIterator
destroy_n(TIterator i_begin, TSize n)
1166 return std::destroy_n(i_begin, n);
1175 template <
typename TIterator,
typename TSize,
typename TCounter>
1176 TIterator
destroy_n(TIterator i_begin, TSize n, TCounter& count)
1180 return std::destroy_n(i_begin, n);
1188 template <
typename TIterator,
typename TSize>
1189 typename etl::enable_if<etl::is_trivially_destructible<typename etl::iterator_traits<TIterator>::value_type>::value, TIterator>::type
1200 template <
typename TIterator,
typename TSize>
1220 template <
typename TIterator,
typename TSize,
typename TCounter>
1234 template <
typename TIterator,
typename TSize,
typename TCounter>
1257 template <
typename T>
1258 struct default_delete
1261 ETL_CONSTEXPR default_delete() ETL_NOEXCEPT
1266 template <
typename U>
1267 default_delete(
const default_delete<U>&) ETL_NOEXCEPT
1272 void operator()(T * p)
const ETL_NOEXCEPT
1284 template <
typename T>
1285 struct default_delete<T[]>
1288 ETL_CONSTEXPR default_delete() ETL_NOEXCEPT
1293 template <
typename U>
1294 default_delete(
const default_delete<U>&) ETL_NOEXCEPT
1300 void operator()(U* p)
const
1312 template <
typename T,
typename TDeleter = etl::default_delete<T> >
1317 typedef T element_type;
1319 typedef T& reference;
1322 ETL_CONSTEXPR unique_ptr() ETL_NOEXCEPT
1328 ETL_CONSTEXPR
explicit unique_ptr(pointer p_) ETL_NOEXCEPT
1335 unique_ptr(unique_ptr&& other) ETL_NOEXCEPT
1339 p = other.release();
1340 deleter = etl::move(other.deleter);
1345 unique_ptr(unique_ptr& other) ETL_NOEXCEPT
1349 p = other.release();
1350 deleter = other.deleter;
1366 unique_ptr(pointer p_,
typename etl::remove_reference<TDeleter>::type&& deleter_) ETL_NOEXCEPT
1368 , deleter(etl::move(deleter_))
1372 template <
typename U,
typename E>
1373 unique_ptr(unique_ptr<U, E>&& u) ETL_NOEXCEPT
1375 , deleter(etl::forward<E>(u.get_deleter()))
1383 if (p != ETL_NULLPTR)
1390 ETL_CONSTEXPR pointer get()
const ETL_NOEXCEPT
1396 TDeleter& get_deleter() ETL_NOEXCEPT
1402 const TDeleter& get_deleter()
const ETL_NOEXCEPT
1408 pointer release() ETL_NOEXCEPT
1417 void reset(pointer p_ = pointer()) ETL_NOEXCEPT
1419 if (p_ == ETL_NULLPTR || p_ != p)
1424 if (value != ETL_NULLPTR)
1432 void swap(unique_ptr& value) ETL_NOEXCEPT
1434 using ETL_OR_STD::swap;
1440 ETL_CONSTEXPR
operator bool()
const ETL_NOEXCEPT
1442 return (p != ETL_NULLPTR);
1458 unique_ptr& operator =(unique_ptr&& other) ETL_NOEXCEPT
1462 reset(other.release());
1463 deleter = etl::move(other.deleter);
1470 unique_ptr& operator =(unique_ptr& other) ETL_NOEXCEPT
1474 reset(other.release());
1475 deleter = other.deleter;
1483 ETL_CONSTEXPR reference operator *()
const
1489 ETL_CONSTEXPR pointer operator ->()
const ETL_NOEXCEPT
1495 ETL_CONSTEXPR reference operator [](
size_t i)
const
1503 unique_ptr(
const unique_ptr&) ETL_DELETE;
1504 unique_ptr& operator =(
const unique_ptr&) ETL_DELETE;
1516 template<
typename T,
typename TDeleter>
1517 class unique_ptr<T[], TDeleter>
1521 typedef T element_type;
1523 typedef T& reference;
1526 ETL_CONSTEXPR unique_ptr() ETL_NOEXCEPT
1532 ETL_CONSTEXPR
explicit unique_ptr(pointer p_) ETL_NOEXCEPT
1539 unique_ptr(unique_ptr&& other) ETL_NOEXCEPT
1543 p = other.release();
1544 deleter = etl::move(other.deleter);
1549 unique_ptr(unique_ptr& other) ETL_NOEXCEPT
1553 p = other.release();
1554 deleter = other.deleter;
1560 unique_ptr(pointer p_,
1571 unique_ptr(pointer p_,
typename etl::remove_reference<TDeleter>::type&& deleter_) ETL_NOEXCEPT
1573 , deleter(etl::move(deleter_))
1577 template <
typename U,
typename E>
1578 unique_ptr(unique_ptr<U, E>&& u) ETL_NOEXCEPT
1580 , deleter(etl::forward<E>(u.get_deleter()))
1588 if (p != ETL_NULLPTR)
1595 ETL_CONSTEXPR pointer get()
const ETL_NOEXCEPT
1601 TDeleter& get_deleter() ETL_NOEXCEPT
1607 const TDeleter& get_deleter()
const ETL_NOEXCEPT
1613 pointer release() ETL_NOEXCEPT
1621 void reset(pointer p_) ETL_NOEXCEPT
1628 if (value != ETL_NULLPTR)
1641 void swap(unique_ptr& v) ETL_NOEXCEPT
1643 using ETL_OR_STD::swap;
1649 ETL_CONSTEXPR
operator bool()
const ETL_NOEXCEPT
1651 return (p != ETL_NULLPTR);
1664 unique_ptr& operator =(unique_ptr&& other) ETL_NOEXCEPT
1668 reset(other.release());
1669 deleter = etl::move(other.deleter);
1676 unique_ptr& operator =(unique_ptr& other) ETL_NOEXCEPT
1680 reset(other.release());
1681 deleter = other.deleter;
1689 ETL_CONSTEXPR reference operator *()
const
1695 ETL_CONSTEXPR pointer operator ->()
const ETL_NOEXCEPT
1701 ETL_CONSTEXPR reference operator [](
size_t i)
const
1709 unique_ptr(
const unique_ptr&) ETL_DELETE;
1710 unique_ptr& operator =(
const unique_ptr&) ETL_DELETE;
1720template<
typename T1,
typename TD1,
typename T2,
typename TD2>
1723 return lhs.get() == rhs.get();
1727template<
typename T1,
typename TD1,
typename T2,
typename TD2>
1730 return reinterpret_cast<char*
>(lhs.get()) <
reinterpret_cast<char*
>(rhs.get());
1734template<
typename T1,
typename TD1,
typename T2,
typename TD2>
1737 return !(rhs < lhs);
1741template<
typename T1,
typename TD1,
typename T2,
typename TD2>
1748template<
typename T1,
typename TD1,
typename T2,
typename TD2>
1751 return !(lhs < rhs);
1760 template <
typename T>
1761 typename etl::enable_if<etl::is_trivially_constructible<T>::value,
void>::type
1770 template <
typename T,
typename TCounter>
1781 template <
typename T>
1792 template <
typename T,
typename TCounter>
1804 template <
typename T>
1814 template <
typename T,
typename TCounter>
1825 template <
typename T>
1836 template <
typename T>
1839 ::new (p) T(etl::move(value));
1847 template <
typename T,
typename TCounter>
1858 template <
typename T>
1862 return *
reinterpret_cast<T*
>(p);
1869 template <
typename T,
typename TCounter>
1874 return *
reinterpret_cast<T*
>(p);
1881 template <
typename T>
1885 return *
reinterpret_cast<T*
>(p);
1893 template <
typename T>
1896 ::new (p) T(etl::move(other));
1897 return *
reinterpret_cast<T*
>(p);
1905 template <
typename T,
typename TCounter>
1910 return *
reinterpret_cast<T*
>(p);
1917 template <
typename T,
typename TParameter>
1921 return *
reinterpret_cast<T*
>(p);
1929 template <
typename T,
typename TParameter>
1932 ::new (p) T(etl::move(value));
1933 return *
reinterpret_cast<T*
>(p);
1941 template <
typename T,
typename TParameter,
typename TCounter>
1946 return *
reinterpret_cast<T*
>(p);
1954 template <
typename T>
1957 void create_copy_at(
void* p)
1959 new (p) T(
static_cast<const T&
>(*
this));
1962 template <
typename TCounter>
1963 void create_copy_at(
void* p, TCounter& count)
1965 new (p) T(
static_cast<const T&
>(*
this));
1969 T& make_copy_at(
void* p)
1971 new (p) T(
static_cast<const T&
>(*
this));
1972 return *
reinterpret_cast<T*
>(p);
1975 template <
typename TCounter>
1976 T& make_copy_at(
void* p, TCounter& count)
1978 new (p) T(
static_cast<const T&
>(*
this));
1980 return *
reinterpret_cast<T*
>(p);
2004 template <
typename T>
2007 memory_clear(
reinterpret_cast<volatile char*
>(&
object),
sizeof(T));
2017 template <
typename T>
2030 template <
typename T>
2033 const size_t n =
static_cast<size_t>(etl::distance(
begin,
end));
2060 template <
typename T>
2063 memory_set(
reinterpret_cast<volatile char*
>(&
object),
sizeof(T), value);
2074 template <
typename T>
2077 memory_set(
reinterpret_cast<volatile char*
>(
begin), n *
sizeof(T), value);
2088 template <
typename T>
2091 const size_t n =
static_cast<size_t>(etl::distance(
begin,
end));
2103 template <
typename T>
2116 template <
size_t VObject_Size,
size_t VN_Objects,
size_t VAlignment>
2121 static ETL_CONSTANT
size_t Object_Size = VObject_Size;
2122 static ETL_CONSTANT
size_t N_Objects = VN_Objects;
2123 static ETL_CONSTANT
size_t Alignment = VAlignment;
2126 template <
typename T>
2130 return *
reinterpret_cast<T*
>(raw);
2134 template <
typename T>
2135 operator const T& ()
const
2138 return *
reinterpret_cast<const T*
>(raw);
2142 template <
typename T>
2146 return reinterpret_cast<T*
>(raw);
2150 template <
typename T>
2151 operator const T* ()
const
2154 return reinterpret_cast<const T*
>(raw);
2157#if ETL_USING_CPP11 && !defined(ETL_COMPILER_ARM5) && !defined(ETL_UNINITIALIZED_BUFFER_FORCE_CPP03_IMPLEMENTATION)
2158 alignas(VAlignment)
char raw[Object_Size * N_Objects];
2162 char raw[VObject_Size * VN_Objects];
2163 typename etl::type_with_alignment<Alignment>::type etl_alignment_type;
2168 template <
size_t VObject_Size,
size_t VN_Objects,
size_t VAlignment>
2169 ETL_CONSTANT
size_t uninitialized_buffer<VObject_Size, VN_Objects, VAlignment>::Object_Size;
2171 template <
size_t VObject_Size,
size_t VN_Objects,
size_t VAlignment>
2172 ETL_CONSTANT
size_t uninitialized_buffer<VObject_Size, VN_Objects, VAlignment>::N_Objects;
2174 template <
size_t VObject_Size,
size_t VN_Objects,
size_t VAlignment>
2175 ETL_CONSTANT
size_t uninitialized_buffer<VObject_Size, VN_Objects, VAlignment>::Alignment;
2181 template <
typename T,
size_t VN_Objects>
2186 typedef T value_type;
2187 typedef T& reference;
2188 typedef const T& const_reference;
2190 typedef const T* const_pointer;
2191 typedef T* iterator;
2192 typedef const T* const_iterator;
2194 static ETL_CONSTANT
size_t Object_Size =
sizeof(T);
2195 static ETL_CONSTANT
size_t N_Objects = VN_Objects;
2201 return reinterpret_cast<T*
>(this->raw)[i];
2207 return reinterpret_cast<const T*
>(this->raw)[i];
2213 return *
reinterpret_cast<T*
>(raw);
2217 operator const T& ()
const
2219 return *
reinterpret_cast<const T*
>(raw);
2226 return reinterpret_cast<T*
>(raw);
2230 operator const T* ()
const
2232 return reinterpret_cast<const T*
>(raw);
2237 return reinterpret_cast<T*
>(raw);
2240 const T* begin()
const
2242 return reinterpret_cast<const T*
>(raw);
2247 return reinterpret_cast<T*
>(raw + (
sizeof(T) * N_Objects));
2250 const T* end()
const
2252 return reinterpret_cast<const T*
>(raw + (
sizeof(T) * N_Objects));
2255#if ETL_USING_CPP11 && !defined(ETL_COMPILER_ARM5) && !defined(ETL_UNINITIALIZED_BUFFER_FORCE_CPP03_IMPLEMENTATION)
2256 alignas(Alignment)
char raw[
sizeof(T) * N_Objects];
2260 char raw[
sizeof(T) * N_Objects];
2261 typename etl::type_with_alignment<Alignment>::type etl_alignment_type;
2266 template <
typename T,
size_t VN_Objects>
2267 ETL_CONSTANT
size_t uninitialized_buffer_of<T, VN_Objects>::Object_Size;
2269 template <
typename T,
size_t VN_Objects>
2270 ETL_CONSTANT
size_t uninitialized_buffer_of<T, VN_Objects>::N_Objects;
2272 template <
typename T,
size_t VN_Objects>
2273 ETL_CONSTANT
size_t uninitialized_buffer_of<T, VN_Objects>::Alignment;
2276 template <
typename T,
size_t N_Objects>
2288 template <
typename T>
2289 T*
mem_copy(
const T* sb,
const T* se, T* db) ETL_NOEXCEPT
2291 ETL_STATIC_ASSERT(etl::is_trivially_copyable<T>::value,
"Cannot mem_copy a non trivially copyable type");
2293#if ETL_USING_BUILTIN_MEMCPY
2294 __builtin_memcpy(
reinterpret_cast<void*
>(db),
2295 reinterpret_cast<const void*
>(sb),
2296 sizeof(T) *
static_cast<size_t>(se - sb));
2298 ::memcpy(
reinterpret_cast<void*
>(db),
2299 reinterpret_cast<const void*
>(sb),
2300 sizeof(T) *
static_cast<size_t>(se - sb));
2313 template <
typename T>
2316 ETL_STATIC_ASSERT(etl::is_trivially_copyable<T>::value,
"Cannot mem_copy a non trivially copyable type");
2318#if ETL_USING_BUILTIN_MEMCPY
2319 __builtin_memcpy(
reinterpret_cast<void*
>(db),
2320 reinterpret_cast<const void*
>(sb),
2323 ::memcpy(
reinterpret_cast<void*
>(db),
2324 reinterpret_cast<const void*
>(sb),
2338 template <
typename T>
2339 T*
mem_move(
const T* sb,
const T* se, T* db) ETL_NOEXCEPT
2341 ETL_STATIC_ASSERT(etl::is_trivially_copyable<T>::value,
"Cannot mem_move a non trivially copyable type");
2343#if ETL_USING_BUILTIN_MEMMOVE
2344 __builtin_memmove(
reinterpret_cast<void*
>(db),
2345 reinterpret_cast<const void*
>(sb),
2346 sizeof(T) *
static_cast<size_t>(se - sb));
2348 ::memmove(
reinterpret_cast<void*
>(db),
2349 reinterpret_cast<const void*
>(sb),
2350 sizeof(T) *
static_cast<size_t>(se - sb));
2363 template <
typename T>
2366 ETL_STATIC_ASSERT(etl::is_trivially_copyable<T>::value,
"Cannot mem_move a non trivially copyable type");
2368#if ETL_USING_BUILTIN_MEMMOVE
2369 __builtin_memmove(
reinterpret_cast<void*
>(db),
2370 reinterpret_cast<const void*
>(sb),
2373 ::memmove(
reinterpret_cast<void*
>(db),
2374 reinterpret_cast<const void*
>(sb),
2390 template <
typename T>
2394 ETL_STATIC_ASSERT(etl::is_trivially_copyable<T>::value,
"Cannot mem_compare a non trivially copyable type");
2396#if ETL_USING_BUILTIN_MEMCMP
2397 return __builtin_memcmp(
reinterpret_cast<const void*
>(db),
2398 reinterpret_cast<const void*
>(sb),
2399 sizeof(T) *
static_cast<size_t>(se - sb));
2401 return ::memcmp(
reinterpret_cast<const void*
>(db),
2402 reinterpret_cast<const void*
>(sb),
2403 sizeof(T) *
static_cast<size_t>(se - sb));
2416 template <
typename T>
2420 ETL_STATIC_ASSERT(etl::is_trivially_copyable<T>::value,
"Cannot mem_compare a non trivially copyable type");
2422#if ETL_USING_BUILTIN_MEMCMP
2423 return __builtin_memcmp(
reinterpret_cast<const void*
>(db),
2424 reinterpret_cast<const void*
>(sb),
2427 return ::memcmp(
reinterpret_cast<const void*
>(db),
2428 reinterpret_cast<const void*
>(sb),
2440 template <
typename TPo
inter,
typename T>
2442 !etl::is_const<TPointer>::value &&
2443 etl::is_integral<T>::value &&
2444 sizeof(T) == 1, TPointer>::type
2445 mem_set(TPointer db,
const TPointer de, T value) ETL_NOEXCEPT
2447 ETL_STATIC_ASSERT(
etl::is_trivially_copyable<
typename etl::iterator_traits<TPointer>::value_type>::value,
"Cannot mem_set a non trivially copyable type");
2449#if ETL_USING_BUILTIN_MEMSET
2450 __builtin_memset(
reinterpret_cast<void*
>(db),
2451 static_cast<char>(value),
2452 sizeof(
typename etl::iterator_traits<TPointer>::value_type) *
static_cast<size_t>(de - db));
2454 ::memset(
reinterpret_cast<void*
>(db),
2455 static_cast<char>(value),
2456 sizeof(
typename etl::iterator_traits<TPointer>::value_type) *
static_cast<size_t>(de - db));
2469 template <
typename TPo
inter,
typename T>
2471 !etl::is_const<TPointer>::value &&
2472 etl::is_integral<T>::value &&
2473 sizeof(T) == 1, TPointer>::type
2474 mem_set(TPointer db,
size_t n, T value) ETL_NOEXCEPT
2476 ETL_STATIC_ASSERT(
etl::is_trivially_copyable<
typename etl::iterator_traits<TPointer>::value_type>::value,
"Cannot mem_set a non trivially copyable type");
2478#if ETL_USING_BUILTIN_MEMSET
2479 __builtin_memset(
reinterpret_cast<void*
>(db),
2480 static_cast<char>(value),
2481 sizeof(
typename etl::iterator_traits<TPointer>::value_type) * n);
2483 ::memset(
reinterpret_cast<void*
>(db),
2484 static_cast<char>(value),
2485 sizeof(
typename etl::iterator_traits<TPointer>::value_type) * n);
2498 template <
typename TPo
inter,
typename T>
2502 etl::is_integral<T>::value &&
2503 sizeof(T) == 1,
char*>::type
2504 mem_char(TPointer sb, TPointer se, T value) ETL_NOEXCEPT
2506#if ETL_USING_BUILTIN_MEMCHR
2507 void* result = __builtin_memchr(
reinterpret_cast<void*
>(sb),
2508 static_cast<char>(value),
2509 sizeof(
typename etl::iterator_traits<TPointer>::value_type) *
static_cast<size_t>(se - sb));
2511 return (result == 0U) ?
reinterpret_cast<char*
>(se) :
reinterpret_cast<char*
>(result);
2513 void* result = ::memchr(
reinterpret_cast<void*
>(sb),
2514 static_cast<char>(value),
2515 sizeof(
typename etl::iterator_traits<TPointer>::value_type) *
static_cast<size_t>(se - sb));
2517 return (result == 0U) ?
reinterpret_cast<char*
>(se) :
reinterpret_cast<char*
>(result);
2528 template <
typename TPo
inter,
typename T>
2532 etl::is_integral<T>::value &&
2533 sizeof(T) == 1,
const char*>::type
2534 mem_char(TPointer sb, TPointer se, T value) ETL_NOEXCEPT
2536#if ETL_USING_BUILTIN_MEMCHR
2537 const void* result = __builtin_memchr(
reinterpret_cast<const void*
>(sb),
2538 static_cast<char>(value),
2539 sizeof(
typename etl::iterator_traits<TPointer>::value_type) *
static_cast<size_t>(se - sb));
2541 return (result == 0U) ?
reinterpret_cast<const char*
>(se) :
reinterpret_cast<const char*
>(result);
2543 const void* result = ::memchr(
reinterpret_cast<const void*
>(sb),
2544 static_cast<char>(value),
2545 sizeof(
typename etl::iterator_traits<TPointer>::value_type) *
static_cast<size_t>(se - sb));
2547 return (result == 0U) ?
reinterpret_cast<const char*
>(se) :
reinterpret_cast<const char*
>(result);
2558 template <
typename TPo
inter,
typename T>
2562 etl::is_integral<T>::value &&
2563 sizeof(T) == 1,
char*>::type
2566#if ETL_USING_BUILTIN_MEMCHR
2567 void* result = __builtin_memchr(
reinterpret_cast<void*
>(sb),
2568 static_cast<char>(value),
2569 sizeof(
typename etl::iterator_traits<TPointer>::value_type) * n);
2571 return (result == 0U) ?
reinterpret_cast<char*
>(sb + n) :
reinterpret_cast<char*
>(result);
2573 void* result = ::memchr(
reinterpret_cast<void*
>(sb),
2574 static_cast<char>(value),
2575 sizeof(
typename etl::iterator_traits<TPointer>::value_type) * n);
2577 return (result == 0U) ?
reinterpret_cast<char*
>(sb + n) :
reinterpret_cast<char*
>(result);
2588 template <
typename TPo
inter,
typename T>
2592 etl::is_integral<T>::value &&
2593 sizeof(T) == 1,
const char*>::type
2596#if ETL_USING_BUILTIN_MEMCHR
2597 const void* result = __builtin_memchr(
reinterpret_cast<const void*
>(sb),
2598 static_cast<char>(value),
2599 sizeof(
typename etl::iterator_traits<TPointer>::value_type) * n);
2601 return (result == 0U) ?
reinterpret_cast<const char*
>(sb + n) :
reinterpret_cast<const char*
>(result);
2603 const void* result = ::memchr(
reinterpret_cast<const void*
>(sb),
2604 static_cast<char>(value),
2605 sizeof(
typename etl::iterator_traits<TPointer>::value_type) * n);
2607 return (result == 0U) ?
reinterpret_cast<const char*
>(sb + n) :
reinterpret_cast<const char*
>(result);
2617 template <
typename TObject>
2620#if ETL_IS_DEBUG_BUILD
2624 return *
etl::construct_at(
reinterpret_cast<typename etl::remove_reference<TObject>::type*
>(p), etl::forward<TObject>(other));
2630 template <
typename TObject,
typename... TArgs>
2633#if ETL_IS_DEBUG_BUILD
2637 return *
etl::construct_at(
reinterpret_cast<TObject*
>(p), etl::forward<TArgs>(args)...);
2643 template <
typename TObject>
2646#if ETL_IS_DEBUG_BUILD
2656 template <
typename TObject>
2659#if ETL_IS_DEBUG_BUILD
2669 template <
typename TObject,
typename TArg>
2672#if ETL_IS_DEBUG_BUILD
2683 template <
typename TObject>
2686#if ETL_IS_DEBUG_BUILD
2690 return *
reinterpret_cast<TObject*
>(p);
2696 template <
typename TObject>
2699#if ETL_IS_DEBUG_BUILD
2703 return *
reinterpret_cast<const TObject*
>(p);
2710 template <
typename TObject>
2713#if ETL_IS_DEBUG_BUILD
Memory misalignment exception.
Definition alignment.h:67
T & operator[](int i)
Index operator.
Definition memory.h:2199
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
TOutputIterator uninitialized_fill(TOutputIterator o_begin, TOutputIterator o_end, const T &value)
Definition memory.h:86
etl::enable_if< etl::is_trivially_constructible< typenameetl::iterator_traits< TOutputIterator >::value_type >::value, void >::type uninitialized_value_construct(TOutputIterator o_begin, TOutputIterator o_end)
Definition memory.h:848
void memory_set_range(volatile T *begin, size_t n, const char value)
Definition memory.h:2075
TOutputIterator uninitialized_value_construct_n(TOutputIterator o_begin, TSize n)
Definition memory.h:920
etl::enable_if< etl::is_trivially_constructible< T >::value, void >::type create_default_at(T *)
Definition memory.h:1762
etl::enable_if< etl::is_trivially_constructible< typenameetl::iterator_traits< TOutputIterator >::value_type >::value, TOutputIterator >::type uninitialized_default_construct_n(TOutputIterator o_begin, TSize n)
Definition memory.h:756
T * construct_at(T *p)
Definition memory.h:977
void create_copy_at(T *p, const T &value)
Definition memory.h:1826
void create_value_at(T *p)
Definition memory.h:1805
T & make_value_at(T *p, const TParameter &value)
Definition memory.h:1918
etl::enable_if< etl::is_trivially_destructible< T >::value, void >::type destroy_at(T *)
Definition memory.h:1027
void memory_clear_range(volatile T *begin, size_t n)
Definition memory.h:2018
void memory_set(volatile char *p, size_t n, char value)
Definition memory.h:2045
TOutputIterator uninitialized_move_n(TInputIterator i_begin, TSize n, TOutputIterator o_begin)
Definition memory.h:605
TOutputIterator uninitialized_copy_n(TInputIterator i_begin, TSize n, TOutputIterator o_begin)
Definition memory.h:357
etl::enable_if< etl::is_trivially_destructible< typenameetl::iterator_traits< TIterator >::value_type >::value, TIterator >::type destroy_n(TIterator i_begin, TSize n)
Definition memory.h:1190
T & make_default_at(T *p)
Definition memory.h:1859
TOutputIterator uninitialized_move(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin)
Definition memory.h:480
T & make_copy_at(T *p, const T &other)
Definition memory.h:1882
void memory_clear(volatile char *p, size_t n)
Definition memory.h:1990
TOutputIterator uninitialized_copy(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin)
Definition memory.h:237
etl::enable_if< etl::is_trivially_constructible< typenameetl::iterator_traits< TOutputIterator >::value_type >::value, void >::type uninitialized_default_construct(TOutputIterator, TOutputIterator)
Definition memory.h:670
TOutputIterator uninitialized_fill_n(TOutputIterator o_begin, TSize n, const T &value)
Definition memory.h:210
add_rvalue_reference
Definition type_traits_generator.h:1413
conditional
Definition type_traits_generator.h:1223
enable_if
Definition type_traits_generator.h:1254
is_const
Definition type_traits_generator.h:971
is_reference
Definition type_traits_generator.h:1174
is_same
Definition type_traits_generator.h:1104
bitset_ext
Definition absolute.h:39
T * mem_move(const T *sb, const T *se, T *db) ETL_NOEXCEPT
Definition memory.h:2339
ETL_NODISCARD int mem_compare(const T *sb, const T *se, const T *db) ETL_NOEXCEPT
Definition memory.h:2392
void destroy_object_at(void *p)
Definition memory.h:2711
etl::enable_if< etl::is_pointer< TPointer >::value &&!etl::is_const< TPointer >::value &&etl::is_integral< T >::value &&sizeof(T)==1, TPointer >::type mem_set(TPointer db, const TPointer de, T value) ETL_NOEXCEPT
Definition memory.h:2445
TObject & construct_object_at(void *p)
Default construct the container at 'p'.
Definition memory.h:2644
bool is_aligned(const void *p, size_t required_alignment)
Check that 'p' has 'required_alignment'.
Definition alignment.h:92
ETL_NODISCARD etl::enable_if< etl::is_pointer< TPointer >::value &&!etl::is_const< typenameetl::remove_pointer< TPointer >::type >::value &&etl::is_integral< T >::value &&sizeof(T)==1, char * >::type mem_char(TPointer sb, TPointer se, T value) ETL_NOEXCEPT
Definition memory.h:2504
ETL_CONSTEXPR T * to_address(T *p) ETL_NOEXCEPT
Definition memory.h:62
ETL_CONSTEXPR TContainer::iterator begin(TContainer &container)
Definition iterator.h:962
void destroy(const T *const p)
Destroys the object.
Definition variant_pool_generator.h:370
T * mem_copy(const T *sb, const T *se, T *db) ETL_NOEXCEPT
Definition memory.h:2289
TObject & get_object_at(void *p)
Get the container at 'p'.
Definition memory.h:2684
ETL_CONSTEXPR TContainer::iterator end(TContainer &container)
Definition iterator.h:992
add_lvalue_reference
Definition type_traits_generator.h:1333
Definition type_traits_generator.h:2251