dfx 0.1.0
Linux-based dynamic dataflow executor
Loading...
Searching...
No Matches
Join.hpp
1// SPDX-FileCopyrightText: 2025 Vincent Leroy
2// SPDX-License-Identifier: MIT
3//
4// This file is part of dfx.
5//
6// Licensed under the MIT License. See the LICENSE file in the project root
7// for full license information.
8
9#pragma once
10
11// Standard includes
12#include <format>
13#include <ranges>
14#include <string_view>
15
16namespace dfx::Utils
17{
37template <std::ranges::forward_range Range>
39{
40public:
45 constexpr JoinedView(Range range, std::string_view delimiter) noexcept
46 : _range { range }
47 , _delimiter { delimiter }
48 {}
49
52 constexpr Range const & range() const noexcept { return _range; }
53
56 constexpr std::string_view delimiter() const noexcept { return _delimiter; }
57
58private:
59 Range _range;
60 std::string_view _delimiter;
61};
62
72template <std::ranges::forward_range Range>
73constexpr JoinedView<Range> join(Range const & range, std::string_view delimiter) noexcept
74{
75 return JoinedView<Range>(range, delimiter);
76}
77
89template <typename It, typename Sent>
90requires std::forward_iterator<It> && std::sentinel_for<Sent, It>
91constexpr auto join(It first, Sent last, std::string_view delimiter) noexcept
92{
93 auto sub = std::ranges::subrange(first, last);
94 return join(sub, delimiter);
95}
96} // !namespace dfx::Utils
97
105template <typename Range, typename CharT>
106struct std::formatter<dfx::Utils::JoinedView<Range>, CharT> : std::formatter<std::basic_string<CharT>, CharT>
107{
108 template <typename FormatContext>
109 auto format(dfx::Utils::JoinedView<Range> const & joined, FormatContext & ctx) const
110 {
111 std::basic_string<CharT> result;
112
113 auto it = std::ranges::begin(joined.range());
114 auto end = std::ranges::end(joined.range());
115
116 if (it != end)
117 {
118 result += std::format("{}", *it);
119 ++it;
120 for (; it != end; ++it)
121 {
122 result += joined.delimiter();
123 result += std::format("{}", *it);
124 }
125 }
126
127 return std::formatter<std::basic_string<CharT>, CharT>::format(result, ctx);
128 }
129};
Lightweight wrapper used to format a range as a delimiter-joined string via std::format.
Definition Join.hpp:39
constexpr JoinedView(Range range, std::string_view delimiter) noexcept
Construct a joined view over a range with a delimiter.
Definition Join.hpp:45
constexpr std::string_view delimiter() const noexcept
Access the delimiter used between elements.
Definition Join.hpp:56
constexpr Range const & range() const noexcept
Access the stored range.
Definition Join.hpp:52
Definition SystemConfigCommandHandler.hpp:15
constexpr JoinedView< Range > join(Range const &range, std::string_view delimiter) noexcept
Create a JoinedView from a range and a delimiter.
Definition Join.hpp:73
Definition Message.hpp:21