UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Join.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreTypes.h"
8#include "Templates/IdentityFunctor.h"
9#include "Templates/Invoke.h"
10#include "Templates/Tuple.h"
11
12namespace UE::String::Private
13{
14
15template <typename RangeType, typename ProjectionType, typename DelimiterType, typename QuoteType>
23
24template <typename RangeType, typename ProjectionType, typename DelimiterType>
31
32template <typename TupleType, typename ProjectionType, typename DelimiterType, typename QuoteType>
40
41template <typename TupleType, typename ProjectionType, typename DelimiterType>
48
49} // UE::String::Private
50
51namespace UE::String
52{
53
66template <typename RangeType, typename ProjectionType, typename DelimiterType, typename QuoteType>
72
85template <typename RangeType, typename ProjectionType, typename DelimiterType, typename QuoteType, typename CharType>
87 RangeType&& Range,
89 DelimiterType&& Delimiter,
90 QuoteType&& Quote,
92{
93 bool bFirst = true;
94 for (auto&& Elem : Forward<RangeType>(Range))
95 {
96 if (bFirst)
97 {
98 bFirst = false;
99 }
100 else
101 {
102 Builder << Delimiter;
103 }
104 Builder << Quote << Invoke(Projection, Elem) << Quote;
105 }
106 return Builder;
107}
108
120template <typename RangeType, typename DelimiterType, typename QuoteType>
126
138template <typename RangeType, typename DelimiterType, typename QuoteType, typename CharType>
140 RangeType&& Range,
141 DelimiterType&& Delimiter,
142 QuoteType&& Quote,
144{
146}
147
158template <typename RangeType, typename ProjectionType, typename DelimiterType>
164
175template <typename RangeType, typename ProjectionType, typename DelimiterType, typename CharType>
177 RangeType&& Range,
179 DelimiterType&& Delimiter,
181{
182 bool bFirst = true;
183 for (auto&& Elem : Forward<RangeType>(Range))
184 {
185 if (bFirst)
186 {
187 bFirst = false;
188 }
189 else
190 {
191 Builder << Delimiter;
192 }
193 Builder << Invoke(Projection, Elem);
194 }
195 return Builder;
196}
197
207template <typename RangeType, typename DelimiterType>
208inline auto Join(RangeType&& Range, DelimiterType&& Delimiter)
210{
211 return {Forward<RangeType>(Range), FIdentityFunctor(), Forward<DelimiterType>(Delimiter)};
212}
213
223template <typename RangeType, typename DelimiterType, typename CharType>
224inline TStringBuilderBase<CharType>& JoinTo(RangeType&& Range, DelimiterType&& Delimiter, TStringBuilderBase<CharType>& Builder)
225{
226 return JoinByTo(Forward<RangeType>(Range), FIdentityFunctor(), Forward<DelimiterType>(Delimiter), Builder);
227}
228
241template <typename TupleType, typename ProjectionType, typename DelimiterType, typename QuoteType>
247
260template <typename TupleType, typename ProjectionType, typename DelimiterType, typename QuoteType, typename CharType
261 UE_REQUIRES(TIsTuple_V<std::decay_t<TupleType>>)>
263 TupleType&& Tuple,
265 DelimiterType&& Delimiter,
266 QuoteType&& Quote,
268{
269 bool bFirst = true;
270 VisitTupleElements([&bFirst, &Projection, &Delimiter, &Quote, &Builder](auto&& Elem)
271 {
272 if (bFirst)
273 {
274 bFirst = false;
275 }
276 else
277 {
278 Builder << Delimiter;
279 }
280 Builder << Quote << Invoke(Projection, Elem) << Quote;
281 }, Tuple);
282 return Builder;
283}
284
296template <typename TupleType, typename DelimiterType, typename QuoteType>
302
314template <typename TupleType, typename DelimiterType, typename QuoteType, typename CharType>
316 TupleType&& Tuple,
317 DelimiterType&& Delimiter,
318 QuoteType&& Quote,
320{
322}
323
334template <typename TupleType, typename ProjectionType, typename DelimiterType>
340
351template <typename TupleType, typename ProjectionType, typename DelimiterType, typename CharType
352 UE_REQUIRES(TIsTuple_V<std::decay_t<TupleType>>)>
354 TupleType&& Tuple,
356 DelimiterType&& Delimiter,
358{
359 bool bFirst = true;
360 VisitTupleElements([&bFirst, &Projection, &Delimiter, &Builder](auto&& Elem)
361 {
362 if (bFirst)
363 {
364 bFirst = false;
365 }
366 else
367 {
368 Builder << Delimiter;
369 }
370 Builder << Invoke(Projection, Elem);
371 }, Tuple);
372 return Builder;
373}
374
384template <typename TupleType, typename DelimiterType>
390
400template <typename TupleType, typename DelimiterType, typename CharType>
405
406} // UE::String
407
408namespace UE::String::Private
409{
410
411template <typename RangeType, typename ProjectionType, typename DelimiterType, typename QuoteType, typename CharType>
414 Private::TJoinQuotedBy<RangeType, ProjectionType, DelimiterType, QuoteType>&& Adapter)
415{
416 return JoinQuotedByTo(
417 Forward<RangeType>(Adapter.Range),
418 MoveTemp(Adapter.Projection),
419 Forward<DelimiterType>(Adapter.Delimiter),
420 Forward<QuoteType>(Adapter.Quote),
421 Builder);
422}
423
424template <typename RangeType, typename ProjectionType, typename DelimiterType, typename CharType>
427 Private::TJoinBy<RangeType, ProjectionType, DelimiterType>&& Adapter)
428{
429 return JoinByTo(Forward<RangeType>(Adapter.Range), MoveTemp(Adapter.Projection), Forward<DelimiterType>(Adapter.Delimiter), Builder);
430}
431
432template <typename TupleType, typename ProjectionType, typename DelimiterType, typename QuoteType, typename CharType>
435 Private::TJoinTupleQuotedBy<TupleType, ProjectionType, DelimiterType, QuoteType>&& Adapter)
436{
437 return JoinTupleQuotedByTo(
438 Forward<TupleType>(Adapter.Tuple),
439 MoveTemp(Adapter.Projection),
440 Forward<DelimiterType>(Adapter.Delimiter),
441 Forward<QuoteType>(Adapter.Quote),
442 Builder);
443}
444
445template <typename TupleType, typename ProjectionType, typename DelimiterType, typename CharType>
448 Private::TJoinTupleBy<TupleType, ProjectionType, DelimiterType>&& Adapter)
449{
450 return JoinTupleByTo(Forward<TupleType>(Adapter.Tuple), MoveTemp(Adapter.Projection), Forward<DelimiterType>(Adapter.Delimiter), Builder);
451}
452
453} // UE::String::Private
AUTORTFM_INFER UE_FORCEINLINE_HINT constexpr auto Invoke(FuncType &&Func, ArgTypes &&... Args) -> decltype(((FuncType &&) Func)((ArgTypes &&) Args...))
Definition Invoke.h:44
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
AUTORTFM_INFER constexpr auto Projection(Invocable0Type &&Invocable0, InvocableTypes &&... Invocables)
Definition Projection.h:108
#define UE_REQUIRES(...)
Definition Requires.h:86
constexpr bool TIsTuple_V
Definition Tuple.h:904
UE_FORCEINLINE_HINT void VisitTupleElements(FuncType &&Func, FirstTupleType &&FirstTuple, TupleTypes &&... Tuples)
Definition Tuple.h:878
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition StringBuilder.h:79
Definition String.cpp.inl:714
TStringBuilderBase< CharType > & operator<<(TStringBuilderBase< CharType > &Builder, const TUpperCase< CharType > &Adapter)
Definition CaseConversion.h:140
Definition String.cpp.inl:714
TStringBuilderBase< CharType > & JoinTupleQuotedTo(TupleType &&Tuple, DelimiterType &&Delimiter, QuoteType &&Quote, TStringBuilderBase< CharType > &Builder)
Definition Join.h:315
auto JoinTupleQuoted(TupleType &&Tuple, DelimiterType &&Delimiter, QuoteType &&Quote) -> Private::TJoinTupleQuotedBy< TupleType, FIdentityFunctor, DelimiterType, QuoteType >
Definition Join.h:297
auto JoinQuotedBy(RangeType &&Range, ProjectionType Projection, DelimiterType &&Delimiter, QuoteType &&Quote) -> Private::TJoinQuotedBy< RangeType, ProjectionType, DelimiterType, QuoteType >
Definition Join.h:67
TStringBuilderBase< CharType > & JoinQuotedTo(RangeType &&Range, DelimiterType &&Delimiter, QuoteType &&Quote, TStringBuilderBase< CharType > &Builder)
Definition Join.h:139
auto JoinBy(RangeType &&Range, ProjectionType Projection, DelimiterType &&Delimiter) -> Private::TJoinBy< RangeType, ProjectionType, DelimiterType >
Definition Join.h:159
TStringBuilderBase< CharType > & JoinByTo(RangeType &&Range, ProjectionType Projection, DelimiterType &&Delimiter, TStringBuilderBase< CharType > &Builder)
Definition Join.h:176
TStringBuilderBase< CharType > & JoinQuotedByTo(RangeType &&Range, ProjectionType Projection, DelimiterType &&Delimiter, QuoteType &&Quote, TStringBuilderBase< CharType > &Builder)
Definition Join.h:86
TStringBuilderBase< CharType > & JoinTupleTo(TupleType &&Tuple, DelimiterType &&Delimiter, TStringBuilderBase< CharType > &Builder)
Definition Join.h:401
auto JoinTupleQuotedBy(TupleType &&Tuple, ProjectionType Projection, DelimiterType &&Delimiter, QuoteType &&Quote) -> Private::TJoinTupleQuotedBy< TupleType, ProjectionType, DelimiterType, QuoteType >
Definition Join.h:242
auto JoinTuple(TupleType &&Tuple, DelimiterType &&Delimiter) -> Private::TJoinTupleBy< TupleType, FIdentityFunctor, DelimiterType >
Definition Join.h:385
TStringBuilderBase< CharType > & JoinTupleByTo(TupleType &&Tuple, ProjectionType Projection, DelimiterType &&Delimiter, TStringBuilderBase< CharType > &Builder)
Definition Join.h:353
auto Join(RangeType &&Range, DelimiterType &&Delimiter) -> Private::TJoinBy< RangeType, FIdentityFunctor, DelimiterType >
Definition Join.h:208
TStringBuilderBase< CharType > & JoinTupleQuotedByTo(TupleType &&Tuple, ProjectionType Projection, DelimiterType &&Delimiter, QuoteType &&Quote, TStringBuilderBase< CharType > &Builder)
Definition Join.h:262
auto JoinTupleBy(TupleType &&Tuple, ProjectionType Projection, DelimiterType &&Delimiter) -> Private::TJoinTupleBy< TupleType, ProjectionType, DelimiterType >
Definition Join.h:335
auto JoinQuoted(RangeType &&Range, DelimiterType &&Delimiter, QuoteType &&Quote) -> Private::TJoinQuotedBy< RangeType, FIdentityFunctor, DelimiterType, QuoteType >
Definition Join.h:121
TStringBuilderBase< CharType > & JoinTo(RangeType &&Range, DelimiterType &&Delimiter, TStringBuilderBase< CharType > &Builder)
Definition Join.h:224
Definition IdentityFunctor.h:11
Definition Join.h:26
DelimiterType && Delimiter
Definition Join.h:29
RangeType && Range
Definition Join.h:27
ProjectionType Projection
Definition Join.h:28
QuoteType && Quote
Definition Join.h:21
ProjectionType Projection
Definition Join.h:19
RangeType && Range
Definition Join.h:18
DelimiterType && Delimiter
Definition Join.h:20
DelimiterType && Delimiter
Definition Join.h:46
TupleType && Tuple
Definition Join.h:44
ProjectionType Projection
Definition Join.h:45
ProjectionType Projection
Definition Join.h:36
TupleType && Tuple
Definition Join.h:35
QuoteType && Quote
Definition Join.h:38
DelimiterType && Delimiter
Definition Join.h:37