diff --git a/include/rtlog/rtlog.h b/include/rtlog/rtlog.h index 725345d..e6c46d1 100644 --- a/include/rtlog/rtlog.h +++ b/include/rtlog/rtlog.h @@ -42,12 +42,6 @@ namespace rtlog { -template struct BasicLogData { - LogData mLogData{}; - size_t mSequenceNumber{}; - std::array mMessage{}; -}; - enum class Status { Success = 0, @@ -56,16 +50,41 @@ enum class Status { }; namespace detail { + +template struct BasicLogData { + LogData mLogData{}; + size_t mSequenceNumber{}; + std::array mMessage{}; +}; + template -struct has_try_enqueue : std::false_type {}; +struct has_try_enqueue_by_move : std::false_type {}; template -struct has_try_enqueue().try_enqueue( - std::declval()))>> - : std::true_type {}; +struct has_try_enqueue_by_move< + T, std::void_t().try_enqueue( + std::declval()))>> : std::true_type {}; template -inline constexpr bool has_try_enqueue_v = has_try_enqueue::value; +inline constexpr bool has_try_enqueue_by_move_v = + has_try_enqueue_by_move::value; + +template +struct has_try_enqueue_by_value : std::false_type {}; + +template +struct has_try_enqueue_by_value< + T, std::void_t().try_enqueue( + std::declval()))>> : std::true_type { +}; + +template +inline constexpr bool has_try_enqueue_by_value_v = + has_try_enqueue_by_value::value; + +template +inline constexpr bool has_try_enqueue_v = + has_try_enqueue_by_move_v || has_try_enqueue_by_value_v; template struct has_try_dequeue : std::false_type {}; @@ -77,6 +96,26 @@ struct has_try_dequeue().try_dequeue( template inline constexpr bool has_try_dequeue_v = has_try_dequeue::value; + +template +struct has_value_type : std::false_type {}; + +template +struct has_value_type> : std::true_type { +}; + +template +inline constexpr bool has_value_type_v = has_value_type::value; + +template +struct has_int_constructor : std::false_type {}; + +template +struct has_int_constructor()))>> + : std::true_type {}; + +template +inline constexpr bool has_int_constructor_v = has_int_constructor::value; } // namespace detail // On earlier versions of compilers (especially clang) you cannot @@ -108,20 +147,28 @@ template using rtlog_SPSC = moodycamel::ReaderWriterQueue; * Requirements on QType: * 1. Is real-time safe * 2. Accepts one type template paramter for the type to be queued - * 3. Has methods `try_enqueue` and `try_dequeue` + * 3. Has a constructor that takes an integer which will be the queue's capacity + * 4. Has methods `bool try_enqueue(T &&item)` and/or `bool try_enqueue(const T &item)` and `bool try_dequeue(T &item)` */ template &SequenceNumber, template class QType = rtlog_SPSC> class Logger { public: - using InternalLogData = BasicLogData; + using InternalLogData = detail::BasicLogData; using InternalQType = QType; + static_assert( + detail::has_int_constructor_v, + "QType must have a constructor that takes an int - `QType(int)`"); + static_assert(detail::has_value_type_v, + "QType must have a value_type - `using value_type = T;`"); static_assert(detail::has_try_enqueue_v, - "QType must have a try_enqueue method"); - static_assert(detail::has_try_dequeue_v, - "QType must have a try_dequeue method"); + "QType must have a try_enqueue method - `bool try_enqueue(T " + "&&item)` and/or `bool try_enqueue(const T &item)`"); + static_assert( + detail::has_try_dequeue_v, + "QType must have a try_dequeue method - `bool try_dequeue(T &item)`"); /* * @brief Logs a message with the given format and input data.