[+] AuCtorErrorTag

This commit is contained in:
Reece Wilson 2022-03-26 13:21:31 +00:00
parent dd2bba92e5
commit a7a982194e
2 changed files with 20 additions and 4 deletions

View File

@ -7,10 +7,26 @@
***/
#pragma once
struct AuCtorCode_t
struct AuCtorErrorTag
{
/*
operator bool() const;
static constexpr AuCtorCode_t Failed ();
static constexpr AuCtorCode_t Success();
*/
};
struct AuCtorCode_t : AuCtorErrorTag
{
bool value;
inline constexpr AuCtorCode_t()
{};
inline constexpr AuCtorCode_t(bool val) : value(val)
{};
operator bool() const
{
return value;

View File

@ -7,17 +7,17 @@
***/
#pragma once
#define _AU_TRYCONTRUST_CHECKCODE AU_TEMPLATE_ENABLE_WHEN(AuIsSame_v<CtorCode_t, AuCtorCode_t> || AuIsBaseOf_v<AuCtorCode_t, CtorCode_t>)
#define _AU_TRYCONTRUST_CHECKCODE AU_TEMPLATE_ENABLE_WHEN(AuIsSame_v<CtorCode_t, AuCtorErrorTag> || AuIsBaseOf_v<AuCtorErrorTag, CtorCode_t>)
template <class T, class CtorCode_t = AuCtorCode_t, typename ... Args, _AU_TRYCONTRUST_CHECKCODE>
inline T AuTryConstruct(CtorCode_t &status, Args&& ... args)
{
if constexpr (AuIsConstructible_v<T, AuCtorCode_t &, Args ...>)
if constexpr (AuIsConstructible_v<T, CtorCode_t &, Args ...>)
{
status = CtorCode_t::Failed();
return T(AuReference(status), AuForward<T>(args)...);
}
else if constexpr (AuIsConstructible_v<T, Args ..., AuCtorCode_t &>)
else if constexpr (AuIsConstructible_v<T, Args ..., CtorCode_t &>)
{
status = CtorCode_t::Failed();
return T(AuForward<T>(args)..., AuReference(status));