xref: /openbmc/sdbusplus/include/sdbusplus/utility/container_traits.hpp (revision 242677a2b3dafdb3b79464eb64e0ae8bc7c5a7d5)
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