style(templates): redefine placeholders such as ForceInit, InPlace, etc.

This commit is contained in:
_Redstone_c_ 2022-03-14 18:03:57 +08:00
parent 8a3b089648
commit 0b4cb1a9e0
4 changed files with 40 additions and 8 deletions

View File

@ -41,11 +41,6 @@ NAMESPACE_MODULE_BEGIN(Utility)
enum { INDEX_NONE = -1 };
enum { UNICODE_BOM = 0xfeff };
enum EForceInit { ForceInit };
enum ENoInit { NoInit };
enum EInvalid { Invalid };
enum EInPlace { InPlace };
NAMESPACE_MODULE_END(Utility)
NAMESPACE_MODULE_END(Redcraft)
NAMESPACE_REDCRAFT_END

View File

@ -2,6 +2,7 @@
#include "CoreTypes.h"
#include "Templates/Compare.h"
#include "Templates/Placeholders.h"
#include "Concepts/Comparable.h"
#include "TypeTraits/TypeTraits.h"
#include "Miscellaneous/AssertionMacros.h"
@ -19,17 +20,17 @@ public:
constexpr TOptional() : bIsValid(false) { }
constexpr TOptional(EInvalid) : TOptional() { }
constexpr TOptional(FInvalid) : TOptional() { }
template <typename... Types> requires TIsConstructible<OptionalType, Types...>::Value
constexpr explicit TOptional(EInPlace, Types&&... Args)
constexpr explicit TOptional(FInPlace, Types&&... Args)
: bIsValid(true)
{
new(&Value) OptionalType(Forward<Types>(Args)...);
}
template <typename T = OptionalType> requires TIsConstructible<OptionalType, T&&>::Value
&& (!TIsSame<typename TRemoveCVRef<T>::Type, EInPlace>::Value) && (!TIsSame<typename TRemoveCVRef<T>::Type, TOptional>::Value)
&& (!TIsSame<typename TRemoveCVRef<T>::Type, FInPlace>::Value) && (!TIsSame<typename TRemoveCVRef<T>::Type, TOptional>::Value)
constexpr explicit(!TIsConvertible<T&&, OptionalType>::Value) TOptional(T&& InValue)
: TOptional(InPlace, Forward<T>(InValue))
{ }
@ -250,6 +251,12 @@ constexpr bool operator!=(const T& LHS, const TOptional<U>& RHS)
return RHS.IsValid() ? LHS != *RHS : true;
}
template <typename T>
constexpr TOptional<typename TDecay<T>::Type> MakeOptional(FInvalid)
{
return TOptional<typename TDecay<T>::Type>(Invalid);
}
template <typename T>
constexpr TOptional<typename TDecay<T>::Type> MakeOptional(T&& InValue)
{

View File

@ -0,0 +1,29 @@
#pragma once
#include "CoreTypes.h"
NAMESPACE_REDCRAFT_BEGIN
NAMESPACE_MODULE_BEGIN(Redcraft)
NAMESPACE_MODULE_BEGIN(Utility)
struct FForceInit { explicit FForceInit() = default; };
inline constexpr FForceInit ForceInit{};
struct FNoInit { explicit FNoInit() = default; };
inline constexpr FNoInit NoInit{};
struct FInvalid { explicit FInvalid() = default; };
inline constexpr FInvalid Invalid{};
struct FInPlace { explicit FInPlace() = default; };
inline constexpr FInPlace InPlace{};
template <typename T> struct TInPlaceType { explicit TInPlaceType() = default; };
template <typename T> inline constexpr TInPlaceType<T> InPlaceType{};
template <size_t I> struct TInPlaceIndex { explicit TInPlaceIndex() = default; };
template <size_t I> inline constexpr TInPlaceIndex<I> InPlaceIndex{};
NAMESPACE_MODULE_END(Utility)
NAMESPACE_MODULE_END(Redcraft)
NAMESPACE_REDCRAFT_END

View File

@ -2,6 +2,7 @@
#include "CoreTypes.h"
#include "Templates/Utility.h"
#include "Templates/Placeholders.h"
#include "Templates/Container.h"
#include "Templates/Noncopyable.h"
#include "Templates/Invoke.h"