Files
core_io/tjp/core/io/calls.hpp
2026-02-11 16:14:01 -05:00

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