31#ifndef ETL_DEQUE_INCLUDED
32#define ETL_DEQUE_INCLUDED
67 deque_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
68 :
exception(reason_, file_name_, line_number_)
81 deque_full(string_type file_name_, numeric_type line_number_)
82 :
etl::deque_exception(ETL_ERROR_TEXT(
"deque:full", ETL_DEQUE_FILE_ID
"A"), file_name_, line_number_)
95 deque_empty(string_type file_name_, numeric_type line_number_)
96 :
etl::deque_exception(ETL_ERROR_TEXT(
"deque:empty", ETL_DEQUE_FILE_ID
"B"), file_name_, line_number_)
109 deque_out_of_bounds(string_type file_name_, numeric_type line_number_)
110 :
etl::deque_exception(ETL_ERROR_TEXT(
"deque:bounds", ETL_DEQUE_FILE_ID
"C"), file_name_, line_number_)
119 class deque_incompatible_type :
public deque_exception
123 deque_incompatible_type(string_type file_name_, numeric_type line_number_)
124 : deque_exception(ETL_ERROR_TEXT(
"deque:type", ETL_DEQUE_FILE_ID
"D"), file_name_, line_number_)
137 typedef size_t size_type;
221 template <
typename T>
226 typedef T value_type;
227 typedef size_t size_type;
228 typedef T& reference;
229 typedef const T& const_reference;
231 typedef T&& rvalue_reference;
234 typedef const T* const_pointer;
235 typedef typename etl::iterator_traits<pointer>::difference_type difference_type;
240 class iterator :
public etl::iterator<ETL_OR_STD::random_access_iterator_tag, T>
245 friend class const_iterator;
256 iterator(
const iterator& other)
258 , p_deque(other.p_deque)
264 iterator& operator=(
const iterator& other)
267 p_deque = other.p_deque;
268 p_buffer = other.p_buffer;
274 iterator& operator++()
276 index = (
static_cast<size_t>(index) == p_deque->Buffer_Size - 1) ? 0 : index + 1;
282 iterator operator++(
int)
284 iterator previous(*
this);
285 index = (
static_cast<size_t>(index) == p_deque->Buffer_Size - 1) ? 0 : index + 1;
291 iterator& operator+=(difference_type offset)
296 index = (
static_cast<size_t>(index) > p_deque->Buffer_Size - 1) ? index -
static_cast<difference_type
>(p_deque->Buffer_Size) : index;
307 iterator& operator-=(difference_type offset)
312 index = (index < 0) ? index + static_cast<difference_type>(p_deque->Buffer_Size) : index;
323 iterator& operator--()
325 index = (index == 0) ?
static_cast<difference_type
>(p_deque->Buffer_Size) - 1 : index - 1;
331 iterator operator--(
int)
333 iterator previous(*
this);
334 index = (index == 0) ?
static_cast<difference_type
>(p_deque->Buffer_Size) - 1 : index - 1;
340 reference operator*()
const
342 return p_buffer[index];
346 pointer operator->()
const
348 return &p_buffer[index];
352 reference operator[](
size_t i)
354 iterator result(*
this);
361 const_reference operator[](
size_t i)
const
363 iterator result(*
this);
370 friend iterator operator+(
const iterator& lhs, difference_type offset)
372 iterator result(lhs);
378 friend iterator operator+(difference_type offset,
const iterator& lhs)
380 iterator result(lhs);
386 friend iterator operator-(
const iterator& lhs, difference_type offset)
388 iterator result(lhs);
394 friend bool operator==(
const iterator& lhs,
const iterator& rhs)
396 return lhs.index == rhs.index;
400 friend bool operator!=(
const iterator& lhs,
const iterator& rhs)
402 return !(lhs == rhs);
406 friend bool operator<(
const iterator& lhs,
const iterator& rhs)
408 const difference_type lhs_index = lhs.get_index();
409 const difference_type rhs_index = rhs.get_index();
410 const difference_type reference_index = lhs.container().
begin().get_index();
411 const difference_type buffer_size =
static_cast<difference_type
>(lhs.container().
max_size() + 1);
413 const difference_type lhs_distance = (lhs_index < reference_index) ? buffer_size + lhs_index - reference_index : lhs_index - reference_index;
414 const difference_type rhs_distance = (rhs_index < reference_index) ? buffer_size + rhs_index - reference_index : rhs_index - reference_index;
416 return lhs_distance < rhs_distance;
420 friend bool operator<=(
const iterator& lhs,
const iterator& rhs)
426 friend bool operator>(
const iterator& lhs,
const iterator& rhs)
432 friend bool operator>=(
const iterator& lhs,
const iterator& rhs)
438 difference_type get_index()
const
444 ideque& container()
const
450 pointer get_buffer()
const
456 void swap(iterator& other)
458 using ETL_OR_STD::swap;
460 swap(index, other.index);
466 difference_type distance(difference_type firstIndex, difference_type index_)
const
468 if (index_ < firstIndex)
470 return static_cast<difference_type
>(p_deque->Buffer_Size) + index_ - firstIndex;
474 return index_ - firstIndex;
479 iterator(difference_type index_, ideque& the_deque, pointer p_buffer_)
481 , p_deque(&the_deque)
486 difference_type index;
494 class const_iterator :
public etl::iterator<ETL_OR_STD::random_access_iterator_tag, const T>
509 const_iterator(
const const_iterator& other)
511 , p_deque(other.p_deque)
519 , p_deque(other.p_deque)
525 const_iterator& operator=(
const const_iterator& other)
528 p_deque = other.p_deque;
529 p_buffer = other.p_buffer;
537 p_deque = other.p_deque;
538 p_buffer = other.p_buffer;
544 const_iterator& operator++()
546 index = (
static_cast<size_t>(index) == p_deque->Buffer_Size - 1) ? 0 : index + 1;
552 const_iterator operator++(
int)
554 const_iterator previous(*
this);
555 index = (
static_cast<size_t>(index) == p_deque->Buffer_Size - 1) ? 0 : index + 1;
561 const_iterator& operator+=(difference_type offset)
566 index = (
static_cast<size_t>(index) > p_deque->Buffer_Size - 1) ? index -
static_cast<difference_type
>(p_deque->Buffer_Size) : index;
577 const_iterator& operator-=(difference_type offset)
582 index = (index < 0) ? index + static_cast<difference_type>(p_deque->Buffer_Size) : index;
593 const_iterator& operator--()
595 index = (index == 0) ?
static_cast<difference_type
>(p_deque->Buffer_Size) - 1 : index - 1;
601 const_iterator operator--(
int)
603 const_iterator previous(*
this);
604 index = (index == 0) ?
static_cast<difference_type
>(p_deque->Buffer_Size) - 1 : index - 1;
610 const_reference operator*()
const
612 return p_buffer[index];
616 const_pointer operator->()
const
618 return &p_buffer[index];
622 reference operator[](
size_t i)
631 friend const_iterator operator+(
const const_iterator& lhs, difference_type offset)
633 const_iterator result(lhs);
639 friend const_iterator operator+(difference_type offset,
const const_iterator& lhs)
641 const_iterator result(lhs);
647 friend const_iterator operator-(
const const_iterator& lhs, difference_type offset)
649 const_iterator result(lhs);
655 friend bool operator==(
const const_iterator& lhs,
const const_iterator& rhs)
657 return lhs.index == rhs.index;
661 friend bool operator!=(
const const_iterator& lhs,
const const_iterator& rhs)
663 return !(lhs == rhs);
667 friend bool operator<(
const const_iterator& lhs,
const const_iterator& rhs)
669 const difference_type lhs_index = lhs.get_index();
670 const difference_type rhs_index = rhs.get_index();
671 const difference_type reference_index = lhs.container().
begin().get_index();
672 const difference_type buffer_size =
static_cast<difference_type
>(lhs.container().
max_size() + 1UL);
674 const difference_type lhs_distance = (lhs_index < reference_index) ? buffer_size + lhs_index - reference_index : lhs_index - reference_index;
675 const difference_type rhs_distance = (rhs_index < reference_index) ? buffer_size + rhs_index - reference_index : rhs_index - reference_index;
677 return lhs_distance < rhs_distance;
681 friend bool operator<=(
const const_iterator& lhs,
const const_iterator& rhs)
687 friend bool operator>(
const const_iterator& lhs,
const const_iterator& rhs)
693 friend bool operator>=(
const const_iterator& lhs,
const const_iterator& rhs)
699 difference_type get_index()
const
705 ideque& container()
const
711 pointer get_buffer()
const
717 void swap(const_iterator& other)
719 ETL_OR_STD::swap(index, other.index);
725 difference_type distance(difference_type firstIndex, difference_type index_)
const
727 if (index_ < firstIndex)
729 return static_cast<difference_type
>(p_deque->Buffer_Size) + index_ - firstIndex;
733 return index_ - firstIndex;
738 const_iterator(difference_type index_, ideque& the_deque, pointer p_buffer_)
740 , p_deque(&the_deque)
745 difference_type index;
750 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
751 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
756 template <
typename TIterator>
757 typename etl::enable_if<!etl::is_integral<TIterator>::value,
void>
::type assign(TIterator range_begin, TIterator range_end)
761 while (range_begin != range_end)
775 void assign(size_type n,
const value_type& value)
783 create_element_back(value);
794 reference
at(
size_t index)
799 result +=
static_cast<difference_type
>(index);
810 const_reference
at(
size_t index)
const
815 result +=
static_cast<difference_type
>(index);
827 result +=
static_cast<difference_type
>(index);
839 result +=
static_cast<difference_type
>(index);
945 return reverse_iterator(
end());
953 return const_reverse_iterator(
end());
961 return const_reverse_iterator(
cend());
969 return reverse_iterator(
begin());
975 const_reverse_iterator
rend()
const
977 return const_reverse_iterator(
begin());
983 const_reverse_iterator
crend()
const
985 return const_reverse_iterator(
cbegin());
1013 iterator position(to_iterator(insert_position));
1017 if (insert_position ==
begin())
1019 create_element_front(value);
1022 else if (insert_position ==
end())
1024 create_element_back(value);
1025 position =
_end - 1;
1030 if (etl::distance(_begin, position) < etl::distance(position,
_end - 1))
1033 create_element_front(*_begin);
1036 etl::move(_begin + 1, position, _begin);
1039 *--position = value;
1044 create_element_back(*(
_end - 1));
1047 etl::move_backward(position,
_end - 2,
_end - 1);
1071 if (insert_position ==
begin())
1073 create_element_front(etl::move(value));
1076 else if (insert_position ==
end())
1078 create_element_back(etl::move(value));
1079 position =
_end - 1;
1084 if (etl::distance(_begin, position) < etl::distance(position,
_end - 1))
1087 create_element_front(etl::move(*_begin));
1090 etl::move(_begin + 1, position, _begin);
1093 *--position = etl::move(value);
1098 create_element_back(etl::move(*(
_end - 1)));
1101 etl::move_backward(position,
_end - 2,
_end - 1);
1104 *position = etl::move(value);
1118#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
1119 template <
typename... Args>
1128 if (insert_position ==
begin())
1133 ETL_INCREMENT_DEBUG_COUNT;
1136 else if (insert_position ==
end())
1141 ETL_INCREMENT_DEBUG_COUNT;
1142 position =
_end - 1;
1147 if (etl::distance(_begin, position) < etl::distance(position,
_end - 1))
1150 create_element_front(*_begin);
1153 etl::move(_begin + 1, position, _begin);
1163 create_element_back(*(
_end - 1));
1166 etl::move_backward(position,
_end - 2,
_end - 1);
1174 ::new (p) T(etl::forward<Args>(args)...);
1187 template <
typename T1>
1196 if (insert_position ==
begin())
1201 ETL_INCREMENT_DEBUG_COUNT;
1204 else if (insert_position ==
end())
1209 ETL_INCREMENT_DEBUG_COUNT;
1210 position =
_end - 1;
1215 if (etl::distance(_begin, position) < etl::distance(position,
_end - 1))
1218 create_element_front(*_begin);
1221 etl::move(_begin + 1, position, _begin);
1231 create_element_back(*(
_end - 1));
1234 etl::move_backward(position,
_end - 2,
_end - 1);
1242 ::new (p) T(value1);
1253 template <
typename T1,
typename T2>
1262 if (insert_position ==
begin())
1267 ETL_INCREMENT_DEBUG_COUNT;
1270 else if (insert_position ==
end())
1275 ETL_INCREMENT_DEBUG_COUNT;
1276 position =
_end - 1;
1281 if (etl::distance(_begin, position) < etl::distance(position,
_end - 1))
1284 create_element_front(*_begin);
1287 etl::move(_begin + 1, position, _begin);
1297 create_element_back(*(
_end - 1));
1300 etl::move_backward(position,
_end - 2,
_end - 1);
1308 ::new (p) T(value1, value2);
1319 template <
typename T1,
typename T2,
typename T3>
1328 if (insert_position ==
begin())
1333 ETL_INCREMENT_DEBUG_COUNT;
1336 else if (insert_position ==
end())
1341 ETL_INCREMENT_DEBUG_COUNT;
1342 position =
_end - 1;
1347 if (etl::distance(_begin, position) < etl::distance(position,
_end - 1))
1350 create_element_front(*_begin);
1353 etl::move(_begin + 1, position, _begin);
1363 create_element_back(*(
_end - 1));
1366 etl::move_backward(position,
_end - 2,
_end - 1);
1374 ::new (p) T(value1, value2, value3);
1385 template <
typename T1,
typename T2,
typename T3,
typename T4>
1394 if (insert_position ==
begin())
1399 ETL_INCREMENT_DEBUG_COUNT;
1402 else if (insert_position ==
end())
1407 ETL_INCREMENT_DEBUG_COUNT;
1408 position =
_end - 1;
1413 if (etl::distance(_begin, position) < etl::distance(position,
_end - 1))
1416 create_element_front(*_begin);
1419 etl::move(_begin + 1, position, _begin);
1429 create_element_back(*(
_end - 1));
1432 etl::move_backward(position,
_end - 2,
_end - 1);
1440 ::new (p) T(value1, value2, value3, value4);
1460 if (insert_position ==
begin())
1462 for (
size_t i = 0UL; i < n; ++i)
1464 create_element_front(value);
1469 else if (insert_position ==
end())
1471 for (
size_t i = 0UL; i < n; ++i)
1473 create_element_back(value);
1476 position =
_end -
static_cast<difference_type
>(n);
1484 if (distance(_begin, insert_position) <= difference_type(
current_size / 2))
1486 size_t n_insert = n;
1487 size_t n_move =
static_cast<size_t>(etl::distance(
begin(), position));
1488 size_t n_create_copy = etl::min(n_insert, n_move);
1489 size_t n_create_new = (n_insert > n_create_copy) ? n_insert - n_create_copy : 0;
1490 size_t n_copy_new = (n_insert > n_create_new) ? n_insert - n_create_new : 0;
1491 size_t n_copy_old = n_move - n_create_copy;
1494 iterator from = _begin +
static_cast<difference_type
>(n_create_copy) - 1;
1498 for (
size_t i = 0UL; i < n_create_new; ++i)
1500 create_element_front(value);
1504 for (
size_t i = 0UL; i < n_create_copy; ++i)
1506 create_element_front(*from);
1511 from = position -
static_cast<difference_type
>(n_copy_old);
1512 to = _begin +
static_cast<difference_type
>(n_create_copy);
1513 etl::move(from, from +
static_cast<difference_type
>(n_copy_old), to);
1516 to = position -
static_cast<difference_type
>(n_create_copy);
1517 etl::fill_n(to, n_copy_new, value);
1519 position = _begin +
static_cast<difference_type
>(n_move);
1523 size_t n_insert = n;
1524 size_t n_move =
static_cast<size_t>(etl::distance(position,
end()));
1525 size_t n_create_copy = etl::min(n_insert, n_move);
1526 size_t n_create_new = (n_insert > n_create_copy) ? n_insert - n_create_copy : 0;
1527 size_t n_copy_new = (n_insert > n_create_new) ? n_insert - n_create_new : 0;
1528 size_t n_copy_old = n_move - n_create_copy;
1531 for (
size_t i = 0UL; i < n_create_new; ++i)
1533 create_element_back(value);
1537 const_iterator from = position +
static_cast<difference_type
>(n_copy_old);
1539 for (
size_t i = 0UL; i < n_create_copy; ++i)
1541 create_element_back(*from);
1546 etl::move_backward(position, position +
static_cast<difference_type
>(n_copy_old),
1547 position +
static_cast<difference_type
>(n_insert + n_copy_old));
1550 etl::fill_n(position, n_copy_new, value);
1565 template <
typename TIterator>
1567 TIterator range_end)
1571 difference_type n = etl::distance(range_begin, range_end);
1575 if (insert_position ==
begin())
1577 create_element_front(
static_cast<size_t>(n), range_begin);
1581 else if (insert_position ==
end())
1583 for (difference_type i = 0; i < n; ++i)
1585 create_element_back(*range_begin);
1589 position =
_end - n;
1597 if (distance(_begin, insert_position) < difference_type(
current_size / 2))
1599 size_t n_insert =
static_cast<size_t>(n);
1600 size_t n_move =
static_cast<size_t>(etl::distance(
begin(), position));
1601 size_t n_create_copy = etl::min(n_insert, n_move);
1602 size_t n_create_new = (n_insert > n_create_copy) ? n_insert - n_create_copy : 0;
1603 size_t n_copy_new = (n_insert > n_create_new) ? n_insert - n_create_new : 0;
1604 size_t n_copy_old = n_move - n_create_copy;
1611 create_element_front(n_create_new, range_begin);
1614 create_element_front(n_create_copy, _begin +
static_cast<difference_type
>(n_create_new));
1617 from = position -
static_cast<difference_type
>(n_copy_old);
1618 to = _begin +
static_cast<difference_type
>(n_create_copy);
1619 etl::move(from, from +
static_cast<difference_type
>(n_copy_old), to);
1622 to = position -
static_cast<difference_type
>(n_create_copy);
1623 range_begin +=
static_cast<difference_type
>(n_create_new);
1624 etl::copy(range_begin, range_begin +
static_cast<difference_type
>(n_copy_new), to);
1626 position = _begin +
static_cast<difference_type
>(n_move);
1630 size_t n_insert =
static_cast<size_t>(n);
1631 size_t n_move =
static_cast<size_t>(etl::distance(position,
end()));
1632 size_t n_create_copy = etl::min(n_insert, n_move);
1633 size_t n_create_new = (n_insert > n_create_copy) ? n_insert - n_create_copy : 0;
1634 size_t n_copy_new = (n_insert > n_create_new) ? n_insert - n_create_new : 0;
1635 size_t n_copy_old = n_move - n_create_copy;
1638 TIterator item = range_begin +
static_cast<difference_type
>(n_insert - n_create_new);
1639 for (
size_t i = 0UL; i < n_create_new; ++i)
1641 create_element_back(*item);
1646 const_iterator from = position +
static_cast<difference_type
>(n_copy_old);
1648 for (
size_t i = 0UL; i < n_create_copy; ++i)
1650 create_element_back(*from);
1655 etl::move_backward(position, position +
static_cast<difference_type
>(n_copy_old),
1656 position +
static_cast<difference_type
>(n_insert + n_copy_old));
1660 etl::copy(item, item +
static_cast<difference_type
>(n_copy_new), position);
1675 iterator position(to_iterator(erase_position));
1680 if (position == _begin)
1682 destroy_element_front();
1685 else if (position ==
_end - 1)
1687 destroy_element_back();
1693 if (distance(_begin, position) < difference_type(
current_size / 2))
1695 etl::move_backward(_begin, position, position + 1);
1696 destroy_element_front();
1701 etl::move(position + 1,
_end, position);
1702 destroy_element_back();
1718 iterator position(to_iterator(range_begin));
1724 size_t length =
static_cast<size_t>(etl::distance(range_begin, range_end));
1727 if (position == _begin)
1729 for (
size_t i = 0UL; i < length; ++i)
1731 destroy_element_front();
1737 else if (position ==
_end -
static_cast<difference_type
>(length))
1739 for (
size_t i = 0UL; i < length; ++i)
1741 destroy_element_back();
1750 if (distance(_begin, position) < difference_type(
current_size / 2))
1753 etl::move_backward(_begin, position, position +
static_cast<difference_type
>(length));
1755 for (
size_t i = 0UL; i < length; ++i)
1757 destroy_element_front();
1760 position +=
static_cast<difference_type
>(length);
1766 etl::move(position +
static_cast<difference_type
>(length),
_end, position);
1768 for (
size_t i = 0UL; i < length; ++i)
1770 destroy_element_back();
1786 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(!
full(), ETL_ERROR(
deque_full));
1788 create_element_back(item);
1800 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(!
full(), ETL_ERROR(
deque_full));
1802 create_element_back(etl::move(item));
1806#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
1812 template <
typename... Args>
1815 ETL_ASSERT_CHECK_PUSH_POP(!
full(), ETL_ERROR(deque_full));
1817 ::new (&(*
_end)) T(etl::forward<Args>(args)...);
1820 ETL_INCREMENT_DEBUG_COUNT;
1835 ::new (&(*
_end)) T();
1838 ETL_INCREMENT_DEBUG_COUNT;
1847 template <
typename T1>
1852 ::new (&(*
_end)) T(value1);
1855 ETL_INCREMENT_DEBUG_COUNT;
1864 template <
typename T1,
typename T2>
1869 ::new (&(*
_end)) T(value1, value2);
1872 ETL_INCREMENT_DEBUG_COUNT;
1881 template <
typename T1,
typename T2,
typename T3>
1882 reference
emplace_back(
const T1& value1,
const T2& value2,
const T3& value3)
1886 ::new (&(*
_end)) T(value1, value2, value3);
1889 ETL_INCREMENT_DEBUG_COUNT;
1898 template <
typename T1,
typename T2,
typename T3,
typename T4>
1899 reference
emplace_back(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
1903 ::new (&(*
_end)) T(value1, value2, value3, value4);
1906 ETL_INCREMENT_DEBUG_COUNT;
1918 destroy_element_back();
1929 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(!
full(), ETL_ERROR(
deque_full));
1931 create_element_front(item);
1943 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(!
full(), ETL_ERROR(
deque_full));
1945 create_element_front(etl::move(item));
1949#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
1955 template <
typename... Args>
1958 ETL_ASSERT_CHECK_PUSH_POP(!
full(), ETL_ERROR(deque_full));
1961 ::new (&(*_begin)) T(etl::forward<Args>(args)...);
1963 ETL_INCREMENT_DEBUG_COUNT;
1979 ::new (&(*_begin)) T();
1981 ETL_INCREMENT_DEBUG_COUNT;
1990 template <
typename T1>
1996 ::new (&(*_begin)) T(value1);
1998 ETL_INCREMENT_DEBUG_COUNT;
2007 template <
typename T1,
typename T2>
2013 ::new (&(*_begin)) T(value1, value2);
2015 ETL_INCREMENT_DEBUG_COUNT;
2024 template <
typename T1,
typename T2,
typename T3>
2030 ::new (&(*_begin)) T(value1, value2, value3);
2032 ETL_INCREMENT_DEBUG_COUNT;
2041 template <
typename T1,
typename T2,
typename T3,
typename T4>
2042 reference
emplace_front(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
2047 ::new (&(*_begin)) T(value1, value2, value3, value4);
2049 ETL_INCREMENT_DEBUG_COUNT;
2061 destroy_element_front();
2072 void resize(
size_t new_size,
const value_type& value = value_type())
2081 destroy_element_back();
2089 for (
size_t i = 0UL; i < count; ++i)
2091 create_element_back(value);
2101 return distance(rhs, lhs);
2109 return distance(rhs, lhs);
2135 while (itr != rhs.end())
2148#ifdef ETL_IDEQUE_REPAIR_ENABLE
2152 virtual void repair() = 0;
2160 ideque(pointer p_buffer_,
size_t max_size_,
size_t buffer_size_)
2171 if ETL_IF_CONSTEXPR (etl::is_trivially_destructible<T>::value)
2174 ETL_RESET_DEBUG_COUNT;
2180 destroy_element_back();
2208 void create_element_front()
2211 ::new (&(*_begin)) T();
2213 ETL_INCREMENT_DEBUG_COUNT;
2219 template <
typename TIterator>
2220 void create_element_front(
size_t n, TIterator from)
2227 _begin -=
static_cast<difference_type
>(n);
2229 iterator item = _begin;
2232 ::new (&(*item)) T(*from);
2236 ETL_INCREMENT_DEBUG_COUNT;
2243 void create_element_back()
2245 ::new (&(*
_end)) T();
2248 ETL_INCREMENT_DEBUG_COUNT;
2254 void create_element_front(const_reference value)
2257 ::new (&(*_begin)) T(value);
2259 ETL_INCREMENT_DEBUG_COUNT;
2265 void create_element_back(const_reference value)
2267 ::new (&(*
_end)) T(value);
2270 ETL_INCREMENT_DEBUG_COUNT;
2277 void create_element_front(rvalue_reference value)
2280 ::new (&(*_begin)) T(etl::move(value));
2282 ETL_INCREMENT_DEBUG_COUNT;
2288 void create_element_back(rvalue_reference value)
2290 ::new (&(*
_end)) T(etl::move(value));
2293 ETL_INCREMENT_DEBUG_COUNT;
2300 void destroy_element_front()
2304 ETL_DECREMENT_DEBUG_COUNT;
2311 void destroy_element_back()
2316 ETL_DECREMENT_DEBUG_COUNT;
2322 template <
typename TIterator1,
typename TIterator2>
2323 static difference_type distance(
const TIterator1& range_begin,
const TIterator2& range_end)
2325 difference_type distance1 = distance(range_begin);
2326 difference_type distance2 = distance(range_end);
2328 return distance2 - distance1;
2335 template <
typename TIterator>
2336 static difference_type distance(
const TIterator& other)
2338 const difference_type index = other.get_index();
2339 const difference_type reference_index = other.container()._begin.index;
2340 const difference_type buffer_size =
static_cast<difference_type
>(other.container().
Buffer_Size);
2342 if (index < reference_index)
2344 return buffer_size + index - reference_index;
2348 return index - reference_index;
2366#if defined(ETL_POLYMORPHIC_DEQUE) || defined(ETL_POLYMORPHIC_CONTAINERS) || defined(ETL_IDEQUE_REPAIR_ENABLE)
2386 template <
typename T, const
size_t MAX_SIZE_>
2391 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
2395 static ETL_CONSTANT
size_t Buffer_Size = MAX_SIZE + 1;
2399 typedef T value_type;
2401 typedef const T* const_pointer;
2402 typedef T& reference;
2403 typedef const T& const_reference;
2404 typedef size_t size_type;
2405 typedef typename etl::iterator_traits<pointer>::difference_type difference_type;
2411 :
etl::
ideque<T>(reinterpret_cast<T*>(buffer.raw), MAX_SIZE, Buffer_Size)
2428 :
etl::
ideque<T>(reinterpret_cast<T*>(buffer.raw), MAX_SIZE, Buffer_Size)
2448 while (itr != other.end())
2460 template <
typename TIterator>
2461 deque(TIterator begin_, TIterator end_,
typename etl::enable_if<!etl::is_integral<TIterator>::value,
int>
::type = 0)
2462 :
etl::
ideque<T>(reinterpret_cast<T*>(buffer.raw), MAX_SIZE, Buffer_Size)
2464 this->
assign(begin_, end_);
2470 explicit deque(
size_t n, const_reference value = value_type())
2471 :
etl::
ideque<T>(reinterpret_cast<T*>(buffer.raw), MAX_SIZE, Buffer_Size)
2476#if ETL_HAS_INITIALIZER_LIST
2480 deque(std::initializer_list<T> init)
2483 this->
assign(init.begin(), init.end());
2510 while (itr != rhs.end())
2524#ifdef ETL_IDEQUE_REPAIR_ENABLE
2525 virtual void repair() ETL_OVERRIDE
2530#if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED
2543 template <
typename T, const
size_t MAX_SIZE_>
2544 ETL_CONSTANT
size_t deque<T, MAX_SIZE_>::MAX_SIZE;
2549#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
2550 template <
typename... T>
2551 deque(T...) -> deque<
typename etl::common_type_t<T...>,
sizeof...(T)>;
2557#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
2558 template <
typename T,
typename... TValues>
2559 constexpr auto make_deque(TValues&&... values) ->
etl::deque<T,
sizeof...(TValues)>
2561 return {etl::forward<T>(values)...};
2572 template <
typename T>
2585 template <
typename T>
2588 return !(lhs == rhs);
2598 template <
typename T>
2601 return etl::lexicographical_compare(lhs.
begin(), lhs.
end(), rhs.
begin(), rhs.
end());
2612 template <
typename T>
2615 return !(lhs > rhs);
2625 template <
typename T>
2639 template <
typename T>
2642 return !(lhs < rhs);
void swap(etl::array_view< T > &lhs, etl::array_view< T > &rhs) ETL_NOEXCEPT
Swaps the values.
Definition array_view.h:692
Const Iterator.
Definition deque.h:495
Iterator.
Definition deque.h:241
ETL_CONSTEXPR14 bool operator!=(const etl::bitset< Active_Bits, TElement > &lhs, const etl::bitset< Active_Bits, TElement > &rhs) ETL_NOEXCEPT
Definition bitset_new.h:2529
reference emplace_front(const T1 &value1)
Definition deque.h:1991
reference emplace_back(const T1 &value1, const T2 &value2, const T3 &value3)
Definition deque.h:1882
const_reverse_iterator crbegin() const
Gets a const reverse iterator to the end of the deque.
Definition deque.h:959
void clear()
Clears the deque.
Definition deque.h:991
iterator erase(const_iterator erase_position)
Definition deque.h:1673
const size_type CAPACITY
The maximum number of elements in the deque.
Definition deque.h:211
void pop_back()
Removes the oldest item from the deque.
Definition deque.h:1914
ideque & operator=(const ideque &rhs)
Assignment operator.
Definition deque.h:2115
const_reverse_iterator rbegin() const
Gets a const reverse iterator to the end of the deque.
Definition deque.h:951
ETL_DECLARE_DEBUG_COUNT
Internal debugging.
Definition deque.h:213
void resize(size_t new_size, const value_type &value=value_type())
Definition deque.h:2072
iterator emplace(const_iterator insert_position, const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition deque.h:1386
iterator begin()
Gets an iterator to the beginning of the deque.
Definition deque.h:895
reference front()
Definition deque.h:850
reference at(size_t index)
Definition deque.h:794
reference emplace_back(const T1 &value1, const T2 &value2)
Definition deque.h:1865
pointer p_buffer
Iterator to the _end item in the deque.
Definition deque.h:2201
friend difference_type operator-(const iterator &lhs, const iterator &rhs)
Definition deque.h:2099
reference emplace_front(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition deque.h:2042
reference emplace_front()
Definition deque.h:1974
etl::enable_if<!etl::is_integral< TIterator >::value, void >::type assign(TIterator range_begin, TIterator range_end)
Assigns a range to the deque.
Definition deque.h:757
void initialise()
Initialise the deque.
Definition deque.h:2169
reference operator[](size_t index)
Definition deque.h:824
~deque_base()
Destructor.
Definition deque.h:208
iterator _end
Iterator to the _begin item in the deque.
Definition deque.h:2200
reference emplace_front(const T1 &value1, const T2 &value2, const T3 &value3)
Definition deque.h:2025
size_type size() const
Definition deque.h:143
const_reference at(size_t index) const
Definition deque.h:810
const_reverse_iterator crend() const
Gets a const reverse iterator to the beginning of the deque.
Definition deque.h:983
const size_type Buffer_Size
The number of elements in the buffer.
Definition deque.h:212
iterator end()
Gets an iterator to the end of the deque.
Definition deque.h:919
const_iterator end() const
Gets a const iterator to the end of the deque.
Definition deque.h:927
void push_front(const_reference item)
Definition deque.h:1927
size_type max_size() const
Definition deque.h:170
~ideque()
Destructor.
Definition deque.h:2375
iterator erase(const_iterator range_begin, const_iterator range_end)
Definition deque.h:1716
iterator emplace(const_iterator insert_position, const T1 &value1)
Definition deque.h:1188
deque(const deque &other)
Copy constructor.
Definition deque.h:2427
friend difference_type operator-(const const_iterator &lhs, const const_iterator &rhs)
Definition deque.h:2107
iterator emplace(const_iterator insert_position, const T1 &value1, const T2 &value2)
Definition deque.h:1254
iterator insert(const_iterator insert_position, size_type n, const value_type &value)
Definition deque.h:1454
enable_if<!etl::is_integral< TIterator >::value, iterator >::type insert(const_iterator insert_position, TIterator range_begin, TIterator range_end)
Definition deque.h:1566
bool full() const
Definition deque.h:161
const_reference operator[](size_t index) const
Definition deque.h:836
size_type capacity() const
Definition deque.h:179
const_reference back() const
Definition deque.h:886
bool empty() const
Definition deque.h:152
void repair()
Fix the internal pointers after a low level memory copy.
Definition deque.h:2527
const_reverse_iterator rend() const
Gets a const reverse iterator to the beginning of the deque.
Definition deque.h:975
const_iterator cend() const
Gets a const iterator to the end of the deque.
Definition deque.h:935
reference emplace_back(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition deque.h:1899
reference emplace_back()
Definition deque.h:1831
deque_base(size_t max_size_, size_t buffer_size_)
Constructor.
Definition deque.h:198
reference emplace_front(const T1 &value1, const T2 &value2)
Definition deque.h:2008
void assign(size_type n, const value_type &value)
Definition deque.h:775
deque()
Default constructor.
Definition deque.h:2410
reference back()
Definition deque.h:874
iterator emplace(const_iterator insert_position, const T1 &value1, const T2 &value2, const T3 &value3)
Definition deque.h:1320
reverse_iterator rbegin()
Gets a reverse iterator to the end of the deque.
Definition deque.h:943
void fill(const T &value)
Fills the deque.
Definition deque.h:999
void pop_front()
Removes the oldest item from the deque.
Definition deque.h:2057
reference emplace_back(const T1 &value1)
Definition deque.h:1848
void push_back(const_reference item)
Definition deque.h:1784
const_iterator cbegin() const
Gets a const iterator to the beginning of the deque.
Definition deque.h:911
deque(TIterator begin_, TIterator end_, typename etl::enable_if<!etl::is_integral< TIterator >::value, int >::type=0)
Assigns data to the deque.
Definition deque.h:2461
~deque()
Destructor.
Definition deque.h:2419
reverse_iterator rend()
Gets a reverse iterator to the beginning of the deque.
Definition deque.h:967
const_reference front() const
Definition deque.h:862
deque(size_t n, const_reference value=value_type())
Assigns data to the deque.
Definition deque.h:2470
size_t available() const
Definition deque.h:188
deque & operator=(const deque &rhs)
Assignment operator.
Definition deque.h:2490
const_iterator begin() const
Gets a const iterator to the beginning of the deque.
Definition deque.h:903
iterator insert(const_iterator insert_position, const value_type &value)
Definition deque.h:1011
void repair_buffer(pointer p_buffer_)
Fix the internal pointers after a low level memory copy.
Definition deque.h:2191
size_type current_size
The current number of elements in the deque.
Definition deque.h:210
ideque(pointer p_buffer_, size_t max_size_, size_t buffer_size_)
Constructor.
Definition deque.h:2160
#define ETL_ASSERT(b, e)
Definition error_handler.h:511
ETL_EXCEPTION_CONSTEXPR exception(string_type reason_, string_type, numeric_type)
Constructor.
Definition exception.h:81
Definition exception.h:59
ETL_CONSTEXPR17 etl::enable_if<!etl::is_same< T, etl::nullptr_t >::value, T >::type * addressof(T &t)
Definition addressof.h:52
bitset_ext
Definition absolute.h:40
ETL_CONSTEXPR14 bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1081
bool operator>(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1133
bool operator>=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1147
ETL_CONSTEXPR14 bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1093
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1106
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1120
iterator
Definition iterator.h:424