/*** 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 inline T AuTryConstruct(AuCtorCode_t &status, Args&& ... args) { if constexpr (AuIsConstructible::type::value) { status = AuCtorCode_t::Failed(); return T(status, AuForward(args)...); } else { try { status = AuCtorCode_t::Success(); return T(AuForward(args)...); } catch (...) { status = AuCtorCode_t::Failed(); return T(); } } } template inline AuPair AuTryConstructPair(Args&& ... args) { AuCtorCode_t code; T object = AuTryConstruct(AuReference(code), AuForward(args)...); return AuMakePair(AuMove(code), AuMove(object)); } template inline T AuTryConstructWithDefault(AuCtorCode_t &status, T &&def, Args&& ... args) { if constexpr (AuIsConstructible::type::value) { status = AuCtorCode_t::Failed(); T returnValue = T(status, AuForward(args)...); if (!status) { return AuMove(def); } return returnValue; } else { try { status = AuCtorCode_t::Success(); return T(AuForward(args)...); } catch (...) { status = AuCtorCode_t::Failed(); return AuMove(def); } } } template inline AuPair AuTryConstructWithDefaultPair(T &&def, Args&& ... args) { AuCtorCode_t code; T object = AuTryConstructWithDefault(AuReference(code), AuFoward(def), AuForward(args)...); return AuMakePair(AuMove(code), AuMove(object)); }