3232
3333
3434namespace cpputils {
35- namespace detail {
36- template <typename T>
37- concept optional_like = an<T, std::optional> || an<T, expected>;
3835
36+ template <typename T>
37+ concept optional_like = an<T, std::optional> || an<T, expected>;
38+ namespace detail {
3939 template <typename T>
4040 using reference_or_value = std::conditional_t <std::is_rvalue_reference_v<T>, std::remove_cvref_t <T>, T>;
4141
@@ -71,7 +71,7 @@ namespace detail {
7171 optional_adaptor_closure (Callable) -> optional_adaptor_closure<Callable>;
7272} // namespace detail
7373
74- [[nodiscard]] inline constexpr auto map (auto &&f, detail:: optional_like auto &&...opts) requires INVOCABLEs(f, *opts)
74+ [[nodiscard]] inline constexpr auto map (auto &&f, optional_like auto &&...opts) requires INVOCABLEs(f, *opts)
7575{
7676 using ret_t = RES_Ts (f, *opts);
7777
@@ -83,26 +83,26 @@ namespace detail {
8383 }
8484}
8585
86- [[nodiscard]] inline constexpr auto try_or_else (auto &&f, std::invocable<> auto &&otherwise, detail:: optional_like auto &&...opts)
86+ [[nodiscard]] inline constexpr auto try_or_else (auto &&f, std::invocable<> auto &&otherwise, optional_like auto &&...opts)
8787 requires (INVOCABLEs(f, *opts) && std::same_as<RES_Ts(f, *opts), RES_T0(otherwise)>)
8888{
8989 return (opts && ...) ? INVKs (f, *opts) : INVK0 (otherwise);
9090}
9191
92- [[nodiscard]] inline constexpr auto try_or (auto &&f, auto &&otherwise, detail:: optional_like auto &&...opts)
92+ [[nodiscard]] inline constexpr auto try_or (auto &&f, auto &&otherwise, optional_like auto &&...opts)
9393 requires (INVOCABLEs(f, *opts) && std::same_as<RES_Ts(f, *opts), std::remove_cvref_t<decltype(otherwise)>>)
9494{
9595 return (opts && ...) ? INVKs (f, *opts) : FWD (otherwise);
9696}
9797
98- inline constexpr void apply (auto &&f, detail:: optional_like auto &&...opts) requires INVOCABLEs(f, *opts)
98+ inline constexpr void apply (auto &&f, optional_like auto &&...opts) requires INVOCABLEs(f, *opts)
9999{
100100 if ((opts && ...)) {
101101 (std::invoke ((f), FWD (*opts)), ...);
102102 }
103103}
104104
105- inline constexpr void apply_or_else (auto &&f, auto &&otherwise, detail:: optional_like auto &&...opts)
105+ inline constexpr void apply_or_else (auto &&f, auto &&otherwise, optional_like auto &&...opts)
106106 requires INVOCABLEs(f, *opts)
107107{
108108 if ((opts && ...)) {
@@ -112,7 +112,7 @@ inline constexpr void apply_or_else(auto &&f, auto &&otherwise, detail::optional
112112 }
113113}
114114
115- inline constexpr auto zip (detail:: optional_like auto &&...opts) {
115+ inline constexpr auto zip (optional_like auto &&...opts) {
116116 using Tuple_t = std::tuple<detail::reference_or_value<decltype (FWD (opts).value ())>...>;
117117 using Ret_t = std::optional<Tuple_t>;
118118 if ((opts && ...)) {
@@ -123,33 +123,33 @@ inline constexpr auto zip(detail::optional_like auto &&...opts) {
123123}
124124
125125inline constexpr auto or_else = detail::optional_adaptor{
126- [](detail:: optional_like auto &&opt, std::invocable<> auto &&f) -> decltype (auto ) {
126+ [](optional_like auto &&opt, std::invocable<> auto &&f) -> decltype (auto ) {
127127 if (!opt) { std::invoke (f); }
128128 return FWD (opt);
129129 }};
130130inline constexpr auto transform = detail::optional_adaptor{
131- [](detail:: optional_like auto &&opt, std::invocable<std::remove_cvref_t <decltype (FWD (opt).value ())>> auto &&f) -> decltype (auto ) {
131+ [](optional_like auto &&opt, std::invocable<std::remove_cvref_t <decltype (FWD (opt).value ())>> auto &&f) -> decltype (auto ) {
132132 return map (FWD (f), FWD (opt));
133133 }};
134134inline constexpr auto if_value = detail::optional_adaptor{
135- [](detail:: optional_like auto &&opt, std::invocable<decltype (*opt)> auto &&f) -> decltype (auto ) {
135+ [](optional_like auto &&opt, std::invocable<decltype (*opt)> auto &&f) -> decltype (auto ) {
136136 if (opt) { std::invoke (f, *opt); }
137137 return FWD (opt);
138138 }};
139139inline constexpr auto unwrap = detail::optional_adaptor{
140- [](detail:: optional_like auto &&opt) -> decltype (auto ) {
140+ [](optional_like auto &&opt) -> decltype (auto ) {
141141 return FWD (opt).value ();
142142 }};
143143// clang-format off
144144inline constexpr auto unwrap_or = detail::optional_adaptor{
145- [](detail:: optional_like auto &&opt, auto &&else_) requires std::same_as<std::remove_cvref_t <decltype (FWD (opt).value ())>,
145+ [](optional_like auto &&opt, auto &&else_) requires std::same_as<std::remove_cvref_t <decltype (FWD (opt).value ())>,
146146 std::remove_cvref_t <decltype (else_)>> {
147147 return FWD (opt).value_or (FWD (else_));
148148 }};
149149// clang-format on
150150// clang-format off
151151inline constexpr auto unwrap_or_else = detail::optional_adaptor{
152- [](detail:: optional_like auto &&opt, std::invocable<> auto &&else_) requires std::same_as<RES_T0 (else_),
152+ [](optional_like auto &&opt, std::invocable<> auto &&else_) requires std::same_as<RES_T0 (else_),
153153 std::remove_cvref_t <decltype (FWD (opt).value ())>> {
154154 if (opt) { return FWD (opt).value (); }
155155 return std::invoke (FWD (else_));
0 commit comments