Iros
 
Loading...
Searching...
No Matches
path_impl.h
Go to the documentation of this file.
1#pragma once
2
8#include "di/meta/util.h"
11
12namespace di::container {
13template<concepts::InstanceOf<string::StringImpl> Str>
14class PathImpl : public ConstantPathInterface<PathImpl<Str>, meta::Encoding<Str>> {
15private:
16 using Enc = meta::Encoding<Str>;
17
18 template<concepts::ContainerCompatible<meta::EncodingCodeUnit<Enc>> Con, typename... Args>
19 requires(concepts::CreatableFrom<Str, Con, Args...>)
21 Args&&... args) {
22 return as_fallible(util::create<Str>(util::forward<Con>(container), util::forward<Args>(args)...)) %
23 [](Str&& string) {
24 return PathImpl(util::move(string));
25 } |
27 }
28
30 return as_fallible(util::create<Str>(view.data())) % [](Str&& string) {
31 return PathImpl(util::move(string));
33 }
34
35public:
36 using Encoding = Enc;
37
38 PathImpl() = default;
39
40 constexpr PathImpl(Str&& string) : m_data(util::move(string)) { this->compute_first_component_end(); }
41
42 constexpr auto data() const { return m_data.view(); }
43
44 constexpr auto c_str() const
45 requires(string::encoding::NullTerminated<Enc>)
46 {
47 return m_data.c_str();
48 }
49
50 constexpr auto clone() const {
51 return as_fallible(util::clone(m_data)) % [](Str&& string) {
52 return PathImpl(util::move(string));
54 }
55
56 template<concepts::ContainerCompatible<meta::EncodingCodePoint<Enc>> Con>
58 constexpr auto append(Con&& container) -> decltype(auto) {
59 using CodePoint = meta::EncodingCodePoint<Enc>;
60
62 auto first_code_point = *container::begin(container);
63 if (first_code_point == CodePoint('/')) {
64 m_data.clear();
65 }
66 }
67
68 if (!m_data.empty() && !m_data.ends_with(CodePoint('/'))) {
69 return invoke_as_fallible([&] {
70 return m_data.push_back(CodePoint('/'));
71 }) >>
72 [&] {
73 return as_fallible(m_data.append(util::forward<Con>(container))) % [&](auto&&) {
74 return util::ref(*this);
75 };
76 } |
77 if_error([&](auto&&) {
78 m_data.pop_back();
79 }) |
81 }
82
83 return as_fallible(m_data.append(util::forward<Con>(container))) % [&](auto&&) {
84 return util::ref(*this);
86 }
87 constexpr auto append(PathViewImpl<Enc> view) -> decltype(auto) { return append(view.data()); }
88 constexpr auto append(PathImpl const& other) -> decltype(auto) { return append(other.data()); }
89
90 template<concepts::ContainerCompatible<meta::EncodingCodePoint<Enc>> Con>
92 constexpr auto operator/=(Con&& container) -> decltype(auto) {
93 return append(util::forward<Con>(container));
94 }
95 constexpr auto operator/=(PathViewImpl<Enc> view) -> decltype(auto) { return append(view.data()); }
96 constexpr auto operator/=(PathImpl const& other) -> decltype(auto) { return append(other.data()); }
97
98 template<concepts::ContainerCompatible<meta::EncodingCodePoint<Enc>> Con>
100 constexpr auto concat(Con&& container) -> decltype(auto) {
101 return m_data.append(util::forward<Con>(container)) % [&](auto&&) {
102 return util::ref(*this);
103 };
104 }
105 constexpr auto concat(PathViewImpl<Enc> view) -> decltype(auto) { return concat(view.data()); }
106 constexpr auto concat(PathImpl const& other) -> decltype(auto) { return concat(other.data()); }
107
108 template<concepts::ContainerCompatible<meta::EncodingCodePoint<Enc>> Con>
110 constexpr auto operator+=(Con&& container) -> decltype(auto) {
111 return concat(util::forward<Con>(container));
112 }
113 constexpr auto operator+=(PathViewImpl<Enc> view) -> decltype(auto) { return concat(view.data()); }
114 constexpr auto operator+=(PathImpl const& other) -> decltype(auto) { return concat(other.data()); }
115
116 constexpr void clear() { m_data.clear(); }
117
118 constexpr auto take_underlying_string() && { return util::move(m_data); }
119
120private:
121 template<concepts::ContainerCompatible<meta::EncodingCodePoint<Enc>> Con>
123 constexpr friend auto operator/(PathImpl&& lhs, Con&& rhs) {
124 return as_fallible(lhs.append(util::forward<Con>(rhs))) % [&](auto&&) {
125 return util::move(lhs);
126 } | try_infallible;
127 }
128 friend auto operator/(PathImpl&& lhs, PathViewImpl<Enc> rhs) {
129 return as_fallible(lhs.append(rhs.data())) % [&](auto&&) {
130 return util::move(lhs);
131 } | try_infallible;
132 }
133 friend auto operator/(PathImpl&& lhs, PathImpl const& rhs) { return lhs / rhs.data(); }
134
135 Str m_data;
136};
137}
Definition constant_path_interface.h:16
constexpr auto view() const &-> PathView
Definition constant_path_interface.h:31
constexpr void compute_first_component_end()
Definition constant_path_interface.h:106
Definition path_view_impl.h:15
Enc Encoding
Definition path_impl.h:36
constexpr auto concat(Con &&container) -> decltype(auto)
Definition path_impl.h:100
constexpr auto append(Con &&container) -> decltype(auto)
Definition path_impl.h:58
constexpr auto take_underlying_string() &&
Definition path_impl.h:118
friend auto operator/(PathImpl &&lhs, PathImpl const &rhs)
Definition path_impl.h:133
constexpr auto operator+=(PathViewImpl< Enc > view) -> decltype(auto)
Definition path_impl.h:113
constexpr auto concat(PathViewImpl< Enc > view) -> decltype(auto)
Definition path_impl.h:105
constexpr auto c_str() const
Definition path_impl.h:44
constexpr auto operator+=(PathImpl const &other) -> decltype(auto)
Definition path_impl.h:114
friend auto operator/(PathImpl &&lhs, PathViewImpl< Enc > rhs)
Definition path_impl.h:128
constexpr friend auto tag_invoke(types::Tag< util::create_in_place >, InPlaceType< PathImpl >, PathViewImpl< Enc > view)
Definition path_impl.h:29
constexpr auto append(PathViewImpl< Enc > view) -> decltype(auto)
Definition path_impl.h:87
constexpr auto clone() const
Definition path_impl.h:50
constexpr auto data() const
Definition path_impl.h:42
constexpr auto append(PathImpl const &other) -> decltype(auto)
Definition path_impl.h:88
constexpr friend auto tag_invoke(types::Tag< util::create_in_place >, InPlaceType< PathImpl >, Con &&container, Args &&... args)
Definition path_impl.h:20
constexpr void clear()
Definition path_impl.h:116
constexpr PathImpl(Str &&string)
Definition path_impl.h:40
constexpr auto concat(PathImpl const &other) -> decltype(auto)
Definition path_impl.h:106
constexpr auto operator/=(PathImpl const &other) -> decltype(auto)
Definition path_impl.h:96
constexpr auto operator/=(PathViewImpl< Enc > view) -> decltype(auto)
Definition path_impl.h:95
Definition path_view_impl.h:22
constexpr auto data() const -> View
Definition path_view_impl.h:35
Definition forward_container.h:8
Definition core.h:114
Definition constant_string_interface.h:31
Definition sequence.h:12
constexpr auto empty
Definition empty.h:45
constexpr auto move
Definition move.h:38
constexpr auto begin
Definition begin.h:44
RemoveCVRef< T >::CodePoint EncodingCodePoint
Definition encoding.h:19
meta::RemoveCVRef< T >::Encoding Encoding
Definition encoding.h:230
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition vocab.h:96
constexpr auto ref
Definition reference_wrapper.h:98
constexpr auto clone
Definition clone.h:39
constexpr auto create(Args &&... args)
Definition create.h:21
constexpr auto invoke_as_fallible
Definition invoke_as_fallible.h:37
constexpr auto if_error
Definition if_error.h:28
constexpr auto as_fallible
Definition as_fallible.h:26
constexpr auto try_infallible
Definition try_infallible.h:31
Definition in_place_type.h:5