118 lines
2.9 KiB
C++
118 lines
2.9 KiB
C++
/***
|
|
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<typename... Args>
|
|
static auto AuMakePair(Args&&... args)
|
|
{
|
|
return AURORA_RUNTIME_MAKE_PAIR(AuForward<Args>(args)...);
|
|
}
|
|
|
|
template<typename... Args>
|
|
static auto AuMakeTuple(Args&&... args)
|
|
{
|
|
return AURORA_RUNTIME_MAKE_TUPLE(AuForward<Args>(args)...);
|
|
}
|
|
|
|
template<AuUInt N, typename... Args>
|
|
static auto &AuGet(Args&&... args)
|
|
{
|
|
return AURORA_RUNTIME_GET_TUPLE<N>(AuForward<Args>(args)...);
|
|
}
|
|
|
|
template<typename... Args>
|
|
static auto AuTupleCat(Args&&... args)
|
|
{
|
|
return AURORA_RUNTIME_TUPLE_CAT(AuForward<Args>(args)...);
|
|
}
|
|
|
|
template <class F, class Tuple>
|
|
static auto AuTupleApply(F &&f, Tuple &&t)
|
|
{
|
|
return AURORA_RUNTIME_APPLY(f, t);
|
|
}
|
|
|
|
namespace __audetail
|
|
{
|
|
template <class Tuple, AuUInt... Is>
|
|
static auto AuTuplePopFrontImpl(const Tuple &tuple, AuIndexSequence<Is...>)
|
|
{
|
|
return AURORA_RUNTIME_MAKE_TUPLE(AuGet<1 + Is>(tuple)...);
|
|
}
|
|
|
|
template <class Tuple, AuUInt... Is>
|
|
static auto AuTuplePopImpl(const Tuple &tuple, AuIndexSequence<Is...>)
|
|
{
|
|
return AURORA_RUNTIME_MAKE_TUPLE(AuGet<Is>(tuple)...);
|
|
}
|
|
}
|
|
|
|
template <class Tuple>
|
|
static auto AuTuplePopFront(const Tuple &tuple)
|
|
{
|
|
return __audetail::AuTuplePopFrontImpl(tuple, AuMakeIndexSequence<AURORA_RUNTIME_TUPLE_SIZE<Tuple>::value - 1>());
|
|
}
|
|
|
|
template <class Tuple>
|
|
static auto AuTuplePopBack(const Tuple &tuple)
|
|
{
|
|
return __audetail::AuTuplePopImpl(tuple, AuMakeIndexSequence<AURORA_RUNTIME_TUPLE_SIZE<Tuple>::value - 1>());
|
|
}
|
|
|
|
template <class Tuple, class T>
|
|
static auto AuTuplePushFront(const Tuple &tuple, const T &t)
|
|
{
|
|
return AURORA_RUNTIME_TUPLE_CAT(AURORA_RUNTIME_MAKE_TUPLE(t), tuple);
|
|
}
|
|
|
|
template <class Tuple, class T>
|
|
static auto AuTuplePushFront(const Tuple &tuple, T &&t)
|
|
{
|
|
return AURORA_RUNTIME_TUPLE_CAT(AURORA_RUNTIME_MAKE_TUPLE(t), tuple);
|
|
}
|
|
|
|
template <class Tuple, class T>
|
|
static auto AuTuplePushBack(const Tuple &tuple, const T &t)
|
|
{
|
|
return AURORA_RUNTIME_TUPLE_CAT(tuple, AURORA_RUNTIME_MAKE_TUPLE(t));
|
|
}
|
|
|
|
template <class Tuple, class T>
|
|
static auto AuTuplePushBack(const Tuple &tuple, T &&t)
|
|
{
|
|
return AURORA_RUNTIME_TUPLE_CAT(tuple, AURORA_RUNTIME_MAKE_TUPLE(t));
|
|
} |