CeresEngine 0.2.0
A game development framework
Loading...
Searching...
No Matches
MetaFor.hpp
Go to the documentation of this file.
1//
2// CeresEngine - A game development framework
3//
4// Created by Rogiel Sulzbach.
5// Copyright (c) 2018-2022 Rogiel Sulzbach. All rights reserved.
6//
7
8#pragma once
9
10#include <initializer_list>
11#include <tuple>
12
13namespace CeresEngine::MPL {
14
15 template<typename TFunction, typename TTuple, std::size_t... TIndices>
16 constexpr decltype(auto) tupleApplyImpl(TFunction&& function, TTuple&& tuple, std::index_sequence<TIndices...>) {
17 return std::forward<TFunction>(function)(std::get<TIndices>(std::forward<TTuple>(tuple))...);
18 }
19
20 template<typename TFunction, typename TTuple> constexpr decltype(auto) tupleApply(TFunction&& function, TTuple&& tuple) {
21 using Indices = std::make_index_sequence<std::tuple_size<std::decay_t<TTuple>>::value>;
22 return tupleApplyImpl(std::forward<TFunction>(function), std::forward<TTuple>(tuple), Indices{});
23 }
24
25 template<typename TFunction, typename... Ts> constexpr decltype(auto) forArgs(TFunction&& function, Ts&&... args) {
26 return (void)std::initializer_list<int>{(function(std::forward<Ts>(args)), 0)...};
27 }
28
29 template<typename TFunction, typename TTuple> constexpr decltype(auto) forTuple(TFunction&& function, TTuple&& tuple) {
30 return tupleApply([&function](auto&&... xs) { forArgs(function, std::forward<decltype(xs)>(xs)...); }, std::forward<TTuple>(tuple));
31 }
32
33} // namespace CeresEngine::MPL
Definition All.hpp:15
constexpr decltype(auto) tupleApply(TFunction &&function, TTuple &&tuple)
Definition MetaFor.hpp:20
constexpr decltype(auto) tupleApplyImpl(TFunction &&function, TTuple &&tuple, std::index_sequence< TIndices... >)
Definition MetaFor.hpp:16
constexpr decltype(auto) forTuple(TFunction &&function, TTuple &&tuple)
Definition MetaFor.hpp:29
constexpr decltype(auto) forArgs(TFunction &&function, Ts &&... args)
Definition MetaFor.hpp:25
constexpr size_t hash(const T &v)
Generates a hash for the provided type.
Definition Hash.hpp:25