/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: auTupleUtils.hpp Date: 2022-2-1 File: AuroraUtils.hpp File: auROXTLUtils.hpp Date: 2021-6-9 Author: Reece ***/ #pragma once #include "auIntegerSequence.hpp" #if !defined(AURORA_RUNTIME_MAKE_PAIR) #define AURORA_RUNTIME_MAKE_PAIR std::make_pair #endif #if !defined(AURORA_RUNTIME_MAKE_TUPLE) #define AURORA_RUNTIME_MAKE_TUPLE std::make_tuple #endif #if !defined(AURORA_RUNTIME_GET_TUPLE) #define AURORA_RUNTIME_GET_TUPLE std::get #endif #if !defined(AURORA_RUNTIME_TUPLE_CAT) #define AURORA_RUNTIME_TUPLE_CAT std::tuple_cat #endif #if !defined(AURORA_RUNTIME_TUPLE_SIZE) #define AURORA_RUNTIME_TUPLE_SIZE std::tuple_size #endif #if !defined(AURORA_RUNTIME_APPLY) #define AURORA_RUNTIME_APPLY std::apply #endif template static auto AuMakePair(Args&&... args) { return AURORA_RUNTIME_MAKE_PAIR(AuForward(args)...); } template static auto AuMakeTuple(Args&&... args) { return AURORA_RUNTIME_MAKE_TUPLE(AuForward(args)...); } template static auto &AuGet(Args&&... args) { return AURORA_RUNTIME_GET_TUPLE(AuForward(args)...); } template static auto AuTupleCat(Args&&... args) { return AURORA_RUNTIME_TUPLE_CAT(AuForward(args)...); } template static auto AuTupleApply(F &&f, Tuple &&t) { return AURORA_RUNTIME_APPLY(f, t); } namespace __audetail { template static auto AuTuplePopFrontImpl(const Tuple &tuple, AuIndexSequence) { return AURORA_RUNTIME_MAKE_TUPLE(AuGet<1 + Is>(tuple)...); } template static auto AuTuplePopImpl(const Tuple &tuple, AuIndexSequence) { return AURORA_RUNTIME_MAKE_TUPLE(AuGet(tuple)...); } } template static auto AuTuplePopFront(const Tuple &tuple) { return __audetail::AuTuplePopFrontImpl(tuple, AuMakeIndexSequence::value - 1>()); } template static auto AuTuplePopBack(const Tuple &tuple) { return __audetail::AuTuplePopImpl(tuple, AuMakeIndexSequence::value - 1>()); } template static auto AuTuplePushFront(const Tuple &tuple, const T &t) { return AURORA_RUNTIME_TUPLE_CAT(AURORA_RUNTIME_MAKE_TUPLE(t), tuple); } template static auto AuTuplePushFront(const Tuple &tuple, T &&t) { return AURORA_RUNTIME_TUPLE_CAT(AURORA_RUNTIME_MAKE_TUPLE(t), tuple); } template static auto AuTuplePushBack(const Tuple &tuple, const T &t) { return AURORA_RUNTIME_TUPLE_CAT(tuple, AURORA_RUNTIME_MAKE_TUPLE(t)); } template static auto AuTuplePushBack(const Tuple &tuple, T &&t) { return AURORA_RUNTIME_TUPLE_CAT(tuple, AURORA_RUNTIME_MAKE_TUPLE(t)); }