[+] AuIsConstructible_v
[+] AuIsConstructible_t [+] AuTryConstruct [*] AuReference
This commit is contained in:
parent
5a72807cc6
commit
8713d2706e
@ -25,6 +25,12 @@ constexpr T &&AuForward(AuRemoveReference_t<T> &&arg)
|
||||
return static_cast<T &&>(arg);
|
||||
}
|
||||
|
||||
template<class T>
|
||||
constexpr T &AuReference(T &arg)
|
||||
{
|
||||
return static_cast<T &>(arg);
|
||||
}
|
||||
|
||||
template<class T, class U = T>
|
||||
inline T AuExchange(T &obj, U &&newValue)
|
||||
{
|
||||
|
@ -196,6 +196,20 @@ struct AuEnableIf<true, T>
|
||||
template<bool Test, class T = void>
|
||||
using AuEnableIf_t = typename AuEnableIf<Test, T>::type;
|
||||
|
||||
template<typename T, class ... Args>
|
||||
struct AuIsConstructible
|
||||
{
|
||||
template<typename T, class ... Args> static constexpr AuTrueType Test(decltype(T(std::declval<Args>()...)));
|
||||
template<typename T, class ... Args> static constexpr AuFalseType Test(...);
|
||||
using type = decltype(Test<T, Args...>(0));
|
||||
};
|
||||
|
||||
template<typename T, class ... Args>
|
||||
inline constexpr bool AuIsConstructible_t = AuIsConstructible<T, Args ...>::type;
|
||||
|
||||
template<typename T, class ... Args>
|
||||
inline constexpr bool AuIsConstructible_v = AuIsConstructible_t<T, Args ...>::value;
|
||||
|
||||
template<bool Test, class T, class T2>
|
||||
struct AuConditional
|
||||
{
|
||||
|
75
Include/auROXTL/auTryConstruct.hpp
Normal file
75
Include/auROXTL/auTryConstruct.hpp
Normal file
@ -0,0 +1,75 @@
|
||||
/***
|
||||
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: auTryConstruct.hpp
|
||||
Date: 2022-3-25
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
template<typename T, typename ... Args>
|
||||
inline T AuTryConstruct(AuCtorCode_t &status, Args&& ... args)
|
||||
{
|
||||
if constexpr (AuIsConstructible<T, bool &, Args ...>::type::value)
|
||||
{
|
||||
status = AuCtorCode_t::Failed();
|
||||
return T(status, AuForward<T>(args)...);
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
status = AuCtorCode_t::Success();
|
||||
return T(AuForward<T>(args)...);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
status = AuCtorCode_t::Failed();
|
||||
return T();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T, typename ... Args>
|
||||
inline AuPair<AuCtorCode_t, T> AuTryConstructPair(Args&& ... args)
|
||||
{
|
||||
AuCtorCode_t code;
|
||||
T object = AuTryConstruct<T, Args...>(AuReference(code), AuForward<Args>(args)...);
|
||||
return AuMakePair(AuMove(code), AuMove(object));
|
||||
}
|
||||
|
||||
template<typename T, typename ... Args>
|
||||
inline T AuTryConstructWithDefault(AuCtorCode_t &status, T &&def, Args&& ... args)
|
||||
{
|
||||
if constexpr (AuIsConstructible<T, bool &, Args ...>::type::value)
|
||||
{
|
||||
status = AuCtorCode_t::Failed();
|
||||
T returnValue = T(status, AuForward<T>(args)...);
|
||||
if (!status)
|
||||
{
|
||||
return AuMove(def);
|
||||
}
|
||||
return returnValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
status = AuCtorCode_t::Success();
|
||||
return T(AuForward<T>(args)...);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
status = AuCtorCode_t::Failed();
|
||||
return AuMove(def);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T, typename ... Args>
|
||||
inline AuPair<AuCtorCode_t, T> AuTryConstructWithDefaultPair(T &&def, Args&& ... args)
|
||||
{
|
||||
AuCtorCode_t code;
|
||||
T object = AuTryConstructWithDefault<T, Args...>(AuReference(code), AuFoward(def), AuForward<Args>(args)...);
|
||||
return AuMakePair(AuMove(code), AuMove(object));
|
||||
}
|
Loading…
Reference in New Issue
Block a user