Iros
 
Loading...
Searching...
No Matches
sequence_to.h
Go to the documentation of this file.
1#pragma once
2
14#include "di/meta/core.h"
15#include "di/meta/operations.h"
16#include "di/meta/vocab.h"
17#include "di/util/create.h"
18#include "di/util/forward.h"
21
22namespace di::container {
23namespace detail {
24 template<typename Out, typename Con, typename... Args>
26
27 template<typename Out, typename Con, typename... Args>
29
30 template<class T>
32 t.reserve(n);
35 };
36
37 template<typename Out, typename T>
38 constexpr auto do_insert(Out& output, T&& value) {
39 if constexpr (requires { output.push_back(di::forward<T>(value)); }) {
40 return output.push_back(di::forward<T>(value));
41 } else {
42 return output.insert(output.end(), di::forward<T>(value));
43 }
44 }
45}
46
47template<typename Out, concepts::InputContainer Con, typename... Args>
49constexpr auto sequence_to(Con&& container, Args&&... args) {
50 if constexpr (detail::DirectConstructSequenceTo<Out, Con, Args...>) {
51 return util::create<Out>(util::forward<Con>(container), util::forward<Args>(args)...);
52 } else if constexpr (detail::TagConstructSequenceTo<Out, Con, Args...>) {
53 return util::create<Out>(from_container, util::forward<Con>(container), util::forward<Args>(args)...);
54 } else {
55 using InsertResult = decltype(detail::do_insert(di::declval<Out&>(),
57 using UnwrapResult = meta::ContainerValue<Con>;
58 if constexpr (!concepts::Expected<InsertResult>) {
60 return [&] -> Expected<Out, Error> {
61 auto output = Out(di::forward<Args>(args)...);
62
64 output.reserve(size(container));
65 }
66
67 for (auto&& value : container) {
68 if (!value) {
69 return Unexpected(di::forward<decltype(value)>(value).error());
70 }
71 detail::do_insert(output, di::forward<decltype(value)>(value).value());
72 }
73 return output;
74 }();
75 } else {
77 return [&] -> Expected<Out, Error> {
78 auto output = Out(di::forward<Args>(args)...);
79
81 DI_TRY(output.reserve(size(container)));
82 }
83
84 for (auto&& value : container) {
85 if (!value) {
86 return Unexpected(di::forward<decltype(value)>(value).error());
87 }
88 DI_TRY(detail::do_insert(output, di::forward<decltype(value)>(value).value()));
89 }
90 return output;
91 }();
92 }
93 }
94}
95
96template<template<typename...> typename Template, concepts::InputContainer Con, typename... Args,
97 typename UnwrappedContainer = EmptyView<meta::ExpectedValue<meta::ContainerValue<Con>>>>
98requires(concepts::CreateDeducible<Template, UnwrappedContainer, Args...> ||
99 concepts::CreateDeducible<Template, FromContainer, UnwrappedContainer, Args...>)
100constexpr auto sequence_to(Con&& container, Args&&... args) {
101 if constexpr (concepts::CreateDeducible<Template, UnwrappedContainer, Args...>) {
102 using Out = meta::DeduceCreate<Template, UnwrappedContainer, Args...>;
103 return container::sequence_to<Out>(util::forward<Con>(container), util::forward<Args>(args)...);
104 } else {
105 using Out = meta::DeduceCreate<Template, FromContainer, UnwrappedContainer, Args...>;
106 return container::sequence_to<Out>(util::forward<Con>(container), util::forward<Args>(args)...);
107 }
108}
109
110template<typename Out, typename... Args>
111requires(!concepts::View<Out>)
112constexpr auto sequence_to(Args&&... args) {
113 return function::bind_back(
114 []<concepts::InputContainer Con>(Con&& container, Args&&... args) {
115 return container::sequence_to<Out>(util::forward<Con>(container), util::forward<Args>(args)...);
116 },
117 util::forward<Args>(args)...);
118}
119
120template<template<typename...> typename Template, typename... Args>
121constexpr auto sequence_to(Args&&... args) {
122 return function::bind_back(
123 []<concepts::InputContainer Con>(Con&& container, Args&&... args) {
124 return container::sequence_to<Template>(util::forward<Con>(container), util::forward<Args>(args)...);
125 },
126 util::forward<Args>(args)...);
127}
128}
129
130namespace di {
132}
Definition expected_forward_declaration.h:8
Definition unexpected.h:14
Definition create.h:10
Definition deduce_create.h:30
Definition vocab.h:30
Definition input_container.h:8
Definition core.h:114
Definition sized_container.h:8
Definition view.h:10
#define DI_TRY(...)
Definition monad_try.h:13
Definition sequence.h:13
constexpr auto do_insert(Out &output, T &&value)
Definition sequence_to.h:38
Definition sequence.h:12
constexpr auto sequence_to(Con &&container, Args &&... args)
Definition sequence_to.h:49
constexpr auto size
Definition size.h:54
constexpr auto bind_back(F &&f, Args &&... args)
Definition bind_back.h:68
detail::CommonErrorHelper< Types... >::Type CommonError
Definition common_error.h:65
decltype(container::size(util::declval< T >())) ContainerSizeType
Definition container_size_type.h:8
meta::RemoveCVRef< T >::Error ExpectedError
Definition vocab.h:38
decltype(util::deduce_create(in_place_template< Template >, util::declval< Args >()...)) DeduceCreate
Definition deduce_create.h:36
meta::RemoveCVRef< T >::Value ExpectedValue
Definition vocab.h:35
IteratorValue< ContainerIterator< T > > ContainerValue
Definition container_value.h:8
constexpr auto create(Args &&... args)
Definition create.h:21
StatusCode< Erased< long > > Error
Definition error.h:8
Definition zstring_parser.h:9
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
constexpr auto from_container
Definition from_container.h:6
Definition from_container.h:4