feat(templates): add TReferenceWrapper and the corresponding testing

This commit is contained in:
2022-02-09 21:46:39 +08:00
parent ad80dcd78f
commit 2fa4bcea13
4 changed files with 68 additions and 0 deletions

View File

@ -0,0 +1,45 @@
#pragma once
#include "CoreTypes.h"
#include "Templates/Invoke.h"
#include "Templates/Utility.h"
#include "TypeTraits/TypeTraits.h"
NAMESPACE_REDCRAFT_BEGIN
NAMESPACE_MODULE_BEGIN(Redcraft)
NAMESPACE_MODULE_BEGIN(Utility)
template <typename T>
class TReferenceWrapper
{
public:
using Type = T;
template <typename U> requires !TIsSame<TReferenceWrapper, typename TRemoveCVRef<U>::Type>::Value
constexpr TReferenceWrapper(U&& Object) : Ptr(AddressOf(Forward<U>(Object))) { }
TReferenceWrapper(const TReferenceWrapper&) = default;
TReferenceWrapper& operator=(const TReferenceWrapper& x) = default;
constexpr operator T&() const { return *Ptr; }
constexpr T& Get() const { return *Ptr; }
template <typename... Types>
constexpr TInvokeResult<T&, Types...>::Type operator()(Types&&... Args) const
{
return Invoke(Get(), Forward<Types>(Args)...);
}
private:
T* Ptr;
};
template <typename T>
TReferenceWrapper(T&) -> TReferenceWrapper<T>;
NAMESPACE_MODULE_END(Utility)
NAMESPACE_MODULE_END(Redcraft)
NAMESPACE_REDCRAFT_END

View File

@ -5,3 +5,4 @@
#include "Templates/Container.h"
#include "Templates/Noncopyable.h"
#include "Templates/Invoke.h"
#include "Templates/ReferenceWrapper.h"

View File

@ -8,6 +8,7 @@ NAMESPACE_MODULE_BEGIN(Utility)
void REDCRAFTUTILITY_API TestTemplates();
void REDCRAFTUTILITY_API TestInvoke();
void REDCRAFTUTILITY_API TestReferenceWrapper();
void REDCRAFTUTILITY_API TestMiscellaneous();
NAMESPACE_MODULE_END(Utility)