fix(iterators): fix insert iterators to be assignable
This commit is contained in:
parent
22952237df
commit
fc87332845
@ -6,6 +6,7 @@
|
|||||||
#include "Templates/Utility.h"
|
#include "Templates/Utility.h"
|
||||||
#include "Templates/Noncopyable.h"
|
#include "Templates/Noncopyable.h"
|
||||||
#include "Templates/Invoke.h"
|
#include "Templates/Invoke.h"
|
||||||
|
#include "Memory/Address.h"
|
||||||
#include "Miscellaneous/AssertionMacros.h"
|
#include "Miscellaneous/AssertionMacros.h"
|
||||||
|
|
||||||
NAMESPACE_REDCRAFT_BEGIN
|
NAMESPACE_REDCRAFT_BEGIN
|
||||||
@ -124,27 +125,77 @@ private:
|
|||||||
|
|
||||||
static_assert(COutputIterator<TInsertIterator<void(*)(int)>, int>);
|
static_assert(COutputIterator<TInsertIterator<void(*)(int)>, int>);
|
||||||
|
|
||||||
|
template <typename C>
|
||||||
|
class FFrontInserter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
FORCEINLINE constexpr explicit FFrontInserter(C& InContainer) : Container(AddressOf(InContainer)) { }
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
FORCEINLINE constexpr void operator()(T&& A) { Container->PushFront(Forward<T>(A)); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
C* Container;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename C>
|
||||||
|
class FBackInserter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
FORCEINLINE constexpr explicit FBackInserter(C& InContainer) : Container(AddressOf(InContainer)) { }
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
FORCEINLINE constexpr void operator()(T&& A) { Container->PushBack(Forward<T>(A)); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
C* Container;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename C>
|
||||||
|
class FInserter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
template <typename I>
|
||||||
|
FORCEINLINE constexpr FInserter(C& InContainer, I&& InIter) : Container(AddressOf(InContainer)), Iter(Forward<I>(InIter)) { }
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
FORCEINLINE constexpr void operator()(T&& A) { Iter = Container->Insert(Iter, Forward<T>(A)); ++Iter; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
C* Container;
|
||||||
|
typename C::FConstIterator Iter;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
NAMESPACE_PRIVATE_END
|
NAMESPACE_PRIVATE_END
|
||||||
|
|
||||||
/** Creates an iterator adapter inserted in the front of the container. */
|
/** Creates an iterator adapter inserted in the front of the container. */
|
||||||
template <typename C>
|
template <typename C>
|
||||||
NODISCARD FORCEINLINE constexpr auto MakeFrontInserter(C& Container)
|
NODISCARD FORCEINLINE constexpr auto MakeFrontInserter(C& Container)
|
||||||
{
|
{
|
||||||
return NAMESPACE_PRIVATE::TInsertIterator([&Container]<typename T>(T&& A) { Container.PushFront(Forward<T>(A)); });
|
return NAMESPACE_PRIVATE::TInsertIterator(NAMESPACE_PRIVATE::FFrontInserter(Container));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Creates an iterator adapter inserted in the back of the container. */
|
/** Creates an iterator adapter inserted in the back of the container. */
|
||||||
template <typename C>
|
template <typename C>
|
||||||
NODISCARD FORCEINLINE constexpr auto MakeBackInserter(C& Container)
|
NODISCARD FORCEINLINE constexpr auto MakeBackInserter(C& Container)
|
||||||
{
|
{
|
||||||
return NAMESPACE_PRIVATE::TInsertIterator([&Container]<typename T>(T&& A) { Container.PushBack(Forward<T>(A)); });
|
return NAMESPACE_PRIVATE::TInsertIterator(NAMESPACE_PRIVATE::FBackInserter(Container));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Creates an iterator adapter inserted in the container. */
|
/** Creates an iterator adapter inserted in the container. */
|
||||||
template <typename C>
|
template <typename C, typename I>
|
||||||
NODISCARD FORCEINLINE constexpr auto MakeInserter(C& Container, const typename C::FConstIterator& InIter)
|
NODISCARD FORCEINLINE constexpr auto MakeInserter(C& Container, I&& InIter)
|
||||||
{
|
{
|
||||||
return NAMESPACE_PRIVATE::TInsertIterator([&Container, Iter = InIter]<typename T>(T&& A) mutable { Iter = Container.Insert(Iter, Forward<T>(A)); ++Iter; });
|
return NAMESPACE_PRIVATE::TInsertIterator(NAMESPACE_PRIVATE::FInserter(Container, Forward<I>(InIter)));
|
||||||
}
|
}
|
||||||
|
|
||||||
NAMESPACE_MODULE_END(Utility)
|
NAMESPACE_MODULE_END(Utility)
|
||||||
|
Loading…
Reference in New Issue
Block a user