IRSOL
C++ code implementing socket server for interacting with Baumer camera.
variants.hpp
Go to the documentation of this file.
1
22#pragma once
23
24#include "irsol/macros.hpp"
26#include "irsol/traits.hpp"
27#include "irsol/types.hpp"
28
29#include <string>
30#include <variant>
31
32namespace irsol {
33namespace protocol {
34
44enum class InMessageKind
45{
47 INQUIRY,
49};
50
58constexpr const char*
60{
61 switch(kind) {
63 return "ASSIGNMENT";
65 return "INQUIRY";
67 return "COMMAND";
68 }
70}
71
72// Forward declarations of incoming message types
73struct Assignment;
74struct Inquiry;
75struct Command;
76
86using InMessage = std::variant<Assignment, Inquiry, Command>;
87
100{
101 SUCCESS,
103 BW_IMAGE,
105 ERROR
106};
107
115constexpr const char*
117{
118 switch(kind) {
120 return "SUCCESS";
122 return "BINARY_BUFFER";
124 return "BW_IMAGE";
126 return "COLOR_IMAGE";
128 return "ERROR";
129 }
131}
132
133// Forward declarations of outgoing message types
134struct Success;
135struct Error;
136
149 std::variant<Success, BinaryDataBuffer, ImageBinaryData, ColorImageBinaryData, Error>;
150
157std::string toString(const InMessage& msg);
158
165std::string toString(const OutMessage& msg);
166
176template<typename T, std::enable_if_t<irsol::traits::is_type_in_variant_v<T, InMessage>, int> = 0>
177constexpr InMessageKind
179{
180 if constexpr(std::is_same_v<T, Assignment>)
182 else if constexpr(std::is_same_v<T, Inquiry>)
184 else if constexpr(std::is_same_v<T, Command>)
186 else
187 IRSOL_MISSING_TEMPLATE_SPECIALIZATION(T, "getInMessageKind()");
188}
189
197
205template<typename T, std::enable_if_t<irsol::traits::is_type_in_variant_v<T, InMessage>, int> = 0>
206constexpr bool
208{
209 return std::is_same_v<T, Assignment>;
210}
211bool isAssignment(const InMessage& msg);
212
220template<typename T, std::enable_if_t<irsol::traits::is_type_in_variant_v<T, InMessage>, int> = 0>
221constexpr bool
223{
224 return std::is_same_v<T, Inquiry>;
225}
226bool isInquiry(const InMessage& msg);
227
235template<typename T, std::enable_if_t<irsol::traits::is_type_in_variant_v<T, InMessage>, int> = 0>
236constexpr bool
238{
239 return std::is_same_v<T, Command>;
240}
241bool isCommand(const InMessage& msg);
242
252template<typename T, std::enable_if_t<irsol::traits::is_type_in_variant_v<T, OutMessage>, int> = 0>
253constexpr OutMessageKind
255{
256 if constexpr(std::is_same_v<T, Success>)
258 else if constexpr(std::is_same_v<T, Error>)
260 else if constexpr(std::is_same_v<T, BinaryDataBuffer>)
262 else if constexpr(std::is_same_v<T, ImageBinaryData>)
264 else if constexpr(std::is_same_v<T, ColorImageBinaryData>)
266 else
267 IRSOL_MISSING_TEMPLATE_SPECIALIZATION(T, "getOutMessageKind()");
268}
269
277
285template<typename T, std::enable_if_t<irsol::traits::is_type_in_variant_v<T, OutMessage>, int> = 0>
286constexpr bool
288{
289 return std::is_same_v<T, Success>;
290}
291bool isSuccess(const OutMessage& msg);
292
300template<typename T, std::enable_if_t<irsol::traits::is_type_in_variant_v<T, OutMessage>, int> = 0>
301constexpr bool
303{
304 return std::is_same_v<T, BinaryDataBuffer>;
305}
307
315template<typename T, std::enable_if_t<irsol::traits::is_type_in_variant_v<T, OutMessage>, int> = 0>
316constexpr bool
318{
319 return std::is_same_v<T, ImageBinaryData>;
320}
321bool isImageBinaryData(const OutMessage& msg);
322
330template<typename T, std::enable_if_t<irsol::traits::is_type_in_variant_v<T, OutMessage>, int> = 0>
331constexpr bool
333{
334 return std::is_same_v<T, ColorImageBinaryData>;
335}
337
345template<typename T, std::enable_if_t<irsol::traits::is_type_in_variant_v<T, OutMessage>, int> = 0>
346constexpr bool
348{
349 return std::is_same_v<T, Error>;
350}
351bool isError(const OutMessage& msg);
352
353} // namespace protocol
354} // namespace irsol
Protocol binary data types and attributes definitions.
constexpr bool isError(IRSOL_MAYBE_UNUSED T &msg)
Checks if a given outgoing message type is Error.
Definition variants.hpp:347
std::variant< Assignment, Inquiry, Command > InMessage
Variant type representing any incoming message.
Definition variants.hpp:86
constexpr OutMessageKind getOutMessageKind(IRSOL_MAYBE_UNUSED const T &msg)
Returns the OutMessageKind enum value corresponding to a given outgoing message type.
Definition variants.hpp:254
constexpr bool isCommand(IRSOL_MAYBE_UNUSED T &msg)
Checks if a given incoming message type is a Command.
Definition variants.hpp:237
constexpr const char * OutMessageKindToString(OutMessageKind kind)
Converts an OutMessageKind enum to a human-readable string.
Definition variants.hpp:116
constexpr bool isSuccess(IRSOL_MAYBE_UNUSED T &msg)
Checks if a given outgoing message type is Success.
Definition variants.hpp:287
constexpr bool isColorImageBinaryData(IRSOL_MAYBE_UNUSED T &msg)
Checks if a given outgoing message type is ColorImageBinaryData.
Definition variants.hpp:332
OutMessageKind
Represents the type of an outgoing message.
Definition variants.hpp:100
constexpr bool isInquiry(IRSOL_MAYBE_UNUSED T &msg)
Checks if a given incoming message type is an Inquiry.
Definition variants.hpp:222
constexpr bool isBinaryDataBuffer(IRSOL_MAYBE_UNUSED T &msg)
Checks if a given outgoing message type is BinaryDataBuffer.
Definition variants.hpp:302
constexpr bool isAssignment(IRSOL_MAYBE_UNUSED T &msg)
Checks if a given incoming message type is an Assignment.
Definition variants.hpp:207
constexpr bool isImageBinaryData(IRSOL_MAYBE_UNUSED T &msg)
Checks if a given outgoing message type is ImageBinaryData (black & white).
Definition variants.hpp:317
constexpr const char * InMessageKindToString(InMessageKind kind)
Converts an InMessageKind enum to a human-readable string.
Definition variants.hpp:59
std::variant< Success, BinaryDataBuffer, ImageBinaryData, ColorImageBinaryData, Error > OutMessage
Variant type representing any outgoing message.
Definition variants.hpp:149
InMessageKind
Represents the type of an incoming message.
Definition variants.hpp:45
std::string toString(const InMessage &msg)
Converts an incoming message variant to a human-readable string.
Definition variants.cpp:19
constexpr InMessageKind getInMessageKind(IRSOL_MAYBE_UNUSED const T &msg)
Returns the InMessageKind enum value corresponding to a given incoming message type.
Definition variants.hpp:178
Common portability and diagnostic macros for the irsol library.
#define IRSOL_UNREACHABLE()
Indicates unreachable code to the compiler.
Definition macros.hpp:107
#define IRSOL_MISSING_TEMPLATE_SPECIALIZATION(T, funcNameLiteral)
Emits a compile-time error when no template specialization is available.
Definition macros.hpp:173
#define IRSOL_MAYBE_UNUSED
Suppresses compiler warnings about unused variables or parameters.
Definition macros.hpp:39
auto msg
Template metaprogramming traits for type introspection in the irsol library.
Core type definitions for networking, time handling, and protocol values used throughout the irsol li...