Iros
 
Loading...
Searching...
No Matches
vector_emplace.h
Go to the documentation of this file.
1#pragma once
2
10#include "di/meta/language.h"
11#include "di/meta/operations.h"
12#include "di/meta/util.h"
13#include "di/meta/vocab.h"
15#include "di/util/forward.h"
16#include "di/util/swap.h"
18
19namespace di::container::vector {
20template<concepts::detail::MutableVector Vec, typename... Args, typename CIter = meta::detail::VectorConstIterator<Vec>,
23requires(concepts::ConstructibleFrom<meta::detail::VectorValue<Vec>, Args...>)
24constexpr auto emplace(Vec& vector, CIter cposition, Args&&... args) -> G {
25 auto size = vector::size(vector);
26 auto new_size = size + 1;
27 auto end = vector::end(vector);
28 auto position = vector::begin(vector) + (cposition - vector::begin(vector));
29
30 if (size >= vector.capacity()) {
31 auto new_vector = Vec();
32 return invoke_as_fallible([&] {
33 return new_vector.reserve_from_nothing(vector.grow_capacity(size + 1));
34 }) % [&] {
35 auto new_data = vector::data(new_vector);
36 auto new_data_end = new_data + new_size;
37 auto [next_in, next_out] =
38 container::uninitialized_relocate(vector::begin(vector), position, new_data, new_data_end);
39 container::uninitialized_relocate(next_in, end, next_out + 1, new_data_end);
40 util::construct_at(next_out, util::forward<Args>(args)...);
41 new_vector.assume_size(new_size);
42 vector.assume_size(0);
43 util::swap(vector, new_vector);
44 return next_in;
46 }
47
48 container::uninitialized_relocate_backwards(position, end, position + 1, end + 1);
49 auto result = util::construct_at(vector::iterator(vector, position), util::forward<Args>(args)...);
50 vector.assume_size(new_size);
51 return result;
52}
53}
Definition vector_append_container.h:17
constexpr auto end(concepts::detail::ConstantVector auto &vector)
Definition vector_end.h:8
constexpr auto size(concepts::detail::ConstantVector auto const &vector) -> size_t
Definition vector_size.h:7
constexpr auto emplace(Vec &vector, CIter cposition, Args &&... args) -> G
Definition vector_emplace.h:24
constexpr auto iterator(Vec &, CIter iterator) -> Iter
Definition vector_iterator.h:13
constexpr auto begin(concepts::detail::ConstantVector auto &vector)
Definition vector_begin.h:7
constexpr auto data(concepts::detail::ConstantVector auto &vector)
Definition vector_data.h:6
constexpr auto uninitialized_relocate
Definition uninitialized_relocate.h:41
constexpr auto uninitialized_relocate_backwards
Definition uninitialized_relocate_backwards.h:45
T::Value * VectorIterator
Definition constant_vector.h:21
T::ConstValue * VectorConstIterator
Definition constant_vector.h:24
Type< detail::LikeExpectedHelper< T, U > > LikeExpected
Definition vocab.h:60
constexpr struct di::util::SwapFunction swap
constexpr auto construct_at
Definition construct_at.h:27
constexpr auto invoke_as_fallible
Definition invoke_as_fallible.h:37
constexpr auto try_infallible
Definition try_infallible.h:31
@ G
Definition key.h:16
@ R
Definition key.h:27