9 mutable bool m_invalid{
false};
13 this->m_invalid =
true;
18 if(this->m_invalid ==
false)
40 stream <<
"Copy assignment operator called" <<
endl;
52 stream <<
"Move assignment operator called" <<
endl;
91template<
typename ElementType,
template<
typename,
typename...>
class ContainerType>
97 using ContainerType<ElementType>::ContainerType;
98 using iterator =
typename ContainerType<ElementType>::iterator;
99 using size_type =
typename ContainerType<ElementType>::size_type;
105 return std::make_move_iterator<iterator>(base_container_type::begin());
110 return std::make_move_iterator<iterator>(base_container_type::end());
115 auto itr = base_container_type::begin();
116 std::advance(itr, index);
122 return std::distance(base_container_type::begin(), itr);
127 return std::make_move_iterator<decltype(itr)>(itr);
132 auto itr = base_container_type::begin();
133 std::advance(itr, index);
135 return std::make_move_iterator<decltype(itr)>(itr);
140 decltype(
auto) internal_move_item(
iterator itr)
142 return *std::make_move_iterator<decltype(itr)>(itr);
145 decltype(
auto) internal_move_item(
size_type index)
147 auto itr = base_container_type::begin();
148 std::advance(itr, index);
149 return *std::make_move_iterator<decltype(itr)>(itr);
154 template<
typename Type = ElementType>
155 std::enable_if_t< std::is_same_v<Type, ElementType>
156 && std::is_move_constructible_v<ElementType>, ElementType>
159 auto itr = base_container_type::begin();
160 auto named_return_value = internal_move_item(itr);
162 if constexpr( tpf::types::is_pop_front_available_v<base_container_type> )
167 return named_return_value;
170 template<
typename Type = ElementType>
171 std::enable_if_t< std::is_same_v<Type, ElementType>
172 && std::is_move_constructible_v<ElementType>, ElementType>
175 auto itr = base_container_type::end();
176 std::advance(itr, -1);
178 auto named_return_value = internal_move_item(itr);
180 if constexpr( tpf::types::is_pop_back_available_v<base_container_type>)
185 return named_return_value;
188 template<
typename Type = ElementType>
189 std::enable_if_t< std::is_same_v<Type, ElementType>
190 && std::is_move_constructible_v<ElementType>, ElementType>
191 move(
typename base_container_type::iterator itr)
193 auto named_return_value = internal_move_item(itr);
196 return named_return_value;
199 template<
typename Type = ElementType>
200 std::enable_if_t< std::is_same_v<Type, ElementType>
201 && std::is_move_constructible_v<ElementType>, ElementType>
202 move(
typename base_container_type::size_type index)
204 return this->
move(to_iterator(index));
207 template<
typename Type = ElementType>
208 std::enable_if_t< std::is_same_v<Type, ElementType>
209 && std::is_move_constructible_v<ElementType>, ElementType>
210 move(
typename base_container_type::iterator itr_begin,
211 typename base_container_type::iterator itr_end)
213 auto named_return_value =
218 return named_return_value;
221 template<
typename Type = ElementType>
222 std::enable_if_t< std::is_same_v<Type, ElementType>
223 && std::is_move_constructible_v<ElementType>, ElementType>
224 move(
typename base_container_type::size_type index_begin,
225 typename base_container_type::size_type index_end)
noexcept(
false)
227 return this->
move(to_iterator(index_begin), to_iterator(index_end));
231template<
typename ElementType,
template<
typename,
typename...>
class ContainerType>
239 ext_vector_t vctr; vctr.reserve(10);
241 vctr.emplace_back(1);
242 vctr.emplace_back(2);
246 auto back = vctr.move_back();
248 auto front = vctr.move_front();
void test_which_constructor_gets_called()
copy_or_move copy_elision()
void test_stl_extension()
copy_or_move return_prvalue(int n=2, int m=1)
copy_or_move & operator=(const copy_or_move &rhs)
copy_or_move(const copy_or_move &rhs)
copy_or_move(copy_or_move &&rhs) noexcept
copy_or_move & operator=(copy_or_move &&rhs)
std::enable_if_t< std::is_same_v< Type, ElementType > &&std::is_move_constructible_v< ElementType >, ElementType > move(typename base_container_type::size_type index)
std::enable_if_t< std::is_same_v< Type, ElementType > &&std::is_move_constructible_v< ElementType >, ElementType > move_back()
std::enable_if_t< std::is_same_v< Type, ElementType > &&std::is_move_constructible_v< ElementType >, ElementType > move_front()
auto iterator_to_index(iterator itr)
ContainerType< ElementType > base_container_type
typename ContainerType< ElementType >::size_type size_type
auto index_to_move_iterator(size_type index) noexcept
auto index_to_iterator(size_type index) noexcept
auto begin_move_iterator()
auto interator_to_move_iterator(iterator itr) noexcept
typename ContainerType< ElementType >::iterator iterator
std::enable_if_t< std::is_same_v< Type, ElementType > &&std::is_move_constructible_v< ElementType >, ElementType > move(typename base_container_type::size_type index_begin, typename base_container_type::size_type index_end) noexcept(false)
std::enable_if_t< std::is_same_v< Type, ElementType > &&std::is_move_constructible_v< ElementType >, ElementType > move(typename base_container_type::iterator itr_begin, typename base_container_type::iterator itr_end)
std::enable_if_t< std::is_same_v< Type, ElementType > &&std::is_move_constructible_v< ElementType >, ElementType > move(typename base_container_type::iterator itr)
auto erase(ContainerType< EleType, Types... > &container, size_t index)
auto pop_front(ContainerType< Type, Types... > &container)
auto pop_back(ContainerType< Type, Types... > &container)
Stream output operators << are implemented.