Loading [MathJax]/extensions/tex2jax.js
Iros
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages Concepts
Loading...
Searching...
No Matches
to.h
Go to the documentation of this file.
1#pragma once
2
9#include "di/util/create.h"
10#include "di/util/forward.h"
11
12namespace di::container {
13namespace detail {
14 template<typename Out, typename Con, typename... Args>
16 concepts::CreatableFrom<Out, Con, Args...>;
17
18 template<typename Out, typename Con, typename... Args>
20 concepts::CreatableFrom<Out, FromContainer, Con, Args...>;
21}
22
23template<typename Out, concepts::InputContainer Con, typename... Args>
24requires(!concepts::View<Out>)
25constexpr auto to(Con&& container, Args&&... args) {
26 if constexpr (detail::DirectConstructTo<Out, Con, Args...>) {
27 return util::create<Out>(util::forward<Con>(container), util::forward<Args>(args)...);
28 } else if constexpr (detail::TagConstructTo<Out, Con, Args...>) {
29 return util::create<Out>(from_container, util::forward<Con>(container), util::forward<Args>(args)...);
30 } else {
33 []<typename T>(T&& value) {
34 return container::to<meta::ContainerValue<Con>>(util::forward<T>(value));
35 },
36 util::forward<Args>(args)...));
37 }
38}
39
40template<template<typename...> typename Template, concepts::InputContainer Con, typename... Args>
41requires(concepts::CreateDeducible<Template, Con, Args...> ||
42 concepts::CreateDeducible<Template, FromContainer, Con, Args...>)
43constexpr auto to(Con&& container, Args&&... args) {
44 if constexpr (concepts::CreateDeducible<Template, Con, Args...>) {
45 using Out = meta::DeduceCreate<Template, Con, Args...>;
46 return container::to<Out>(util::forward<Con>(container), util::forward<Args>(args)...);
47 } else {
48 using Out = meta::DeduceCreate<Template, Con, Args...>;
49 return container::to<Out>(util::forward<Con>(container), util::forward<Args>(args)...);
50 }
51}
52
53template<typename Out, typename... Args>
54requires(!concepts::View<Out>)
55constexpr auto to(Args&&... args) {
57 []<concepts::InputContainer Con>(Con&& container, Args&&... args) {
58 return container::to<Out>(util::forward<Con>(container), util::forward<Args>(args)...);
59 },
60 util::forward<Args>(args)...);
61}
62
63template<template<typename...> typename Template, typename... Args>
64constexpr auto to(Args&&... args) {
66 []<concepts::InputContainer Con>(Con&& container, Args&&... args) {
67 return container::to<Template>(util::forward<Con>(container), util::forward<Args>(args)...);
68 },
69 util::forward<Args>(args)...);
70}
71}
72
73namespace di {
74using container::to;
75}
Definition operations.h:99
Definition create.h:10
Definition deduce_create.h:30
Definition input_container.h:8
Definition view.h:10
Definition sequence.h:13
constexpr auto transform
Definition transform.h:28
Definition sequence.h:12
constexpr auto to(Con &&container, Args &&... args)
Definition to.h:25
constexpr auto bind_back(F &&f, Args &&... args)
Definition bind_back.h:68
decltype(util::deduce_create(in_place_template< Template >, util::declval< Args >()...)) DeduceCreate
Definition deduce_create.h:36
IteratorValue< ContainerIterator< T > > ContainerValue
Definition container_value.h:8
constexpr auto create(Args &&... args)
Definition create.h:21
Definition zstring_parser.h:9
constexpr auto from_container
Definition from_container.h:6
Definition from_container.h:4