UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Unique.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
6#include "Templates/IdentityFunctor.h"
7#include "Templates/Invoke.h"
8#include "Templates/EqualTo.h"
9
10namespace AlgoImpl
11{
12 template <typename T, typename SizeType, typename ProjectionType, typename BinaryPredicate>
13 SizeType Unique(T* Array, SizeType ArraySize, ProjectionType Proj, BinaryPredicate Predicate)
14 {
15 if (ArraySize <= 1)
16 {
17 return ArraySize;
18 }
19
20 T* Result = Array;
21 for (T* Iter = Array + 1; Iter != Array + ArraySize; ++Iter)
22 {
23 if (!Invoke(Predicate, Invoke(Proj, *Result), Invoke(Proj, *Iter)))
24 {
25 ++Result;
26 if (Result != Iter)
27 {
28 *Result = MoveTemp(*Iter);
29 }
30 }
31 }
32
33 return static_cast<SizeType>(Result + 1 - Array);
34 }
35}
36
37namespace Algo
38{
58 template<typename RangeType>
59 [[nodiscard]] auto Unique(RangeType&& Range) -> decltype(AlgoImpl::Unique(GetData(Range), GetNum(Range), FIdentityFunctor(), TEqualTo<>{}))
60 {
61 return AlgoImpl::Unique(GetData(Range), GetNum(Range), FIdentityFunctor(), TEqualTo<>{});
62 }
63
64 template<typename RangeType, typename BinaryPredicate>
65 [[nodiscard]] auto Unique(RangeType&& Range, BinaryPredicate Predicate) -> decltype(AlgoImpl::Unique(GetData(Range), GetNum(Range), FIdentityFunctor(), MoveTemp(Predicate)))
66 {
67 return AlgoImpl::Unique(GetData(Range), GetNum(Range), FIdentityFunctor(), MoveTemp(Predicate));
68 }
69
70 template<typename RangeType, typename ProjectionType>
71 [[nodiscard]] auto UniqueBy(RangeType&& Range, ProjectionType Proj) -> decltype(AlgoImpl::Unique(GetData(Range), GetNum(Range), MoveTemp(Proj), TEqualTo<>{}))
72 {
73 return AlgoImpl::Unique(GetData(Range), GetNum(Range), MoveTemp(Proj), TEqualTo<>{});
74 }
75
76 template<typename RangeType, typename ProjectionType, typename BinaryPredicate>
77 [[nodiscard]] auto UniqueBy(RangeType&& Range, ProjectionType Proj, BinaryPredicate Predicate) -> decltype(AlgoImpl::Unique(GetData(Range), GetNum(Range), MoveTemp(Proj), MoveTemp(Predicate)))
78 {
79 return AlgoImpl::Unique(GetData(Range), GetNum(Range), MoveTemp(Proj), MoveTemp(Predicate));
80 }
81}
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
auto GetNum(const TStringConversion< Converter, DefaultConversionSize > &Conversion) -> decltype(Conversion.Length())
Definition StringConv.h:808
auto GetData(const TStringConversion< Converter, DefaultConversionSize > &Conversion) -> decltype(Conversion.Get())
Definition StringConv.h:802
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition BinarySearch.h:10
SizeType Unique(T *Array, SizeType ArraySize, ProjectionType Proj, BinaryPredicate Predicate)
Definition Unique.h:13
Definition ParallelSort.h:13
Definition IdentityFunctor.h:11
Definition EqualTo.h:18