diff --git a/common/include/serial.h b/common/include/serial.h index dd8a9875c..3e1cb5504 100644 --- a/common/include/serial.h +++ b/common/include/serial.h @@ -25,6 +25,9 @@ namespace serial { template class message; +template +class message_type; + /* Classifiers to identify whether a type is a message<...> */ template class is_message : public std::false_type @@ -38,32 +41,23 @@ class is_message> : public std::true_type namespace detail { -template -struct maximum_size_base +template +struct size_base { - using maximum_size_type = std::integral_constant; + using maximum_size_type = std::integral_constant; + using minimum_size_type = std::integral_constant; static constexpr maximum_size_type maximum_size = {}; + static constexpr minimum_size_type minimum_size = {}; }; -template -constexpr typename maximum_size_base::maximum_size_type maximum_size_base::maximum_size; +template +constexpr typename size_base::maximum_size_type size_base::maximum_size; + +template +constexpr typename size_base::minimum_size_type size_base::minimum_size; } -template -class integral_type : - public detail::maximum_size_base -{ - static_assert(std::is_integral::value, "integral_type used on non-integral type"); -}; - -template -class enum_type : - public detail::maximum_size_base -{ - static_assert(std::is_enum::value, "enum_type used on non-enum type"); -}; - template class is_cxx_array : public std::false_type { @@ -100,12 +94,6 @@ static typename std::enable_if::value, void>::type process_buff template static void process_buffer(Accessor &, const message &); -template -class class_type; - -template -class array_type; - class endian_access { public: @@ -332,15 +320,6 @@ static inline const T &extract_value(const std::tuple &t) return std::get<0>(t); } -/* Never defined. Used only in unevaluated context for decltype. - * If minimum_size exists, it is used. Otherwise, maximum_size is used. - */ -template -typename T::minimum_size_type get_minimum_size(T *); - -template -typename T::maximum_size_type get_minimum_size(...); - template struct message_dispatch_base { @@ -421,6 +400,9 @@ class assert_udt_message_compatible1, std::tuple> template class assert_udt_message_compatible; +template +using class_type = message_type()))>; + template class assert_udt_message_compatible> : public assert_udt_message_compatible1::as_message, std::tuple> { @@ -471,20 +453,19 @@ template class message_dispatch_type; template -class message_dispatch_type::value, void>::type> : - public detail::message_dispatch_base> -{ -}; - -template -class message_dispatch_type::value, void>::type> : - public detail::message_dispatch_base> +class message_dispatch_type::value or std::is_enum::value, void>::type> : + public detail::message_dispatch_base> { }; template class message_dispatch_type::value, void>::type> : - public detail::message_dispatch_base> + public detail::message_dispatch_base< + detail::size_base< + message_type::maximum_size * std::tuple_size::value, + message_type::minimum_size * std::tuple_size::value + > + > { }; @@ -500,9 +481,8 @@ class message_type : { using effective_type = typename message_dispatch_type::type>::effective_type; public: - typedef decltype(detail::get_minimum_size(nullptr)) minimum_size_type; - static constexpr minimum_size_type minimum_size = {}; using effective_type::maximum_size; + using effective_type::minimum_size; }; template @@ -513,30 +493,15 @@ public: typedef message as_message; }; -template -class class_type : public message_type()))> -{ -}; - -template -class array_type> : - public detail::maximum_size_base::maximum_size * N> -{ -}; - -template -class array_type> : public array_type> -{ -}; - template class message_type> : - public detail::maximum_size_base::maximum_size + message_type>::maximum_size> + public detail::size_base< + message_type::maximum_size + message_type>::maximum_size, + message_type::minimum_size + message_type>::minimum_size + > { public: typedef message as_message; - typedef std::integral_constant::minimum_size + message_type>::minimum_size> minimum_size_type; - static constexpr minimum_size_type minimum_size = {}; }; template