1 #pragma once 2 3 #include <iterator> 4 #include <utility> 5 6 namespace sdbusplus 7 { 8 namespace utility 9 { 10 template <typename T> 11 concept is_dbus_array = requires(T v) { 12 { v.begin() } -> std::forward_iterator; 13 !std::is_same_v<std::decay<T>, std::string>; 14 }; 15 16 template <typename T, typename... U> 17 concept is_any_of = (std::same_as<T, U> || ...); 18 19 template <typename T> 20 concept can_append_array_value = 21 requires(T v) { 22 // Require that the container be contiguous 23 { v.begin() } -> std::contiguous_iterator; 24 // The sd-bus append array docs are very specific about what types are 25 // allowed; verify this is one of those types. 26 requires(is_any_of<typename T::value_type, uint8_t, int16_t, uint16_t, 27 int32_t, uint32_t, int64_t, uint64_t, double>); 28 }; 29 30 template <typename T> 31 concept has_emplace_back = requires(T v) { v.emplace_back(); }; 32 33 template <typename T> 34 concept has_emplace = requires(T v) { v.emplace(); }; 35 } // namespace utility 36 } // namespace sdbusplus 37