39 lines
1.1 KiB
C++
Executable File
39 lines
1.1 KiB
C++
Executable File
// License: Modified MIT (NON-AI)
|
|
// See the LICENSE file in the root directory for license information.
|
|
// Copyright 2025 Timothy Prepscius
|
|
|
|
#pragma once
|
|
|
|
#include <tuple>
|
|
#include <utility>
|
|
|
|
namespace tjp::core::io {
|
|
|
|
template<typename F, typename... Args>
|
|
void call_f_1s(F&& f, Args&&... args) {
|
|
(f(std::forward<Args>(args)), ...);
|
|
}
|
|
|
|
template<typename F, typename Tuple, std::size_t... I>
|
|
void call_f_2s_(F &&f, Tuple&& tup, std::index_sequence<I...>) {
|
|
(f(
|
|
std::forward<decltype(std::get<I * 2>(std::forward<Tuple>(tup)))>(
|
|
std::get<I * 2>(std::forward<Tuple>(tup))),
|
|
std::forward<decltype(std::get<I * 2 + 1>(std::forward<Tuple>(tup)))>(
|
|
std::get<I * 2 + 1>(std::forward<Tuple>(tup)))
|
|
), ...);
|
|
}
|
|
|
|
template<typename F, typename... Args>
|
|
void call_f_2s(F &&f, Args&&... args)
|
|
{
|
|
static_assert(sizeof...(Args) % 2 == 0, "Arguments must be in key-value pairs");
|
|
|
|
auto args_tuple = std::forward_as_tuple(std::forward<Args>(args)...);
|
|
constexpr std::size_t N = sizeof...(Args) / 2;
|
|
|
|
call_f_2s_(std::forward<F>(f), args_tuple, std::make_index_sequence<N>{});
|
|
}
|
|
|
|
} // namespace
|