diff --git a/Redcraft.Utility/Source/Public/Ranges/Conversion.h b/Redcraft.Utility/Source/Public/Ranges/Conversion.h index 554cb05..9a37d36 100644 --- a/Redcraft.Utility/Source/Public/Ranges/Conversion.h +++ b/Redcraft.Utility/Source/Public/Ranges/Conversion.h @@ -32,25 +32,50 @@ concept CReservableContainer = CSizedRange && requires (C& Container, size_t N) { Container.Reserve(N); + { Container.Num() } -> CSameAs; { Container.Max() } -> CSameAs; }; /** A concept specifies a container that can append elements. */ -template +template concept CAppendableContainer = - requires (C& Container, Ref&& Reference) + requires (C& Container, T&& Object) { requires ( - requires { Container.EmplaceBack (Forward(Reference)); } || - requires { Container.PushBack (Forward(Reference)); } || - requires { Container.Emplace(Container.End(), Forward(Reference)); } || - requires { Container.Insert (Container.End(), Forward(Reference)); } + requires { Container.EmplaceBack (Forward(Object)); } || + requires { Container.PushBack (Forward(Object)); } || + requires { Container.Emplace(Container.End(), Forward(Object)); } || + requires { Container.Insert (Container.End(), Forward(Object)); } ); }; NAMESPACE_BEGIN(Ranges) +template C> +FORCEINLINE constexpr void AppendTo(C& Container, T&& Object) +{ + if constexpr (requires { Container.EmplaceBack(Forward(Object)); }) + { + Container.EmplaceBack(Forward(Object)); + } + + else if constexpr (requires { Container.PushBack(Forward(Object)); }) + { + Container.PushBack(Forward(Object)); + } + + else if constexpr (requires { Container.Emplace(Container.End(), Forward(Object)); }) + { + Container.Emplace(Container.End(), Forward(Object)); + } + + else /* if constexpr (requires { Container.Insert(Container.End(), Forward(Object)); }) */ + { + Container.Insert(Container.End(), Forward(Object)); + } +} + /** Constructs a non-view object from the elements of the range. */ template requires (!CView) NODISCARD FORCEINLINE constexpr auto To(R&& Range, Ts&&... Args) @@ -78,25 +103,7 @@ NODISCARD FORCEINLINE constexpr auto To(R&& Range, Ts&&... Args) for (TRangeReference Element : Range) { - if constexpr (requires { Result.EmplaceBack(DeclVal>()); }) - { - Result.EmplaceBack(Forward>(Element)); - } - - else if constexpr (requires { Result.PushBack(DeclVal>()); }) - { - Result.PushBack(Forward>(Element)); - } - - else if constexpr (requires { Result.Emplace(Result.End(), DeclVal>()); }) - { - Result.Emplace(Result.End(), Forward>(Element)); - } - - else /* if constexpr (requires { Result.Insert(Result.End(), DeclVal>()); }) */ - { - Result.Insert(Result.End(), Forward>(Element)); - } + Ranges::AppendTo(Result, Forward>(Element)); } return Result;