31#ifndef ETL_DEQUE_INCLUDED
32#define ETL_DEQUE_INCLUDED
66 deque_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
67 :
exception(reason_, file_name_, line_number_)
80 deque_full(string_type file_name_, numeric_type line_number_)
81 :
etl::deque_exception(ETL_ERROR_TEXT(
"deque:full", ETL_DEQUE_FILE_ID
"A"), file_name_, line_number_)
94 deque_empty(string_type file_name_, numeric_type line_number_)
95 :
etl::deque_exception(ETL_ERROR_TEXT(
"deque:empty", ETL_DEQUE_FILE_ID
"B"), file_name_, line_number_)
108 deque_out_of_bounds(string_type file_name_, numeric_type line_number_)
109 :
etl::deque_exception(ETL_ERROR_TEXT(
"deque:bounds", ETL_DEQUE_FILE_ID
"C"), file_name_, line_number_)
118 class deque_incompatible_type :
public deque_exception
122 deque_incompatible_type(string_type file_name_, numeric_type line_number_)
123 : deque_exception(ETL_ERROR_TEXT(
"deque:type", ETL_DEQUE_FILE_ID
"D"), file_name_, line_number_)
136 typedef size_t size_type;
220 template <
typename T>
225 typedef T value_type;
226 typedef size_t size_type;
227 typedef T& reference;
228 typedef const T& const_reference;
230 typedef T&& rvalue_reference;
233 typedef const T* const_pointer;
234 typedef typename etl::iterator_traits<pointer>::difference_type difference_type;
239 class iterator :
public etl::iterator<ETL_OR_STD::random_access_iterator_tag, T>
244 friend class const_iterator;
255 iterator(
const iterator& other)
257 , p_deque(other.p_deque)
263 iterator& operator=(
const iterator& other)
266 p_deque = other.p_deque;
267 p_buffer = other.p_buffer;
273 iterator& operator++()
275 index = (
static_cast<size_t>(index) == p_deque->Buffer_Size - 1) ? 0 : index + 1;
281 iterator operator++(
int)
283 iterator previous(*
this);
284 index = (
static_cast<size_t>(index) == p_deque->Buffer_Size - 1) ? 0 : index + 1;
290 iterator& operator+=(difference_type offset)
295 index = (
static_cast<size_t>(index) > p_deque->Buffer_Size - 1) ? index -
static_cast<difference_type
>(p_deque->Buffer_Size) : index;
306 iterator& operator-=(difference_type offset)
311 index = (index < 0) ? index + static_cast<difference_type>(p_deque->Buffer_Size) : index;
322 iterator& operator--()
324 index = (index == 0) ?
static_cast<difference_type
>(p_deque->Buffer_Size) - 1 : index - 1;
330 iterator operator--(
int)
332 iterator previous(*
this);
333 index = (index == 0) ?
static_cast<difference_type
>(p_deque->Buffer_Size) - 1 : index - 1;
339 reference operator*()
const
341 return p_buffer[index];
345 pointer operator->()
const
347 return &p_buffer[index];
351 reference operator[](
size_t i)
353 iterator result(*
this);
360 const_reference operator[](
size_t i)
const
362 iterator result(*
this);
369 friend iterator operator+(
const iterator& lhs, difference_type offset)
371 iterator result(lhs);
377 friend iterator operator+(difference_type offset,
const iterator& lhs)
379 iterator result(lhs);
385 friend iterator operator-(
const iterator& lhs, difference_type offset)
387 iterator result(lhs);
393 friend bool operator==(
const iterator& lhs,
const iterator& rhs)
395 return lhs.index == rhs.index;
399 friend bool operator!=(
const iterator& lhs,
const iterator& rhs)
401 return !(lhs == rhs);
405 friend bool operator<(
const iterator& lhs,
const iterator& rhs)
407 const difference_type lhs_index = lhs.get_index();
408 const difference_type rhs_index = rhs.get_index();
409 const difference_type reference_index = lhs.container().
begin().get_index();
410 const difference_type buffer_size =
static_cast<difference_type
>(lhs.container().
max_size() + 1);
412 const difference_type lhs_distance = (lhs_index < reference_index) ? buffer_size + lhs_index - reference_index : lhs_index - reference_index;
413 const difference_type rhs_distance = (rhs_index < reference_index) ? buffer_size + rhs_index - reference_index : rhs_index - reference_index;
415 return lhs_distance < rhs_distance;
419 friend bool operator<=(
const iterator& lhs,
const iterator& rhs)
425 friend bool operator>(
const iterator& lhs,
const iterator& rhs)
431 friend bool operator>=(
const iterator& lhs,
const iterator& rhs)
437 difference_type get_index()
const
443 ideque& container()
const
449 pointer get_buffer()
const
455 void swap(iterator& other)
457 using ETL_OR_STD::swap;
459 swap(index, other.index);
460 swap(p_deque, other.p_deque);
461 swap(p_buffer, other.p_buffer);
467 iterator(difference_type index_, ideque& the_deque, pointer p_buffer_)
469 , p_deque(&the_deque)
474 difference_type index;
482 class const_iterator :
public etl::iterator<ETL_OR_STD::random_access_iterator_tag, const T>
497 const_iterator(
const const_iterator& other)
499 , p_deque(other.p_deque)
507 , p_deque(other.p_deque)
513 const_iterator& operator=(
const const_iterator& other)
516 p_deque = other.p_deque;
517 p_buffer = other.p_buffer;
525 p_deque = other.p_deque;
526 p_buffer = other.p_buffer;
532 const_iterator& operator++()
534 index = (
static_cast<size_t>(index) == p_deque->Buffer_Size - 1) ? 0 : index + 1;
540 const_iterator operator++(
int)
542 const_iterator previous(*
this);
543 index = (
static_cast<size_t>(index) == p_deque->Buffer_Size - 1) ? 0 : index + 1;
549 const_iterator& operator+=(difference_type offset)
554 index = (
static_cast<size_t>(index) > p_deque->Buffer_Size - 1) ? index -
static_cast<difference_type
>(p_deque->Buffer_Size) : index;
565 const_iterator& operator-=(difference_type offset)
570 index = (index < 0) ? index + static_cast<difference_type>(p_deque->Buffer_Size) : index;
581 const_iterator& operator--()
583 index = (index == 0) ?
static_cast<difference_type
>(p_deque->Buffer_Size) - 1 : index - 1;
589 const_iterator operator--(
int)
591 const_iterator previous(*
this);
592 index = (index == 0) ?
static_cast<difference_type
>(p_deque->Buffer_Size) - 1 : index - 1;
598 const_reference operator*()
const
600 return p_buffer[index];
604 const_pointer operator->()
const
606 return &p_buffer[index];
610 const_reference operator[](
size_t i)
const
612 const_iterator result(*
this);
613 result +=
static_cast<difference_type
>(i);
619 friend const_iterator operator+(
const const_iterator& lhs, difference_type offset)
621 const_iterator result(lhs);
627 friend const_iterator operator+(difference_type offset,
const const_iterator& lhs)
629 const_iterator result(lhs);
635 friend const_iterator operator-(
const const_iterator& lhs, difference_type offset)
637 const_iterator result(lhs);
643 friend bool operator==(
const const_iterator& lhs,
const const_iterator& rhs)
645 return lhs.index == rhs.index;
649 friend bool operator!=(
const const_iterator& lhs,
const const_iterator& rhs)
651 return !(lhs == rhs);
655 friend bool operator<(
const const_iterator& lhs,
const const_iterator& rhs)
657 const difference_type lhs_index = lhs.get_index();
658 const difference_type rhs_index = rhs.get_index();
659 const difference_type reference_index = lhs.container().
begin().get_index();
660 const difference_type buffer_size =
static_cast<difference_type
>(lhs.container().
max_size() + 1UL);
662 const difference_type lhs_distance = (lhs_index < reference_index) ? buffer_size + lhs_index - reference_index : lhs_index - reference_index;
663 const difference_type rhs_distance = (rhs_index < reference_index) ? buffer_size + rhs_index - reference_index : rhs_index - reference_index;
665 return lhs_distance < rhs_distance;
669 friend bool operator<=(
const const_iterator& lhs,
const const_iterator& rhs)
675 friend bool operator>(
const const_iterator& lhs,
const const_iterator& rhs)
681 friend bool operator>=(
const const_iterator& lhs,
const const_iterator& rhs)
687 difference_type get_index()
const
693 ideque& container()
const
699 pointer get_buffer()
const
705 void swap(const_iterator& other)
707 ETL_OR_STD::swap(index, other.index);
708 ETL_OR_STD::swap(p_deque, other.p_deque);
709 ETL_OR_STD::swap(p_buffer, other.p_buffer);
715 const_iterator(difference_type index_, ideque& the_deque, pointer p_buffer_)
717 , p_deque(&the_deque)
722 difference_type index;
727 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
728 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
733 template <
typename TIterator>
734 typename etl::enable_if<!etl::is_integral<TIterator>::value,
void>
::type assign(TIterator range_begin, TIterator range_end)
738 while (range_begin != range_end)
752 void assign(size_type n,
const value_type& value)
760 create_element_back(value);
771 reference
at(
size_t index)
776 result +=
static_cast<difference_type
>(index);
787 const_reference
at(
size_t index)
const
792 result +=
static_cast<difference_type
>(index);
804 result +=
static_cast<difference_type
>(index);
816 result +=
static_cast<difference_type
>(index);
922 return reverse_iterator(
end());
930 return const_reverse_iterator(
end());
938 return const_reverse_iterator(
cend());
946 return reverse_iterator(
begin());
952 const_reverse_iterator
rend()
const
954 return const_reverse_iterator(
begin());
960 const_reverse_iterator
crend()
const
962 return const_reverse_iterator(
cbegin());
990 iterator position(to_iterator(insert_position));
994 if (insert_position ==
begin())
996 create_element_front(value);
999 else if (insert_position ==
end())
1001 create_element_back(value);
1002 position =
_end - 1;
1007 if (etl::distance(_begin, position) < etl::distance(position,
_end - 1))
1010 create_element_front(*_begin);
1013 etl::move(_begin + 1, position, _begin);
1016 *--position = value;
1021 create_element_back(*(
_end - 1));
1024 etl::move_backward(position,
_end - 2,
_end - 1);
1048 if (insert_position ==
begin())
1050 create_element_front(etl::move(value));
1053 else if (insert_position ==
end())
1055 create_element_back(etl::move(value));
1056 position =
_end - 1;
1061 if (etl::distance(_begin, position) < etl::distance(position,
_end - 1))
1064 create_element_front(etl::move(*_begin));
1067 etl::move(_begin + 1, position, _begin);
1070 *--position = etl::move(value);
1075 create_element_back(etl::move(*(
_end - 1)));
1078 etl::move_backward(position,
_end - 2,
_end - 1);
1081 *position = etl::move(value);
1095#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
1096 template <
typename... Args>
1105 if (insert_position ==
begin())
1110 ETL_INCREMENT_DEBUG_COUNT;
1113 else if (insert_position ==
end())
1118 ETL_INCREMENT_DEBUG_COUNT;
1119 position =
_end - 1;
1124 if (etl::distance(_begin, position) < etl::distance(position,
_end - 1))
1127 create_element_front(*_begin);
1130 etl::move(_begin + 1, position, _begin);
1140 create_element_back(*(
_end - 1));
1143 etl::move_backward(position,
_end - 2,
_end - 1);
1151 ::new (p) T(etl::forward<Args>(args)...);
1164 template <
typename T1>
1173 if (insert_position ==
begin())
1178 ETL_INCREMENT_DEBUG_COUNT;
1181 else if (insert_position ==
end())
1186 ETL_INCREMENT_DEBUG_COUNT;
1187 position =
_end - 1;
1192 if (etl::distance(_begin, position) < etl::distance(position,
_end - 1))
1195 create_element_front(*_begin);
1198 etl::move(_begin + 1, position, _begin);
1208 create_element_back(*(
_end - 1));
1211 etl::move_backward(position,
_end - 2,
_end - 1);
1219 ::new (p) T(value1);
1230 template <
typename T1,
typename T2>
1239 if (insert_position ==
begin())
1244 ETL_INCREMENT_DEBUG_COUNT;
1247 else if (insert_position ==
end())
1252 ETL_INCREMENT_DEBUG_COUNT;
1253 position =
_end - 1;
1258 if (etl::distance(_begin, position) < etl::distance(position,
_end - 1))
1261 create_element_front(*_begin);
1264 etl::move(_begin + 1, position, _begin);
1274 create_element_back(*(
_end - 1));
1277 etl::move_backward(position,
_end - 2,
_end - 1);
1285 ::new (p) T(value1, value2);
1296 template <
typename T1,
typename T2,
typename T3>
1305 if (insert_position ==
begin())
1310 ETL_INCREMENT_DEBUG_COUNT;
1313 else if (insert_position ==
end())
1318 ETL_INCREMENT_DEBUG_COUNT;
1319 position =
_end - 1;
1324 if (etl::distance(_begin, position) < etl::distance(position,
_end - 1))
1327 create_element_front(*_begin);
1330 etl::move(_begin + 1, position, _begin);
1340 create_element_back(*(
_end - 1));
1343 etl::move_backward(position,
_end - 2,
_end - 1);
1351 ::new (p) T(value1, value2, value3);
1362 template <
typename T1,
typename T2,
typename T3,
typename T4>
1371 if (insert_position ==
begin())
1376 ETL_INCREMENT_DEBUG_COUNT;
1379 else if (insert_position ==
end())
1384 ETL_INCREMENT_DEBUG_COUNT;
1385 position =
_end - 1;
1390 if (etl::distance(_begin, position) < etl::distance(position,
_end - 1))
1393 create_element_front(*_begin);
1396 etl::move(_begin + 1, position, _begin);
1406 create_element_back(*(
_end - 1));
1409 etl::move_backward(position,
_end - 2,
_end - 1);
1417 ::new (p) T(value1, value2, value3, value4);
1437 if (insert_position ==
begin())
1439 for (
size_t i = 0UL; i < n; ++i)
1441 create_element_front(value);
1446 else if (insert_position ==
end())
1448 for (
size_t i = 0UL; i < n; ++i)
1450 create_element_back(value);
1453 position =
_end -
static_cast<difference_type
>(n);
1461 if (distance(_begin, insert_position) <= difference_type(
current_size / 2))
1463 size_t n_insert = n;
1464 size_t n_move =
static_cast<size_t>(etl::distance(
begin(), position));
1465 size_t n_create_copy = etl::min(n_insert, n_move);
1466 size_t n_create_new = (n_insert > n_create_copy) ? n_insert - n_create_copy : 0;
1467 size_t n_copy_new = (n_insert > n_create_new) ? n_insert - n_create_new : 0;
1468 size_t n_copy_old = n_move - n_create_copy;
1471 iterator from = _begin +
static_cast<difference_type
>(n_create_copy) - 1;
1475 for (
size_t i = 0UL; i < n_create_new; ++i)
1477 create_element_front(value);
1481 for (
size_t i = 0UL; i < n_create_copy; ++i)
1483 create_element_front(*from);
1488 from = position -
static_cast<difference_type
>(n_copy_old);
1489 to = _begin +
static_cast<difference_type
>(n_create_copy);
1490 etl::move(from, from +
static_cast<difference_type
>(n_copy_old), to);
1493 to = position -
static_cast<difference_type
>(n_create_copy);
1494 etl::fill_n(to, n_copy_new, value);
1496 position = _begin +
static_cast<difference_type
>(n_move);
1500 size_t n_insert = n;
1501 size_t n_move =
static_cast<size_t>(etl::distance(position,
end()));
1502 size_t n_create_copy = etl::min(n_insert, n_move);
1503 size_t n_create_new = (n_insert > n_create_copy) ? n_insert - n_create_copy : 0;
1504 size_t n_copy_new = (n_insert > n_create_new) ? n_insert - n_create_new : 0;
1505 size_t n_copy_old = n_move - n_create_copy;
1508 for (
size_t i = 0UL; i < n_create_new; ++i)
1510 create_element_back(value);
1514 const_iterator from = position +
static_cast<difference_type
>(n_copy_old);
1516 for (
size_t i = 0UL; i < n_create_copy; ++i)
1518 create_element_back(*from);
1523 etl::move_backward(position, position +
static_cast<difference_type
>(n_copy_old),
1524 position +
static_cast<difference_type
>(n_insert + n_copy_old));
1527 etl::fill_n(position, n_copy_new, value);
1542 template <
typename TIterator>
1544 TIterator range_end)
1548 difference_type n = etl::distance(range_begin, range_end);
1552 if (insert_position ==
begin())
1554 create_element_front(
static_cast<size_t>(n), range_begin);
1558 else if (insert_position ==
end())
1560 for (difference_type i = 0; i < n; ++i)
1562 create_element_back(*range_begin);
1566 position =
_end - n;
1574 if (distance(_begin, insert_position) < difference_type(
current_size / 2))
1576 size_t n_insert =
static_cast<size_t>(n);
1577 size_t n_move =
static_cast<size_t>(etl::distance(
begin(), position));
1578 size_t n_create_copy = etl::min(n_insert, n_move);
1579 size_t n_create_new = (n_insert > n_create_copy) ? n_insert - n_create_copy : 0;
1580 size_t n_copy_new = (n_insert > n_create_new) ? n_insert - n_create_new : 0;
1581 size_t n_copy_old = n_move - n_create_copy;
1588 create_element_front(n_create_new, range_begin);
1591 create_element_front(n_create_copy, _begin +
static_cast<difference_type
>(n_create_new));
1594 from = position -
static_cast<difference_type
>(n_copy_old);
1595 to = _begin +
static_cast<difference_type
>(n_create_copy);
1596 etl::move(from, from +
static_cast<difference_type
>(n_copy_old), to);
1599 to = position -
static_cast<difference_type
>(n_create_copy);
1600 range_begin +=
static_cast<difference_type
>(n_create_new);
1601 etl::copy(range_begin, range_begin +
static_cast<difference_type
>(n_copy_new), to);
1603 position = _begin +
static_cast<difference_type
>(n_move);
1607 size_t n_insert =
static_cast<size_t>(n);
1608 size_t n_move =
static_cast<size_t>(etl::distance(position,
end()));
1609 size_t n_create_copy = etl::min(n_insert, n_move);
1610 size_t n_create_new = (n_insert > n_create_copy) ? n_insert - n_create_copy : 0;
1611 size_t n_copy_new = (n_insert > n_create_new) ? n_insert - n_create_new : 0;
1612 size_t n_copy_old = n_move - n_create_copy;
1615 TIterator item = range_begin +
static_cast<difference_type
>(n_insert - n_create_new);
1616 for (
size_t i = 0UL; i < n_create_new; ++i)
1618 create_element_back(*item);
1623 const_iterator from = position +
static_cast<difference_type
>(n_copy_old);
1625 for (
size_t i = 0UL; i < n_create_copy; ++i)
1627 create_element_back(*from);
1632 etl::move_backward(position, position +
static_cast<difference_type
>(n_copy_old),
1633 position +
static_cast<difference_type
>(n_insert + n_copy_old));
1637 etl::copy(item, item +
static_cast<difference_type
>(n_copy_new), position);
1652 iterator position(to_iterator(erase_position));
1657 if (position == _begin)
1659 destroy_element_front();
1662 else if (position ==
_end - 1)
1664 destroy_element_back();
1670 if (distance(_begin, position) < difference_type(
current_size / 2))
1672 etl::move_backward(_begin, position, position + 1);
1673 destroy_element_front();
1678 etl::move(position + 1,
_end, position);
1679 destroy_element_back();
1695 iterator position(to_iterator(range_begin));
1701 size_t length =
static_cast<size_t>(etl::distance(range_begin, range_end));
1704 if (position == _begin)
1706 for (
size_t i = 0UL; i < length; ++i)
1708 destroy_element_front();
1714 else if (position ==
_end -
static_cast<difference_type
>(length))
1716 for (
size_t i = 0UL; i < length; ++i)
1718 destroy_element_back();
1727 if (distance(_begin, position) < difference_type(
current_size / 2))
1730 etl::move_backward(_begin, position, position +
static_cast<difference_type
>(length));
1732 for (
size_t i = 0UL; i < length; ++i)
1734 destroy_element_front();
1737 position +=
static_cast<difference_type
>(length);
1743 etl::move(position +
static_cast<difference_type
>(length),
_end, position);
1745 for (
size_t i = 0UL; i < length; ++i)
1747 destroy_element_back();
1763 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(!
full(), ETL_ERROR(
deque_full));
1765 create_element_back(item);
1777 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(!
full(), ETL_ERROR(
deque_full));
1779 create_element_back(etl::move(item));
1783#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
1789 template <
typename... Args>
1792 ETL_ASSERT_CHECK_PUSH_POP(!
full(), ETL_ERROR(deque_full));
1794 ::new (&(*
_end)) T(etl::forward<Args>(args)...);
1797 ETL_INCREMENT_DEBUG_COUNT;
1812 ::new (&(*
_end)) T();
1815 ETL_INCREMENT_DEBUG_COUNT;
1824 template <
typename T1>
1829 ::new (&(*
_end)) T(value1);
1832 ETL_INCREMENT_DEBUG_COUNT;
1841 template <
typename T1,
typename T2>
1846 ::new (&(*
_end)) T(value1, value2);
1849 ETL_INCREMENT_DEBUG_COUNT;
1858 template <
typename T1,
typename T2,
typename T3>
1859 reference
emplace_back(
const T1& value1,
const T2& value2,
const T3& value3)
1863 ::new (&(*
_end)) T(value1, value2, value3);
1866 ETL_INCREMENT_DEBUG_COUNT;
1875 template <
typename T1,
typename T2,
typename T3,
typename T4>
1876 reference
emplace_back(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
1880 ::new (&(*
_end)) T(value1, value2, value3, value4);
1883 ETL_INCREMENT_DEBUG_COUNT;
1895 destroy_element_back();
1906 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(!
full(), ETL_ERROR(
deque_full));
1908 create_element_front(item);
1920 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(!
full(), ETL_ERROR(
deque_full));
1922 create_element_front(etl::move(item));
1926#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
1932 template <
typename... Args>
1935 ETL_ASSERT_CHECK_PUSH_POP(!
full(), ETL_ERROR(deque_full));
1938 ::new (&(*_begin)) T(etl::forward<Args>(args)...);
1940 ETL_INCREMENT_DEBUG_COUNT;
1956 ::new (&(*_begin)) T();
1958 ETL_INCREMENT_DEBUG_COUNT;
1967 template <
typename T1>
1973 ::new (&(*_begin)) T(value1);
1975 ETL_INCREMENT_DEBUG_COUNT;
1984 template <
typename T1,
typename T2>
1990 ::new (&(*_begin)) T(value1, value2);
1992 ETL_INCREMENT_DEBUG_COUNT;
2001 template <
typename T1,
typename T2,
typename T3>
2007 ::new (&(*_begin)) T(value1, value2, value3);
2009 ETL_INCREMENT_DEBUG_COUNT;
2018 template <
typename T1,
typename T2,
typename T3,
typename T4>
2019 reference
emplace_front(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
2024 ::new (&(*_begin)) T(value1, value2, value3, value4);
2026 ETL_INCREMENT_DEBUG_COUNT;
2038 destroy_element_front();
2049 void resize(
size_t new_size,
const value_type& value = value_type())
2058 destroy_element_back();
2066 for (
size_t i = 0UL; i < count; ++i)
2068 create_element_back(value);
2078 return distance(rhs, lhs);
2086 return distance(rhs, lhs);
2112 while (itr != rhs.end())
2125#ifdef ETL_IDEQUE_REPAIR_ENABLE
2129 virtual void repair() = 0;
2137 ideque(pointer p_buffer_,
size_t max_size_,
size_t buffer_size_)
2148 if ETL_IF_CONSTEXPR (etl::is_trivially_destructible<T>::value)
2151 ETL_RESET_DEBUG_COUNT;
2157 destroy_element_back();
2185 void create_element_front()
2188 ::new (&(*_begin)) T();
2190 ETL_INCREMENT_DEBUG_COUNT;
2196 template <
typename TIterator>
2197 void create_element_front(
size_t n, TIterator from)
2204 _begin -=
static_cast<difference_type
>(n);
2206 iterator item = _begin;
2209 ::new (&(*item)) T(*from);
2213 ETL_INCREMENT_DEBUG_COUNT;
2220 void create_element_back()
2222 ::new (&(*
_end)) T();
2225 ETL_INCREMENT_DEBUG_COUNT;
2231 void create_element_front(const_reference value)
2234 ::new (&(*_begin)) T(value);
2236 ETL_INCREMENT_DEBUG_COUNT;
2242 void create_element_back(const_reference value)
2244 ::new (&(*
_end)) T(value);
2247 ETL_INCREMENT_DEBUG_COUNT;
2254 void create_element_front(rvalue_reference value)
2257 ::new (&(*_begin)) T(etl::move(value));
2259 ETL_INCREMENT_DEBUG_COUNT;
2265 void create_element_back(rvalue_reference value)
2267 ::new (&(*
_end)) T(etl::move(value));
2270 ETL_INCREMENT_DEBUG_COUNT;
2277 void destroy_element_front()
2281 ETL_DECREMENT_DEBUG_COUNT;
2288 void destroy_element_back()
2293 ETL_DECREMENT_DEBUG_COUNT;
2299 template <
typename TIterator1,
typename TIterator2>
2300 static difference_type distance(
const TIterator1& range_begin,
const TIterator2& range_end)
2302 difference_type distance1 = distance(range_begin);
2303 difference_type distance2 = distance(range_end);
2305 return distance2 - distance1;
2312 template <
typename TIterator>
2313 static difference_type distance(
const TIterator& other)
2315 const difference_type index = other.get_index();
2316 const difference_type reference_index = other.container()._begin.index;
2317 const difference_type buffer_size =
static_cast<difference_type
>(other.container().
Buffer_Size);
2319 if (index < reference_index)
2321 return buffer_size + index - reference_index;
2325 return index - reference_index;
2343#if defined(ETL_POLYMORPHIC_DEQUE) || defined(ETL_POLYMORPHIC_CONTAINERS) || defined(ETL_IDEQUE_REPAIR_ENABLE)
2363 template <
typename T, const
size_t MAX_SIZE_>
2368 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
2372 static ETL_CONSTANT
size_t Buffer_Size = MAX_SIZE + 1;
2376 typedef T value_type;
2378 typedef const T* const_pointer;
2379 typedef T& reference;
2380 typedef const T& const_reference;
2381 typedef size_t size_type;
2382 typedef typename etl::iterator_traits<pointer>::difference_type difference_type;
2388 :
etl::
ideque<T>(reinterpret_cast<T*>(buffer.raw), MAX_SIZE, Buffer_Size)
2405 :
etl::
ideque<T>(reinterpret_cast<T*>(buffer.raw), MAX_SIZE, Buffer_Size)
2425 while (itr != other.end())
2437 template <
typename TIterator>
2438 deque(TIterator begin_, TIterator end_,
typename etl::enable_if<!etl::is_integral<TIterator>::value,
int>
::type = 0)
2439 :
etl::
ideque<T>(reinterpret_cast<T*>(buffer.raw), MAX_SIZE, Buffer_Size)
2441 this->
assign(begin_, end_);
2447 explicit deque(
size_t n, const_reference value = value_type())
2448 :
etl::
ideque<T>(reinterpret_cast<T*>(buffer.raw), MAX_SIZE, Buffer_Size)
2453#if ETL_HAS_INITIALIZER_LIST
2457 deque(std::initializer_list<T> init)
2460 this->
assign(init.begin(), init.end());
2487 while (itr != rhs.end())
2501#ifdef ETL_IDEQUE_REPAIR_ENABLE
2502 virtual void repair() ETL_OVERRIDE
2507#if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED
2520 template <
typename T, const
size_t MAX_SIZE_>
2521 ETL_CONSTANT
size_t deque<T, MAX_SIZE_>::MAX_SIZE;
2526#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
2527 template <
typename... T>
2528 deque(T...) -> deque<
typename etl::common_type_t<T...>,
sizeof...(T)>;
2534#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
2535 template <
typename T,
typename... TValues>
2536 constexpr auto make_deque(TValues&&... values) ->
etl::deque<T,
sizeof...(TValues)>
2538 return {etl::forward<T>(values)...};
2549 template <
typename T>
2562 template <
typename T>
2565 return !(lhs == rhs);
2575 template <
typename T>
2578 return etl::lexicographical_compare(lhs.
begin(), lhs.
end(), rhs.
begin(), rhs.
end());
2589 template <
typename T>
2592 return !(lhs > rhs);
2602 template <
typename T>
2616 template <
typename T>
2619 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:483
Iterator.
Definition deque.h:240
reference emplace_front(const T1 &value1)
Definition deque.h:1968
reference emplace_back(const T1 &value1, const T2 &value2, const T3 &value3)
Definition deque.h:1859
const_reverse_iterator crbegin() const
Gets a const reverse iterator to the end of the deque.
Definition deque.h:936
void clear()
Clears the deque.
Definition deque.h:968
iterator erase(const_iterator erase_position)
Definition deque.h:1650
const size_type CAPACITY
The maximum number of elements in the deque.
Definition deque.h:210
void pop_back()
Removes the oldest item from the deque.
Definition deque.h:1891
ideque & operator=(const ideque &rhs)
Assignment operator.
Definition deque.h:2092
const_reverse_iterator rbegin() const
Gets a const reverse iterator to the end of the deque.
Definition deque.h:928
ETL_DECLARE_DEBUG_COUNT
Internal debugging.
Definition deque.h:212
void resize(size_t new_size, const value_type &value=value_type())
Definition deque.h:2049
iterator emplace(const_iterator insert_position, const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition deque.h:1363
iterator begin()
Gets an iterator to the beginning of the deque.
Definition deque.h:872
reference front()
Definition deque.h:827
reference at(size_t index)
Definition deque.h:771
reference emplace_back(const T1 &value1, const T2 &value2)
Definition deque.h:1842
pointer p_buffer
Iterator to the _end item in the deque.
Definition deque.h:2178
friend difference_type operator-(const iterator &lhs, const iterator &rhs)
Definition deque.h:2076
reference emplace_front(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition deque.h:2019
reference emplace_front()
Definition deque.h:1951
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:734
void initialise()
Initialise the deque.
Definition deque.h:2146
reference operator[](size_t index)
Definition deque.h:801
~deque_base()
Destructor.
Definition deque.h:207
iterator _end
Iterator to the _begin item in the deque.
Definition deque.h:2177
reference emplace_front(const T1 &value1, const T2 &value2, const T3 &value3)
Definition deque.h:2002
size_type size() const
Definition deque.h:142
const_reference at(size_t index) const
Definition deque.h:787
const_reverse_iterator crend() const
Gets a const reverse iterator to the beginning of the deque.
Definition deque.h:960
const size_type Buffer_Size
The number of elements in the buffer.
Definition deque.h:211
iterator end()
Gets an iterator to the end of the deque.
Definition deque.h:896
const_iterator end() const
Gets a const iterator to the end of the deque.
Definition deque.h:904
void push_front(const_reference item)
Definition deque.h:1904
size_type max_size() const
Definition deque.h:169
~ideque()
Destructor.
Definition deque.h:2352
iterator erase(const_iterator range_begin, const_iterator range_end)
Definition deque.h:1693
iterator emplace(const_iterator insert_position, const T1 &value1)
Definition deque.h:1165
deque(const deque &other)
Copy constructor.
Definition deque.h:2404
friend difference_type operator-(const const_iterator &lhs, const const_iterator &rhs)
Definition deque.h:2084
iterator emplace(const_iterator insert_position, const T1 &value1, const T2 &value2)
Definition deque.h:1231
iterator insert(const_iterator insert_position, size_type n, const value_type &value)
Definition deque.h:1431
enable_if<!etl::is_integral< TIterator >::value, iterator >::type insert(const_iterator insert_position, TIterator range_begin, TIterator range_end)
Definition deque.h:1543
bool full() const
Definition deque.h:160
const_reference operator[](size_t index) const
Definition deque.h:813
size_type capacity() const
Definition deque.h:178
const_reference back() const
Definition deque.h:863
bool empty() const
Definition deque.h:151
void repair()
Fix the internal pointers after a low level memory copy.
Definition deque.h:2504
const_reverse_iterator rend() const
Gets a const reverse iterator to the beginning of the deque.
Definition deque.h:952
const_iterator cend() const
Gets a const iterator to the end of the deque.
Definition deque.h:912
reference emplace_back(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition deque.h:1876
reference emplace_back()
Definition deque.h:1808
deque_base(size_t max_size_, size_t buffer_size_)
Constructor.
Definition deque.h:197
reference emplace_front(const T1 &value1, const T2 &value2)
Definition deque.h:1985
void assign(size_type n, const value_type &value)
Definition deque.h:752
deque()
Default constructor.
Definition deque.h:2387
reference back()
Definition deque.h:851
iterator emplace(const_iterator insert_position, const T1 &value1, const T2 &value2, const T3 &value3)
Definition deque.h:1297
reverse_iterator rbegin()
Gets a reverse iterator to the end of the deque.
Definition deque.h:920
void fill(const T &value)
Fills the deque.
Definition deque.h:976
void pop_front()
Removes the oldest item from the deque.
Definition deque.h:2034
reference emplace_back(const T1 &value1)
Definition deque.h:1825
void push_back(const_reference item)
Definition deque.h:1761
const_iterator cbegin() const
Gets a const iterator to the beginning of the deque.
Definition deque.h:888
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:2438
~deque()
Destructor.
Definition deque.h:2396
reverse_iterator rend()
Gets a reverse iterator to the beginning of the deque.
Definition deque.h:944
const_reference front() const
Definition deque.h:839
deque(size_t n, const_reference value=value_type())
Assigns data to the deque.
Definition deque.h:2447
size_t available() const
Definition deque.h:187
deque & operator=(const deque &rhs)
Assignment operator.
Definition deque.h:2467
const_iterator begin() const
Gets a const iterator to the beginning of the deque.
Definition deque.h:880
iterator insert(const_iterator insert_position, const value_type &value)
Definition deque.h:988
void repair_buffer(pointer p_buffer_)
Fix the internal pointers after a low level memory copy.
Definition deque.h:2168
size_type current_size
The current number of elements in the deque.
Definition deque.h:209
ideque(pointer p_buffer_, size_t max_size_, size_t buffer_size_)
Constructor.
Definition deque.h:2137
#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
ETL_CONSTEXPR14 bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1078
bool operator>(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1130
bool operator>=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1144
ETL_CONSTEXPR14 bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1090
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1103
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1117
iterator
Definition iterator.h:482
ETL_CONSTEXPR14 bool operator==(const etl::to_arithmetic_result< T > &lhs, const etl::to_arithmetic_result< T > &rhs)
Equality test for etl::to_arithmetic_result.
Definition to_arithmetic.h:903
ETL_CONSTEXPR14 bool operator!=(const etl::to_arithmetic_result< T > &lhs, const etl::to_arithmetic_result< T > &rhs)
Inequality test for etl::to_arithmetic_result.
Definition to_arithmetic.h:937