diff --git a/include/port.hpp b/include/port.hpp index 20e5b10e3..07930f5c7 100644 --- a/include/port.hpp +++ b/include/port.hpp @@ -21,21 +21,13 @@ using supported_type = std::variant -constexpr port_direction_t -find_port_direction(fair::meta::typelist, port_direction_t default_value = port_direction_t::ANY) { - if constexpr ((... || fair::meta::is_any_of_v) ) { - return (... ? (air::meta::is_any_of_v ? static_cast(Args::value) : default_value) : default_value); - } else { - return default_value; - } -} - enum class connection_result_t { SUCCESS, FAILED }; + enum class port_type_t { STREAM, /*!< used for single-producer-only ond usually synchronous one-to-one or one-to-many communications */ MESSAGE /*!< used for multiple-producer one-to-one, one-to-many, many-to-one, or many-to-many communications */ }; + enum class port_domain_t { CPU, GPU, NET, FPGA, DSP, MLU }; template @@ -64,16 +56,16 @@ struct internal_port_buffers { }; template -struct BufferSize { +struct RequiredSamples { static constexpr std::size_t MinSamples = MIN_SAMPLES; static constexpr std::size_t MaxSamples = MAX_SAMPLES; }; template -struct is_buffer_size : std::false_type {}; +struct is_required_samples : std::false_type {}; template -struct is_buffer_size> : std::true_type {}; +struct is_required_samples> : std::true_type {}; /** * @brief 'ports' are interfaces that allows data to flow between blocks in a graph, similar to RF connectors. @@ -107,13 +99,13 @@ template, typename... Arguments> class port { public: - using BufferSize = typename fair::meta::typelist::template find_or_default>; static_assert(PortDirection != port_direction_t::ANY, "ANY reserved for queries and not port direction declarations"); - using value_type = T; - - static constexpr bool IS_INPUT = PortDirection == port_direction_t::INPUT; - static constexpr bool IS_OUTPUT = PortDirection == port_direction_t::OUTPUT; + using value_type = T; + using Required = typename fair::meta::typelist::template find_or_default>; + static constexpr port_direction_t Direction = PortDirection; + static constexpr bool IS_INPUT = PortDirection == port_direction_t::INPUT; + static constexpr bool IS_OUTPUT = PortDirection == port_direction_t::OUTPUT; template using with_name = port; @@ -523,7 +515,7 @@ class dynamic_port { } ~wrapper() override = default; - + // TODO revisit: constexpr was removed because emscripten does not support constexpr function for non literal type, like DataSet #if defined(__EMSCRIPTEN__) [[nodiscard]] supported_type diff --git a/include/port_traits.hpp b/include/port_traits.hpp index 9ae32d5c8..11b9b7d1e 100644 --- a/include/port_traits.hpp +++ b/include/port_traits.hpp @@ -8,11 +8,11 @@ namespace fair::graph::traits::port { template concept has_fixed_info_v = requires { - typename T::value_type; - { T::static_name() }; - { T::direction() } -> std::same_as; - { T::type() } -> std::same_as; - }; + typename T::value_type; + { T::static_name() }; + { T::direction() } -> std::same_as; + { T::type() } -> std::same_as; +}; template using has_fixed_info = std::integral_constant>; @@ -43,25 +43,15 @@ using is_output = std::integral_constant concept is_output_v = is_output::value; -template +template concept is_port_v = is_output_v || is_input_v; template -struct min_samples : std::integral_constant::value... })> {}; - -template -struct min_samples> - : std::integral_constant {}; +struct min_samples : std::integral_constant {}; template -struct max_samples : std::integral_constant::value... })> {}; - -template -struct max_samples> - : std::integral_constant {}; +struct max_samples : std::integral_constant {}; -} // namespace port +} // namespace fair::graph::traits::port #endif // include guard diff --git a/test/qa_dynamic_port.cpp b/test/qa_dynamic_port.cpp index 108ba81cf..9f4203f76 100644 --- a/test/qa_dynamic_port.cpp +++ b/test/qa_dynamic_port.cpp @@ -109,8 +109,10 @@ const boost::ut::suite PortApiTests = [] { static_assert(Port>); static_assert(Port>); - static_assert(IN::static_name() == fixed_string("in")); - static_assert(requires { IN("in").name; }); + static_assert(IN::Required::MinSamples == 1); + static_assert(IN::Required::MaxSamples == 2); + static_assert(IN::direction() == port_direction_t::INPUT); + static_assert(OUT::direction() == port_direction_t::OUTPUT); }; "PortBufferApi"_test = [] {