7 #ifndef CPPWAMP_INTERNAL_RAWSOCKHEADER_HPP
8 #define CPPWAMP_INTERNAL_RAWSOCKHEADER_HPP
20 enum class RawsockMsgType
31 static RawsockHeader fromBigEndian(uint32_t big)
32 {
return RawsockHeader(endian::bigToNative32(big));}
34 RawsockHeader() : hdr_(0) {}
36 explicit RawsockHeader(uint32_t hostOrder) : hdr_(hostOrder) {}
38 bool msgTypeIsValid()
const
40 auto type = msgType();
41 return type == RawsockMsgType::wamp ||
42 type == RawsockMsgType::ping ||
43 type == RawsockMsgType::pong;
46 RawsockMsgType msgType()
const
48 return get<RawsockMsgType>(msgTypeMask_, msgTypePos_);
51 size_t length()
const {
return get<size_t>(lengthMask_);}
53 uint32_t toBigEndian()
const {
return endian::nativeToBig32(hdr_);}
55 uint32_t toHostOrder()
const {
return hdr_;}
57 RawsockHeader& setMsgType(RawsockMsgType msgType)
58 {
return put(msgType, msgTypePos_);}
60 RawsockHeader& setLength(
size_t length)
61 {
return put(length, lengthPos_);}
64 static constexpr uint32_t msgTypeMask_ = 0xff000000;
65 static constexpr uint32_t lengthMask_ = 0x00ffffff;
66 static constexpr
int msgTypePos_ = 24;
67 static constexpr
int lengthPos_ = 0;
69 template <
typename T = u
int32_t>
70 T get(uint32_t mask,
int pos = 0)
const
71 {
return static_cast<T
>((hdr_ & mask) >> pos);}
74 RawsockHeader& put(T value,
int pos = 0)
75 {hdr_ |= (
static_cast<uint32_t
>(value) << pos);
return *
this;}
84 #endif // CPPWAMP_INTERNAL_RAWSOCKHEADER_HPP