#pragma once #include #include #include namespace kpn { template struct fixed_string { char data[N]{}; constexpr fixed_string(const char (&s)[N]) { std::copy_n(s, N, data); } constexpr bool operator==(const fixed_string&) const = default; template constexpr bool operator==(const fixed_string&) const { return false; } constexpr std::string_view view() const { return {data, N - 1}; } }; template fixed_string(const char (&)[N]) -> fixed_string; // ── Port name pack lookup ───────────────────────────────────────────────────── inline constexpr std::size_t npos = std::size_t(-1); template constexpr std::size_t index_of() { std::size_t i = 0; bool found = false; auto check = [&](auto n) { if (!found) { if (Name == n) found = true; else ++i; } }; (check(Names), ...); return found ? i : npos; } // ── in<> / out<> name tag structs ───────────────────────────────────────────── template struct in {}; template struct out {}; } // namespace kpn