7#if !defined(ASYNC_MQTT_PACKET_PACKET_TRAITS_HPP)
8#define ASYNC_MQTT_PACKET_PACKET_TRAITS_HPP
13#include <async_mqtt/packet/packet_fwd.hpp>
14#include <async_mqtt/packet/packet_variant_fwd.hpp>
15#include <async_mqtt/packet/store_packet_variant_fwd.hpp>
19template <
template <std::
size_t>
typename,
typename>
20struct is_instance_of : std::false_type {};
22template <
template <std::
size_t>
typename T, std::size_t N>
23struct is_instance_of<T, T<N>> : std::true_type {};
25template <
typename Packet>
26constexpr bool is_client_sendable() {
28 std::is_same_v<v3_1_1::connect_packet, Packet> ||
29 std::is_same_v<v3_1_1::pingreq_packet, Packet> ||
30 std::is_same_v<v3_1_1::disconnect_packet, Packet> ||
31 is_instance_of<v3_1_1::basic_publish_packet, Packet>::value ||
32 is_instance_of<v3_1_1::basic_puback_packet, Packet>::value ||
33 is_instance_of<v3_1_1::basic_pubrec_packet, Packet>::value ||
34 is_instance_of<v3_1_1::basic_pubrel_packet, Packet>::value ||
35 is_instance_of<v3_1_1::basic_pubcomp_packet, Packet>::value ||
36 is_instance_of<v3_1_1::basic_subscribe_packet, Packet>::value ||
37 is_instance_of<v3_1_1::basic_unsubscribe_packet, Packet>::value ||
38 std::is_same_v<v5::connect_packet, Packet> ||
39 std::is_same_v<v5::pingreq_packet, Packet> ||
40 std::is_same_v<v5::disconnect_packet, Packet> ||
41 is_instance_of<v5::basic_publish_packet, Packet>::value ||
42 is_instance_of<v5::basic_puback_packet, Packet>::value ||
43 is_instance_of<v5::basic_pubrec_packet, Packet>::value ||
44 is_instance_of<v5::basic_pubrel_packet, Packet>::value ||
45 is_instance_of<v5::basic_pubcomp_packet, Packet>::value ||
46 is_instance_of<v5::basic_subscribe_packet, Packet>::value ||
47 is_instance_of<v5::basic_unsubscribe_packet, Packet>::value ||
48 std::is_same_v<v5::auth_packet, Packet> ||
49 is_instance_of<basic_store_packet_variant, Packet>::value
53template <
typename Packet>
54constexpr bool is_server_sendable() {
56 std::is_same_v<v3_1_1::connack_packet, Packet> ||
57 std::is_same_v<v3_1_1::pingresp_packet, Packet> ||
58 is_instance_of<v3_1_1::basic_publish_packet, Packet>::value ||
59 is_instance_of<v3_1_1::basic_puback_packet, Packet>::value ||
60 is_instance_of<v3_1_1::basic_pubrec_packet, Packet>::value ||
61 is_instance_of<v3_1_1::basic_pubrel_packet, Packet>::value ||
62 is_instance_of<v3_1_1::basic_pubcomp_packet, Packet>::value ||
63 is_instance_of<v3_1_1::basic_suback_packet, Packet>::value ||
64 is_instance_of<v3_1_1::basic_unsuback_packet, Packet>::value ||
65 std::is_same_v<v5::connack_packet, Packet> ||
66 std::is_same_v<v5::pingresp_packet, Packet> ||
67 std::is_same_v<v5::disconnect_packet, Packet> ||
68 is_instance_of<v5::basic_publish_packet, Packet>::value ||
69 is_instance_of<v5::basic_puback_packet, Packet>::value ||
70 is_instance_of<v5::basic_pubrec_packet, Packet>::value ||
71 is_instance_of<v5::basic_pubrel_packet, Packet>::value ||
72 is_instance_of<v5::basic_pubcomp_packet, Packet>::value ||
73 is_instance_of<v5::basic_suback_packet, Packet>::value ||
74 is_instance_of<v5::basic_unsuback_packet, Packet>::value ||
75 std::is_same_v<v5::auth_packet, Packet> ||
76 is_instance_of<basic_store_packet_variant, Packet>::value
80template <
typename Packet>
81constexpr bool is_v5() {
83 std::is_same_v<v5::connect_packet, Packet> ||
84 std::is_same_v<v5::connack_packet, Packet> ||
85 std::is_same_v<v5::pingreq_packet, Packet> ||
86 std::is_same_v<v5::pingresp_packet, Packet> ||
87 std::is_same_v<v5::disconnect_packet, Packet> ||
88 is_instance_of<v5::basic_publish_packet, Packet>::value ||
89 is_instance_of<v5::basic_puback_packet, Packet>::value ||
90 is_instance_of<v5::basic_pubrec_packet, Packet>::value ||
91 is_instance_of<v5::basic_pubrel_packet, Packet>::value ||
92 is_instance_of<v5::basic_pubcomp_packet, Packet>::value ||
93 is_instance_of<v5::basic_subscribe_packet, Packet>::value ||
94 is_instance_of<v5::basic_suback_packet, Packet>::value ||
95 is_instance_of<v5::basic_unsubscribe_packet, Packet>::value ||
96 is_instance_of<v5::basic_unsuback_packet, Packet>::value ||
97 std::is_same_v<v5::auth_packet, Packet>;
100template <
typename Packet>
101constexpr bool is_v3_1_1() {
103 std::is_same_v<v3_1_1::connect_packet, Packet> ||
104 std::is_same_v<v3_1_1::connack_packet, Packet> ||
105 std::is_same_v<v3_1_1::pingreq_packet, Packet> ||
106 std::is_same_v<v3_1_1::pingresp_packet, Packet> ||
107 std::is_same_v<v3_1_1::disconnect_packet, Packet> ||
108 is_instance_of<v3_1_1::basic_publish_packet, Packet>::value ||
109 is_instance_of<v3_1_1::basic_puback_packet, Packet>::value ||
110 is_instance_of<v3_1_1::basic_pubrec_packet, Packet>::value ||
111 is_instance_of<v3_1_1::basic_pubrel_packet, Packet>::value ||
112 is_instance_of<v3_1_1::basic_pubcomp_packet, Packet>::value ||
113 is_instance_of<v3_1_1::basic_subscribe_packet, Packet>::value ||
114 is_instance_of<v3_1_1::basic_suback_packet, Packet>::value ||
115 is_instance_of<v3_1_1::basic_unsubscribe_packet, Packet>::value ||
116 is_instance_of<v3_1_1::basic_unsuback_packet, Packet>::value;
119template <
typename Packet>
120constexpr bool is_packet() {
121 return is_v3_1_1<Packet>() || is_v5<Packet>();
124template <
typename Packet>
125constexpr bool is_auth() {
127 std::is_same_v<v5::auth_packet, Packet>;
130template <
typename Packet>
131constexpr bool is_connect() {
133 std::is_same_v<v3_1_1::connect_packet, Packet> ||
134 std::is_same_v<v5::connect_packet, Packet>;
137template <
typename Packet>
138constexpr bool is_connack() {
140 std::is_same_v<v3_1_1::connack_packet, Packet> ||
141 std::is_same_v<v5::connack_packet, Packet>;
144template <
typename Packet>
145constexpr bool is_publish() {
147 is_instance_of<v3_1_1::basic_publish_packet, Packet>::value ||
148 is_instance_of<v5::basic_publish_packet, Packet>::value;
151template <
typename Packet>
152constexpr bool is_puback() {
154 is_instance_of<v3_1_1::basic_puback_packet, Packet>::value ||
155 is_instance_of<v5::basic_puback_packet, Packet>::value;
158template <
typename Packet>
159constexpr bool is_pubrec() {
161 is_instance_of<v3_1_1::basic_pubrec_packet, Packet>::value ||
162 is_instance_of<v5::basic_pubrec_packet, Packet>::value;
165template <
typename Packet>
166constexpr bool is_pubrel() {
168 is_instance_of<v3_1_1::basic_pubrel_packet, Packet>::value ||
169 is_instance_of<v5::basic_pubrel_packet, Packet>::value;
172template <
typename Packet>
173constexpr bool is_pubcomp() {
175 is_instance_of<v3_1_1::basic_pubcomp_packet, Packet>::value ||
176 is_instance_of<v5::basic_pubcomp_packet, Packet>::value;
179template <
typename Packet>
180constexpr bool is_subscribe() {
182 is_instance_of<v3_1_1::basic_subscribe_packet, Packet>::value ||
183 is_instance_of<v5::basic_subscribe_packet, Packet>::value;
186template <
typename Packet>
187constexpr bool is_suback() {
189 is_instance_of<v3_1_1::basic_suback_packet, Packet>::value ||
190 is_instance_of<v5::basic_suback_packet, Packet>::value;
193template <
typename Packet>
194constexpr bool is_unsubscribe() {
196 is_instance_of<v3_1_1::basic_unsubscribe_packet, Packet>::value ||
197 is_instance_of<v5::basic_unsubscribe_packet, Packet>::value;
200template <
typename Packet>
201constexpr bool is_unsuback() {
203 is_instance_of<v3_1_1::basic_unsuback_packet, Packet>::value ||
204 is_instance_of<v5::basic_unsuback_packet, Packet>::value;
207template <
typename Packet>
208constexpr bool is_pingreq() {
210 std::is_same_v<v3_1_1::pingreq_packet, Packet> ||
211 std::is_same_v<v5::pingreq_packet, Packet>;
214template <
typename Packet>
215constexpr bool is_pingresp() {
217 std::is_same_v<v3_1_1::pingresp_packet, Packet> ||
218 std::is_same_v<v5::pingresp_packet, Packet>;
221template <
typename Packet>
222constexpr bool is_disconnect() {
224 std::is_same_v<v3_1_1::disconnect_packet, Packet> ||
225 std::is_same_v<v5::disconnect_packet, Packet>;
228template <
typename Packet>
229constexpr bool own_packet_id() {
231 is_publish<Packet>() ||
232 is_pubrel<Packet>() ||
233 is_subscribe<Packet>() ||
234 is_unsubscribe<Packet>();