[*] Split auTryConstruct
This commit is contained in:
parent
8713d2706e
commit
edaa7a295a
@ -7,69 +7,15 @@
|
|||||||
***/
|
***/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
template<typename T, typename ... Args>
|
struct AuCtorCode_t
|
||||||
inline T AuTryConstruct(AuCtorCode_t &status, Args&& ... args)
|
|
||||||
{
|
{
|
||||||
if constexpr (AuIsConstructible<T, bool &, Args ...>::type::value)
|
bool 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>
|
operator bool() const
|
||||||
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();
|
return value;
|
||||||
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>
|
static constexpr AuCtorCode_t Failed () { return AuCtorCode_t {false}; }
|
||||||
inline AuPair<AuCtorCode_t, T> AuTryConstructWithDefaultPair(T &&def, Args&& ... args)
|
static constexpr AuCtorCode_t Success() { return AuCtorCode_t {true}; }
|
||||||
{
|
};
|
||||||
AuCtorCode_t code;
|
|
||||||
T object = AuTryConstructWithDefault<T, Args...>(AuReference(code), AuFoward(def), AuForward<Args>(args)...);
|
|
||||||
return AuMakePair(AuMove(code), AuMove(object));
|
|
||||||
}
|
|
75
Include/auROXTL/auTryConstructUtils.hpp
Normal file
75
Include/auROXTL/auTryConstructUtils.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));
|
||||||
|
}
|
@ -7,6 +7,15 @@
|
|||||||
***/
|
***/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
It is not unusual for one to desire a unit-conversion constant when the developer understands
|
||||||
|
[*] FPU isn't available
|
||||||
|
[*] Can be done quickly without a framework
|
||||||
|
[*] Using a framework to normalize to a base unit, apply a translation, and return the desired reuslt is considered overkill
|
||||||
|
These functions are not to be converted into such a convoluted templated potentially-constexpr castable mess
|
||||||
|
The intention is to keep these utility functions as simple as the dumb operations they implement
|
||||||
|
*/
|
||||||
|
|
||||||
template<class Inch, class Precision = Inch, class Feet>
|
template<class Inch, class Precision = Inch, class Feet>
|
||||||
constexpr const Inch AuFeetToInch(Feet feet)
|
constexpr const Inch AuFeetToInch(Feet feet)
|
||||||
{
|
{
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <auROXTL/auTypes.hpp>
|
#include <auROXTL/auTypes.hpp>
|
||||||
|
#include <auROXTL/auTryConstruct.hpp>
|
||||||
#include <auROXTL/auTemplateMeta.hpp>
|
#include <auROXTL/auTemplateMeta.hpp>
|
||||||
#include <auROXTL/auResult.hpp>
|
#include <auROXTL/auResult.hpp>
|
||||||
#include <auROXTL/auMemoryModel.hpp>
|
#include <auROXTL/auMemoryModel.hpp>
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include <nmmintrin.h>
|
#include <nmmintrin.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include <auROXTL/auMemory.hpp>
|
#include <auROXTL/auMemory.hpp>
|
||||||
#include <auROXTL/auCopyMoveUtils.hpp>
|
#include <auROXTL/auCopyMoveUtils.hpp>
|
||||||
#include <auROXTL/auContainerUtils.hpp>
|
#include <auROXTL/auContainerUtils.hpp>
|
||||||
@ -44,22 +45,7 @@
|
|||||||
#include <auROXTL/auUnitUtils.hpp>
|
#include <auROXTL/auUnitUtils.hpp>
|
||||||
#include <auROXTL/auFNV1Utils.hpp>
|
#include <auROXTL/auFNV1Utils.hpp>
|
||||||
#include <auROXTL/auHashUtils.hpp>
|
#include <auROXTL/auHashUtils.hpp>
|
||||||
|
#include <auROXTL/auTryConstructUtils.hpp>
|
||||||
template<typename T, typename ... Args>
|
|
||||||
inline T AuTryConstruct(bool &status, Args&& ... args)
|
|
||||||
{
|
|
||||||
T t;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
t = T(AuForward<T>(args)...);
|
|
||||||
status = true;
|
|
||||||
}
|
|
||||||
catch (...)
|
|
||||||
{
|
|
||||||
status = false;
|
|
||||||
}
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
struct IAuNullDelegate
|
struct IAuNullDelegate
|
||||||
|
Loading…
Reference in New Issue
Block a user