async_mqtt 9.0.1
Loading...
Searching...
No Matches
packet_traits.hpp
1// Copyright Takatoshi Kondo 2022
2//
3// Distributed under the Boost Software License, Version 1.0.
4// (See accompanying file LICENSE_1_0.txt or copy at
5// http://www.boost.org/LICENSE_1_0.txt)
6
7#if !defined(ASYNC_MQTT_PACKET_PACKET_TRAITS_HPP)
8#define ASYNC_MQTT_PACKET_PACKET_TRAITS_HPP
9
10#include <cstdint>
11#include <type_traits>
12
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>
16
17namespace async_mqtt {
18
19template <template <std::size_t> typename, typename>
20struct is_instance_of : std::false_type {};
21
22template <template <std::size_t> typename T, std::size_t N>
23struct is_instance_of<T, T<N>> : std::true_type {};
24
25template <typename Packet>
26constexpr bool is_client_sendable() {
27 return
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
50 ;
51}
52
53template <typename Packet>
54constexpr bool is_server_sendable() {
55 return
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
77 ;
78}
79
80template <typename Packet>
81constexpr bool is_v5() {
82 return
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>;
98}
99
100template <typename Packet>
101constexpr bool is_v3_1_1() {
102 return
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;
117}
118
119template <typename Packet>
120constexpr bool is_packet() {
121 return is_v3_1_1<Packet>() || is_v5<Packet>();
122}
123
124template <typename Packet>
125constexpr bool is_auth() {
126 return
127 std::is_same_v<v5::auth_packet, Packet>;
128}
129
130template <typename Packet>
131constexpr bool is_connect() {
132 return
133 std::is_same_v<v3_1_1::connect_packet, Packet> ||
134 std::is_same_v<v5::connect_packet, Packet>;
135}
136
137template <typename Packet>
138constexpr bool is_connack() {
139 return
140 std::is_same_v<v3_1_1::connack_packet, Packet> ||
141 std::is_same_v<v5::connack_packet, Packet>;
142}
143
144template <typename Packet>
145constexpr bool is_publish() {
146 return
147 is_instance_of<v3_1_1::basic_publish_packet, Packet>::value ||
148 is_instance_of<v5::basic_publish_packet, Packet>::value;
149}
150
151template <typename Packet>
152constexpr bool is_puback() {
153 return
154 is_instance_of<v3_1_1::basic_puback_packet, Packet>::value ||
155 is_instance_of<v5::basic_puback_packet, Packet>::value;
156}
157
158template <typename Packet>
159constexpr bool is_pubrec() {
160 return
161 is_instance_of<v3_1_1::basic_pubrec_packet, Packet>::value ||
162 is_instance_of<v5::basic_pubrec_packet, Packet>::value;
163}
164
165template <typename Packet>
166constexpr bool is_pubrel() {
167 return
168 is_instance_of<v3_1_1::basic_pubrel_packet, Packet>::value ||
169 is_instance_of<v5::basic_pubrel_packet, Packet>::value;
170}
171
172template <typename Packet>
173constexpr bool is_pubcomp() {
174 return
175 is_instance_of<v3_1_1::basic_pubcomp_packet, Packet>::value ||
176 is_instance_of<v5::basic_pubcomp_packet, Packet>::value;
177}
178
179template <typename Packet>
180constexpr bool is_subscribe() {
181 return
182 is_instance_of<v3_1_1::basic_subscribe_packet, Packet>::value ||
183 is_instance_of<v5::basic_subscribe_packet, Packet>::value;
184}
185
186template <typename Packet>
187constexpr bool is_suback() {
188 return
189 is_instance_of<v3_1_1::basic_suback_packet, Packet>::value ||
190 is_instance_of<v5::basic_suback_packet, Packet>::value;
191}
192
193template <typename Packet>
194constexpr bool is_unsubscribe() {
195 return
196 is_instance_of<v3_1_1::basic_unsubscribe_packet, Packet>::value ||
197 is_instance_of<v5::basic_unsubscribe_packet, Packet>::value;
198}
199
200template <typename Packet>
201constexpr bool is_unsuback() {
202 return
203 is_instance_of<v3_1_1::basic_unsuback_packet, Packet>::value ||
204 is_instance_of<v5::basic_unsuback_packet, Packet>::value;
205}
206
207template <typename Packet>
208constexpr bool is_pingreq() {
209 return
210 std::is_same_v<v3_1_1::pingreq_packet, Packet> ||
211 std::is_same_v<v5::pingreq_packet, Packet>;
212}
213
214template <typename Packet>
215constexpr bool is_pingresp() {
216 return
217 std::is_same_v<v3_1_1::pingresp_packet, Packet> ||
218 std::is_same_v<v5::pingresp_packet, Packet>;
219}
220
221template <typename Packet>
222constexpr bool is_disconnect() {
223 return
224 std::is_same_v<v3_1_1::disconnect_packet, Packet> ||
225 std::is_same_v<v5::disconnect_packet, Packet>;
226}
227
228template <typename Packet>
229constexpr bool own_packet_id() {
230 return
231 is_publish<Packet>() ||
232 is_pubrel<Packet>() ||
233 is_subscribe<Packet>() ||
234 is_unsubscribe<Packet>();
235}
236
237} // namespace async_mqtt
238
239#endif // ASYNC_MQTT_PACKET_PACKET_TRAITS_HPP