31#ifndef ETL_DEQUE_INCLUDED
32#define ETL_DEQUE_INCLUDED
68 deque_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
69 :
exception(reason_, file_name_, line_number_)
82 deque_full(string_type file_name_, numeric_type line_number_)
83 :
etl::deque_exception(ETL_ERROR_TEXT(
"deque:full", ETL_DEQUE_FILE_ID
"A"), file_name_, line_number_)
96 deque_empty(string_type file_name_, numeric_type line_number_)
97 :
etl::deque_exception(ETL_ERROR_TEXT(
"deque:empty", ETL_DEQUE_FILE_ID
"B"), file_name_, line_number_)
110 deque_out_of_bounds(string_type file_name_, numeric_type line_number_)
111 :
etl::deque_exception(ETL_ERROR_TEXT(
"deque:bounds", ETL_DEQUE_FILE_ID
"C"), file_name_, line_number_)
120 class deque_incompatible_type :
public deque_exception
124 deque_incompatible_type(string_type file_name_, numeric_type line_number_)
125 : deque_exception(ETL_ERROR_TEXT(
"deque:type", ETL_DEQUE_FILE_ID
"D"), file_name_, line_number_)
138 typedef size_t size_type;
224 template <
typename T>
229 typedef T value_type;
230 typedef size_t size_type;
231 typedef T& reference;
232 typedef const T& const_reference;
234 typedef T&& rvalue_reference;
237 typedef const T* const_pointer;
238 typedef typename etl::iterator_traits<pointer>::difference_type difference_type;
243 class iterator :
public etl::iterator<ETL_OR_STD::random_access_iterator_tag, T>
248 friend class const_iterator;
259 iterator(
const iterator& other)
261 , p_deque(other.p_deque)
267 iterator& operator =(
const iterator& other)
270 p_deque = other.p_deque;
271 p_buffer = other.p_buffer;
277 iterator& operator ++()
279 index = (
static_cast<size_t>(index) == p_deque->Buffer_Size - 1) ? 0 : index + 1;
285 iterator operator ++(
int)
287 iterator previous(*
this);
288 index = (
static_cast<size_t>(index) == p_deque->Buffer_Size - 1) ? 0 : index + 1;
294 iterator& operator +=(difference_type offset)
299 index = (
static_cast<size_t>(index) > p_deque->Buffer_Size - 1) ? index - p_deque->Buffer_Size : index;
303 operator -= (-offset);
310 iterator& operator -=(difference_type offset)
315 index = (index < 0) ? index + p_deque->Buffer_Size : index;
319 operator += (-offset);
326 iterator& operator --()
328 index = (index == 0) ? p_deque->Buffer_Size - 1 : index - 1;
334 iterator operator --(
int)
336 iterator previous(*
this);
337 index = (index == 0) ? p_deque->Buffer_Size - 1 : index - 1;
343 reference operator *()
const
345 return p_buffer[index];
349 pointer operator ->()
const
351 return &p_buffer[index];
355 reference operator [](
size_t i)
357 iterator result(*
this);
364 const_reference operator [](
size_t i)
const
366 iterator result(*
this);
373 friend iterator operator +(
const iterator& lhs, difference_type offset)
375 iterator result(lhs);
381 friend iterator operator +(difference_type offset,
const iterator& lhs)
383 iterator result(lhs);
389 friend iterator operator -(
const iterator& lhs, difference_type offset)
391 iterator result(lhs);
397 friend bool operator == (
const iterator& lhs,
const iterator& rhs)
399 return lhs.index == rhs.index;
403 friend bool operator != (
const iterator& lhs,
const iterator& rhs)
405 return !(lhs == rhs);
409 friend bool operator < (
const iterator& lhs,
const iterator& rhs)
411 const difference_type lhs_index = lhs.get_index();
412 const difference_type rhs_index = rhs.get_index();
413 const difference_type reference_index = lhs.container().
begin().get_index();
414 const size_t buffer_size = lhs.container().
max_size() + 1;
416 const difference_type lhs_distance = (lhs_index < reference_index) ? buffer_size + lhs_index - reference_index : lhs_index - reference_index;
417 const difference_type rhs_distance = (rhs_index < reference_index) ? buffer_size + rhs_index - reference_index : rhs_index - reference_index;
419 return lhs_distance < rhs_distance;
423 friend bool operator <= (
const iterator& lhs,
const iterator& rhs)
429 friend bool operator > (
const iterator& lhs,
const iterator& rhs)
435 friend bool operator >= (
const iterator& lhs,
const iterator& rhs)
441 difference_type get_index()
const
447 ideque& container()
const
453 pointer get_buffer()
const
459 void swap(iterator& other)
461 using ETL_OR_STD::swap;
463 swap(index, other.index);
469 difference_type distance(difference_type firstIndex, difference_type index_)
const
471 if (index_ < firstIndex)
473 return p_deque->Buffer_Size + index_ - firstIndex;
477 return index_ - firstIndex;
482 iterator(difference_type index_, ideque& the_deque, pointer p_buffer_)
484 , p_deque(&the_deque)
489 difference_type index;
497 class const_iterator :
public etl::iterator<ETL_OR_STD::random_access_iterator_tag, const T>
512 const_iterator(
const const_iterator& other)
514 , p_deque(other.p_deque)
522 , p_deque(other.p_deque)
528 const_iterator& operator =(
const const_iterator& other)
531 p_deque = other.p_deque;
532 p_buffer = other.p_buffer;
540 p_deque = other.p_deque;
541 p_buffer = other.p_buffer;
547 const_iterator& operator ++()
549 index = (
static_cast<size_t>(index) == p_deque->Buffer_Size - 1) ? 0 : index + 1;
555 const_iterator operator ++(
int)
557 const_iterator previous(*
this);
558 index = (
static_cast<size_t>(index) == p_deque->Buffer_Size - 1) ? 0 : index + 1;
564 const_iterator& operator +=(difference_type offset)
569 index = (
static_cast<size_t>(index) > p_deque->Buffer_Size - 1) ? index - p_deque->Buffer_Size : index;
573 operator -= (-offset);
580 const_iterator& operator -=(difference_type offset)
585 index = (index < 0) ? static_cast<size_t>(index) + p_deque->Buffer_Size : index;
589 operator += (-offset);
596 const_iterator& operator --()
598 index = (index == 0) ? p_deque->Buffer_Size - 1 : index - 1;
604 const_iterator operator --(
int)
606 const_iterator previous(*
this);
607 index = (index == 0) ? p_deque->Buffer_Size - 1 : index - 1;
613 const_reference operator *()
const
615 return p_buffer[index];
619 const_pointer operator ->()
const
621 return &p_buffer[index];
625 reference operator [](
size_t i)
634 friend const_iterator operator +(
const const_iterator& lhs, difference_type offset)
636 const_iterator result(lhs);
642 friend const_iterator operator +(difference_type offset,
const const_iterator& lhs)
644 const_iterator result(lhs);
650 friend const_iterator operator -(
const const_iterator& lhs, difference_type offset)
652 const_iterator result(lhs);
658 friend bool operator == (
const const_iterator& lhs,
const const_iterator& rhs)
660 return lhs.index == rhs.index;
664 friend bool operator != (
const const_iterator& lhs,
const const_iterator& rhs)
666 return !(lhs == rhs);
670 friend bool operator < (
const const_iterator& lhs,
const const_iterator& rhs)
672 const difference_type lhs_index = lhs.get_index();
673 const difference_type rhs_index = rhs.get_index();
674 const difference_type reference_index = lhs.container().
begin().get_index();
675 const size_t buffer_size = lhs.container().
max_size() + 1UL;
677 const difference_type lhs_distance = (lhs_index < reference_index) ? buffer_size + lhs_index - reference_index : lhs_index - reference_index;
678 const difference_type rhs_distance = (rhs_index < reference_index) ? buffer_size + rhs_index - reference_index : rhs_index - reference_index;
680 return lhs_distance < rhs_distance;
684 friend bool operator <= (
const const_iterator& lhs,
const const_iterator& rhs)
690 friend bool operator > (
const const_iterator& lhs,
const const_iterator& rhs)
696 friend bool operator >= (
const const_iterator& lhs,
const const_iterator& rhs)
702 difference_type get_index()
const
708 ideque& container()
const
714 pointer get_buffer()
const
720 void swap(const_iterator& other)
722 ETL_OR_STD::swap(index, other.index);
728 difference_type distance(difference_type firstIndex, difference_type index_)
const
730 if (index_ < firstIndex)
732 return p_deque->Buffer_Size + index_ - firstIndex;
736 return index_ - firstIndex;
741 const_iterator(difference_type index_, ideque& the_deque, pointer p_buffer_)
743 , p_deque(&the_deque)
748 difference_type index;
753 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
754 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
759 template<
typename TIterator>
761 assign(TIterator range_begin, TIterator range_end)
765 while (range_begin != range_end)
778 void assign(size_type n,
const value_type& value)
786 create_element_back(value);
796 reference
at(
size_t index)
811 const_reference
at(
size_t index)
const
934 return reverse_iterator(
end());
942 return const_reverse_iterator(
end());
950 return const_reverse_iterator(
cend());
958 return reverse_iterator(
begin());
964 const_reverse_iterator
rend()
const
966 return const_reverse_iterator(
begin());
972 const_reverse_iterator
crend()
const
974 return const_reverse_iterator(
cbegin());
1001 iterator position(to_iterator(insert_position));
1005 if (insert_position ==
begin())
1007 create_element_front(value);
1010 else if (insert_position ==
end())
1012 create_element_back(value);
1013 position =
_end - 1;
1018 if (etl::distance(_begin, position) < etl::distance(position,
_end - 1))
1021 create_element_front(*_begin);
1024 etl::move(_begin + 1, position, _begin);
1027 *--position = value;
1032 create_element_back(*(
_end - 1));
1035 etl::move_backward(position,
_end - 2,
_end - 1);
1058 if (insert_position ==
begin())
1060 create_element_front(etl::move(value));
1063 else if (insert_position ==
end())
1065 create_element_back(etl::move(value));
1066 position =
_end - 1;
1071 if (etl::distance(_begin, position) < etl::distance(position,
_end - 1))
1074 create_element_front(etl::move(*_begin));
1077 etl::move(_begin + 1, position, _begin);
1080 *--position = etl::move(value);
1085 create_element_back(etl::move(*(
_end - 1)));
1088 etl::move_backward(position,
_end - 2,
_end - 1);
1091 *position = etl::move(value);
1104#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
1105 template <
typename ... Args>
1114 if (insert_position ==
begin())
1119 ETL_INCREMENT_DEBUG_COUNT;
1122 else if (insert_position ==
end())
1127 ETL_INCREMENT_DEBUG_COUNT;
1128 position =
_end - 1;
1133 if (etl::distance(_begin, position) < etl::distance(position,
_end - 1))
1136 create_element_front(*_begin);
1139 etl::move(_begin + 1, position, _begin);
1149 create_element_back(*(
_end - 1));
1152 etl::move_backward(position,
_end - 2,
_end - 1);
1160 ::new (p) T(etl::forward<Args>(args)...);
1172 template <
typename T1>
1181 if (insert_position ==
begin())
1186 ETL_INCREMENT_DEBUG_COUNT;
1189 else if (insert_position ==
end())
1194 ETL_INCREMENT_DEBUG_COUNT;
1195 position =
_end - 1;
1200 if (etl::distance(_begin, position) < etl::distance(position,
_end - 1))
1203 create_element_front(*_begin);
1206 etl::move(_begin + 1, position, _begin);
1216 create_element_back(*(
_end - 1));
1219 etl::move_backward(position,
_end - 2,
_end - 1);
1227 ::new (p) T(value1);
1237 template <
typename T1,
typename T2>
1246 if (insert_position ==
begin())
1251 ETL_INCREMENT_DEBUG_COUNT;
1254 else if (insert_position ==
end())
1259 ETL_INCREMENT_DEBUG_COUNT;
1260 position =
_end - 1;
1265 if (etl::distance(_begin, position) < etl::distance(position,
_end - 1))
1268 create_element_front(*_begin);
1271 etl::move(_begin + 1, position, _begin);
1281 create_element_back(*(
_end - 1));
1284 etl::move_backward(position,
_end - 2,
_end - 1);
1292 ::new (p) T(value1, value2);
1302 template <
typename T1,
typename T2,
typename T3>
1311 if (insert_position ==
begin())
1316 ETL_INCREMENT_DEBUG_COUNT;
1319 else if (insert_position ==
end())
1324 ETL_INCREMENT_DEBUG_COUNT;
1325 position =
_end - 1;
1330 if (etl::distance(_begin, position) < etl::distance(position,
_end - 1))
1333 create_element_front(*_begin);
1336 etl::move(_begin + 1, position, _begin);
1346 create_element_back(*(
_end - 1));
1349 etl::move_backward(position,
_end - 2,
_end - 1);
1357 ::new (p) T(value1, value2, value3);
1367 template <
typename T1,
typename T2,
typename T3,
typename T4>
1376 if (insert_position ==
begin())
1381 ETL_INCREMENT_DEBUG_COUNT;
1384 else if (insert_position ==
end())
1389 ETL_INCREMENT_DEBUG_COUNT;
1390 position =
_end - 1;
1395 if (etl::distance(_begin, position) < etl::distance(position,
_end - 1))
1398 create_element_front(*_begin);
1401 etl::move(_begin + 1, position, _begin);
1411 create_element_back(*(
_end - 1));
1414 etl::move_backward(position,
_end - 2,
_end - 1);
1422 ::new (p) T(value1, value2, value3, value4);
1441 if (insert_position ==
begin())
1443 for (
size_t i = 0UL; i < n; ++i)
1445 create_element_front(value);
1450 else if (insert_position ==
end())
1452 for (
size_t i = 0UL; i < n; ++i)
1454 create_element_back(value);
1457 position =
_end - n;
1465 if (distance(_begin, insert_position) <= difference_type(
current_size / 2))
1467 size_t n_insert = n;
1468 size_t n_move = etl::distance(
begin(), position);
1469 size_t n_create_copy = etl::min(n_insert, n_move);
1470 size_t n_create_new = (n_insert > n_create_copy) ? n_insert - n_create_copy : 0;
1471 size_t n_copy_new = (n_insert > n_create_new) ? n_insert - n_create_new : 0;
1472 size_t n_copy_old = n_move - n_create_copy;
1475 iterator from = _begin + n_create_copy - 1;
1479 for (
size_t i = 0UL; i < n_create_new; ++i)
1481 create_element_front(value);
1485 for (
size_t i = 0UL; i < n_create_copy; ++i)
1487 create_element_front(*from);
1492 from = position - n_copy_old;
1493 to = _begin + n_create_copy;
1494 etl::move(from, from + n_copy_old, to);
1497 to = position - n_create_copy;
1498 etl::fill_n(to, n_copy_new, value);
1500 position = _begin + n_move;
1504 size_t n_insert = n;
1505 size_t n_move = etl::distance(position,
end());
1506 size_t n_create_copy = etl::min(n_insert, n_move);
1507 size_t n_create_new = (n_insert > n_create_copy) ? n_insert - n_create_copy : 0;
1508 size_t n_copy_new = (n_insert > n_create_new) ? n_insert - n_create_new : 0;
1509 size_t n_copy_old = n_move - n_create_copy;
1512 for (
size_t i = 0UL; i < n_create_new; ++i)
1514 create_element_back(value);
1520 for (
size_t i = 0UL; i < n_create_copy; ++i)
1522 create_element_back(*from);
1527 etl::move_backward(position, position + n_copy_old, position + n_insert + n_copy_old);
1530 etl::fill_n(position, n_copy_new, value);
1544 template<
typename TIterator>
1550 difference_type n = etl::distance(range_begin, range_end);
1554 if (insert_position ==
begin())
1556 create_element_front(n, range_begin);
1560 else if (insert_position ==
end())
1562 for (difference_type i = 0; i < n; ++i)
1564 create_element_back(*range_begin);
1568 position =
_end - n;
1576 if (distance(_begin, insert_position) < difference_type(
current_size / 2))
1578 size_t n_insert = n;
1579 size_t n_move = etl::distance(
begin(), position);
1580 size_t n_create_copy = etl::min(n_insert, n_move);
1581 size_t n_create_new = (n_insert > n_create_copy) ? n_insert - n_create_copy : 0;
1582 size_t n_copy_new = (n_insert > n_create_new) ? n_insert - n_create_new : 0;
1583 size_t n_copy_old = n_move - n_create_copy;
1590 create_element_front(n_create_new, range_begin);
1593 create_element_front(n_create_copy, _begin + n_create_new);
1596 from = position - n_copy_old;
1597 to = _begin + n_create_copy;
1598 etl::move(from, from + n_copy_old, to);
1601 to = position - n_create_copy;
1602 range_begin += n_create_new;
1603 etl::copy(range_begin, range_begin + n_copy_new, to);
1605 position = _begin + n_move;
1609 size_t n_insert = n;
1610 size_t n_move = etl::distance(position,
end());
1611 size_t n_create_copy = etl::min(n_insert, n_move);
1612 size_t n_create_new = (n_insert > n_create_copy) ? n_insert - n_create_copy : 0;
1613 size_t n_copy_new = (n_insert > n_create_new) ? n_insert - n_create_new : 0;
1614 size_t n_copy_old = n_move - n_create_copy;
1617 TIterator item = range_begin + (n - n_create_new);
1618 for (
size_t i = 0UL; i < n_create_new; ++i)
1620 create_element_back(*item);
1627 for (
size_t i = 0UL; i < n_create_copy; ++i)
1629 create_element_back(*from);
1634 etl::move_backward(position, position + n_copy_old, position + n_insert + n_copy_old);
1638 etl::copy(item, item + 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();
1694 iterator position(to_iterator(range_begin));
1699 size_t length = etl::distance(range_begin, range_end);
1702 if (position == _begin)
1704 for (
size_t i = 0UL; i < length; ++i)
1706 destroy_element_front();
1712 else if (position ==
_end - length)
1714 for (
size_t i = 0UL; i < length; ++i)
1716 destroy_element_back();
1725 if (distance(_begin, position) < difference_type(
current_size / 2))
1728 etl::move_backward(_begin, position, position + length);
1730 for (
size_t i = 0UL; i < length; ++i)
1732 destroy_element_front();
1741 etl::move(position + length,
_end, position);
1743 for (
size_t i = 0UL; i < length; ++i)
1745 destroy_element_back();
1760 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(!
full(), ETL_ERROR(
deque_full));
1762 create_element_back(item);
1773 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(!
full(), ETL_ERROR(
deque_full));
1775 create_element_back(etl::move(item));
1779#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
1784 template <
typename ... Args>
1787 ETL_ASSERT_CHECK_PUSH_POP(!
full(), ETL_ERROR(deque_full));
1789 ::new (&(*
_end)) T(etl::forward<Args>(args)...);
1792 ETL_INCREMENT_DEBUG_COUNT;
1806 ::new (&(*
_end)) T();
1809 ETL_INCREMENT_DEBUG_COUNT;
1817 template <
typename T1>
1822 ::new (&(*
_end)) T(value1);
1825 ETL_INCREMENT_DEBUG_COUNT;
1833 template <
typename T1,
typename T2>
1838 ::new (&(*
_end)) T(value1, value2);
1841 ETL_INCREMENT_DEBUG_COUNT;
1849 template <
typename T1,
typename T2,
typename T3>
1850 reference
emplace_back(
const T1& value1,
const T2& value2,
const T3& value3)
1854 ::new (&(*
_end)) T(value1, value2, value3);
1857 ETL_INCREMENT_DEBUG_COUNT;
1865 template <
typename T1,
typename T2,
typename T3,
typename T4>
1866 reference
emplace_back(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
1870 ::new (&(*
_end)) T(value1, value2, value3, value4);
1873 ETL_INCREMENT_DEBUG_COUNT;
1885 destroy_element_back();
1895 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(!
full(), ETL_ERROR(
deque_full));
1897 create_element_front(item);
1908 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(!
full(), ETL_ERROR(
deque_full));
1910 create_element_front(etl::move(item));
1914#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
1919 template <
typename ... Args>
1922 ETL_ASSERT_CHECK_PUSH_POP(!
full(), ETL_ERROR(deque_full));
1925 ::new (&(*_begin)) T(etl::forward<Args>(args)...);
1927 ETL_INCREMENT_DEBUG_COUNT;
1942 ::new (&(*_begin)) T();
1944 ETL_INCREMENT_DEBUG_COUNT;
1952 template <
typename T1>
1958 ::new (&(*_begin)) T(value1);
1960 ETL_INCREMENT_DEBUG_COUNT;
1968 template <
typename T1,
typename T2>
1974 ::new (&(*_begin)) T(value1, value2);
1976 ETL_INCREMENT_DEBUG_COUNT;
1984 template <
typename T1,
typename T2,
typename T3>
1990 ::new (&(*_begin)) T(value1, value2, value3);
1992 ETL_INCREMENT_DEBUG_COUNT;
2000 template <
typename T1,
typename T2,
typename T3,
typename T4>
2001 reference
emplace_front(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
2006 ::new (&(*_begin)) T(value1, value2, value3, value4);
2008 ETL_INCREMENT_DEBUG_COUNT;
2020 destroy_element_front();
2029 void resize(
size_t new_size,
const value_type& value = value_type())
2038 destroy_element_back();
2046 for (
size_t i = 0UL; i < count; ++i)
2048 create_element_back(value);
2058 return distance(rhs, lhs);
2066 return distance(rhs, lhs);
2092 while (itr != rhs.end())
2105#ifdef ETL_IDEQUE_REPAIR_ENABLE
2109 virtual void repair() = 0;
2117 ideque(pointer p_buffer_,
size_t max_size_,
size_t buffer_size_)
2128 if ETL_IF_CONSTEXPR(etl::is_trivially_destructible<T>::value)
2131 ETL_RESET_DEBUG_COUNT;
2137 destroy_element_back();
2165 void create_element_front()
2168 ::new (&(*_begin)) T();
2170 ETL_INCREMENT_DEBUG_COUNT;
2176 template <
typename TIterator>
2177 void create_element_front(
size_t n, TIterator from)
2186 iterator item = _begin;
2190 ::new (&(*item)) T(*from);
2194 ETL_INCREMENT_DEBUG_COUNT;
2201 void create_element_back()
2203 ::new (&(*
_end)) T();
2206 ETL_INCREMENT_DEBUG_COUNT;
2212 void create_element_front(const_reference value)
2215 ::new (&(*_begin)) T(value);
2217 ETL_INCREMENT_DEBUG_COUNT;
2223 void create_element_back(const_reference value)
2225 ::new (&(*
_end)) T(value);
2228 ETL_INCREMENT_DEBUG_COUNT;
2235 void create_element_front(rvalue_reference value)
2238 ::new (&(*_begin)) T(etl::move(value));
2240 ETL_INCREMENT_DEBUG_COUNT;
2246 void create_element_back(rvalue_reference value)
2248 ::new (&(*
_end)) T(etl::move(value));
2251 ETL_INCREMENT_DEBUG_COUNT;
2258 void destroy_element_front()
2262 ETL_DECREMENT_DEBUG_COUNT;
2269 void destroy_element_back()
2274 ETL_DECREMENT_DEBUG_COUNT;
2280 template <
typename TIterator1,
typename TIterator2>
2281 static difference_type distance(
const TIterator1& range_begin,
const TIterator2& range_end)
2283 difference_type distance1 = distance(range_begin);
2284 difference_type distance2 = distance(range_end);
2286 return distance2 - distance1;
2292 template <
typename TIterator>
2293 static difference_type distance(
const TIterator& other)
2295 const difference_type index = other.get_index();
2296 const difference_type reference_index = other.container()._begin.index;
2297 const size_t buffer_size = other.container().Buffer_Size;
2299 if (index < reference_index)
2301 return buffer_size + index - reference_index;
2305 return index - reference_index;
2323#if defined(ETL_POLYMORPHIC_DEQUE) || defined(ETL_POLYMORPHIC_CONTAINERS) || defined(ETL_IDEQUE_REPAIR_ENABLE)
2343 template <
typename T, const
size_t MAX_SIZE_>
2348 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
2352 static ETL_CONSTANT
size_t Buffer_Size = MAX_SIZE + 1;
2356 typedef T value_type;
2358 typedef const T* const_pointer;
2359 typedef T& reference;
2360 typedef const T& const_reference;
2361 typedef size_t size_type;
2362 typedef typename etl::iterator_traits<pointer>::difference_type difference_type;
2368 :
etl::
ideque<T>(reinterpret_cast<T*>(buffer.raw), MAX_SIZE, Buffer_Size)
2385 :
etl::
ideque<T>(reinterpret_cast<T*>(buffer.raw), MAX_SIZE, Buffer_Size)
2405 while (itr != other.end())
2417 template <
typename TIterator>
2419 :
etl::
ideque<T>(reinterpret_cast<T*>(buffer.raw), MAX_SIZE, Buffer_Size)
2421 this->
assign(begin_, end_);
2427 explicit deque(
size_t n, const_reference value = value_type())
2428 :
etl::
ideque<T>(reinterpret_cast<T*>(buffer.raw), MAX_SIZE, Buffer_Size)
2433#if ETL_HAS_INITIALIZER_LIST
2437 deque(std::initializer_list<T> init)
2440 this->
assign(init.begin(), init.end());
2467 while (itr != rhs.end())
2481#ifdef ETL_IDEQUE_REPAIR_ENABLE
2482 virtual void repair() ETL_OVERRIDE
2487#if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED
2500 template <
typename T, const
size_t MAX_SIZE_>
2501 ETL_CONSTANT
size_t deque<T, MAX_SIZE_>::MAX_SIZE;
2506#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
2507 template <
typename... T>
2508 deque(T...) -> deque<
typename etl::common_type_t<T...>,
sizeof...(T)>;
2514#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
2515 template <
typename T,
typename... TValues>
2516 constexpr auto make_deque(TValues&&... values) ->
etl::deque<T,
sizeof...(TValues)>
2518 return { etl::forward<T>(values)... };
2529 template <
typename T>
2542 template <
typename T>
2545 return !(lhs == rhs);
2555 template <
typename T>
2558 return etl::lexicographical_compare(lhs.
begin(),
2571 template <
typename T>
2574 return !(lhs > rhs);
2584 template <
typename T>
2597 template <
typename T>
2600 return !(lhs < rhs);
void swap(etl::array_view< T > &lhs, etl::array_view< T > &rhs) ETL_NOEXCEPT
Swaps the values.
Definition array_view.h:650
Const Iterator.
Definition deque.h:498
Iterator.
Definition deque.h:244
ETL_CONSTEXPR14 bool operator==(const etl::expected< TValue, TError > &lhs, const etl::expected< TValue2, TError2 > &rhs)
Equivalence operators.
Definition expected.h:962
reference emplace_front(const T1 &value1)
Definition deque.h:1953
reference emplace_back(const T1 &value1, const T2 &value2, const T3 &value3)
Definition deque.h:1850
const_reverse_iterator crbegin() const
Gets a const reverse iterator to the end of the deque.
Definition deque.h:948
void clear()
Clears the deque.
Definition deque.h:980
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:214
void pop_back()
Removes the oldest item from the deque.
Definition deque.h:1881
ideque & operator=(const ideque &rhs)
Assignment operator.
Definition deque.h:2072
const_reverse_iterator rbegin() const
Gets a const reverse iterator to the end of the deque.
Definition deque.h:940
ETL_DECLARE_DEBUG_COUNT
Internal debugging.
Definition deque.h:216
void resize(size_t new_size, const value_type &value=value_type())
Definition deque.h:2029
iterator emplace(const_iterator insert_position, const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition deque.h:1368
iterator begin()
Gets an iterator to the beginning of the deque.
Definition deque.h:884
reference front()
Definition deque.h:849
reference at(size_t index)
Definition deque.h:796
reference emplace_back(const T1 &value1, const T2 &value2)
Definition deque.h:1834
pointer p_buffer
Iterator to the _end item in the deque.
Definition deque.h:2158
friend difference_type operator-(const iterator &lhs, const iterator &rhs)
Definition deque.h:2056
reference emplace_front(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition deque.h:2001
reference emplace_front()
Definition deque.h:1937
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:761
void initialise()
Initialise the deque.
Definition deque.h:2126
reference operator[](size_t index)
Definition deque.h:825
~deque_base()
Destructor.
Definition deque.h:209
iterator _end
Iterator to the _begin item in the deque.
Definition deque.h:2157
reference emplace_front(const T1 &value1, const T2 &value2, const T3 &value3)
Definition deque.h:1985
size_type size() const
Definition deque.h:144
const_reference at(size_t index) const
Definition deque.h:811
const_reverse_iterator crend() const
Gets a const reverse iterator to the beginning of the deque.
Definition deque.h:972
const size_type Buffer_Size
The number of elements in the buffer.
Definition deque.h:215
iterator end()
Gets an iterator to the end of the deque.
Definition deque.h:908
const_iterator end() const
Gets a const iterator to the end of the deque.
Definition deque.h:916
void push_front(const_reference item)
Definition deque.h:1893
size_type max_size() const
Definition deque.h:171
~ideque()
Destructor.
Definition deque.h:2330
iterator erase(const_iterator range_begin, const_iterator range_end)
Definition deque.h:1692
iterator emplace(const_iterator insert_position, const T1 &value1)
Definition deque.h:1173
deque(const deque &other)
Copy constructor.
Definition deque.h:2384
iterator emplace(const_iterator insert_position, const T1 &value1, const T2 &value2)
Definition deque.h:1238
iterator insert(const_iterator insert_position, size_type n, const value_type &value)
Definition deque.h:1435
enable_if<!etl::is_integral< TIterator >::value, iterator >::type insert(const_iterator insert_position, TIterator range_begin, TIterator range_end)
Definition deque.h:1546
bool full() const
Definition deque.h:162
size_type capacity() const
Definition deque.h:180
const_reference back() const
Definition deque.h:876
bool empty() const
Definition deque.h:153
void repair()
Fix the internal pointers after a low level memory copy.
Definition deque.h:2484
const_reverse_iterator rend() const
Gets a const reverse iterator to the beginning of the deque.
Definition deque.h:964
const_iterator cend() const
Gets a const iterator to the end of the deque.
Definition deque.h:924
reference emplace_back(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition deque.h:1866
reference emplace_back()
Definition deque.h:1802
deque_base(size_t max_size_, size_t buffer_size_)
Constructor.
Definition deque.h:199
reference emplace_front(const T1 &value1, const T2 &value2)
Definition deque.h:1969
void assign(size_type n, const value_type &value)
Definition deque.h:778
deque()
Default constructor.
Definition deque.h:2367
reference back()
Definition deque.h:867
iterator emplace(const_iterator insert_position, const T1 &value1, const T2 &value2, const T3 &value3)
Definition deque.h:1303
reverse_iterator rbegin()
Gets a reverse iterator to the end of the deque.
Definition deque.h:932
void fill(const T &value)
Fills the deque.
Definition deque.h:988
void pop_front()
Removes the oldest item from the deque.
Definition deque.h:2016
reference emplace_back(const T1 &value1)
Definition deque.h:1818
void push_back(const_reference item)
Definition deque.h:1758
const_iterator cbegin() const
Gets a const iterator to the beginning of the deque.
Definition deque.h:900
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:2418
~deque()
Destructor.
Definition deque.h:2376
reverse_iterator rend()
Gets a reverse iterator to the beginning of the deque.
Definition deque.h:956
const_reference front() const
Definition deque.h:858
deque(size_t n, const_reference value=value_type())
Assigns data to the deque.
Definition deque.h:2427
size_t available() const
Definition deque.h:189
deque & operator=(const deque &rhs)
Assignment operator.
Definition deque.h:2447
const_iterator begin() const
Gets a const iterator to the beginning of the deque.
Definition deque.h:892
iterator insert(const_iterator insert_position, const value_type &value)
Definition deque.h:999
void repair_buffer(pointer p_buffer_)
Fix the internal pointers after a low level memory copy.
Definition deque.h:2148
size_type current_size
The current number of elements in the deque.
Definition deque.h:213
ideque(pointer p_buffer_, size_t max_size_, size_t buffer_size_)
Constructor.
Definition deque.h:2117
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
ETL_CONSTEXPR exception(string_type reason_, string_type, numeric_type line_)
Constructor.
Definition exception.h:69
Definition exception.h:47
ETL_CONSTEXPR17 etl::enable_if<!etl::is_same< T, etl::nullptr_t >::value, T >::type * addressof(T &t)
Definition addressof.h:52
enable_if
Definition type_traits_generator.h:1254
bitset_ext
Definition absolute.h:39
bool operator>(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1190
bool operator>=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1202
bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1151
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1139
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1163
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1178
iterator
Definition iterator.h:399