#ifndef MS_COMMON_HPP
#define MS_COMMON_HPP
#include <algorithm>
#include <cinttypes>
#include <cstddef>
#include <cstdint>
#include <functional>
#include <memory>
#ifdef _WIN32
#include <winsock2.h>
#if !defined(_SSIZE_T_) && !defined(_SSIZE_T_DEFINED)
#include <BaseTsd.h>
typedef SSIZE_T ssize_t;
#define SSIZE_MAX INTPTR_MAX
#define _SSIZE_T_
#define _SSIZE_T_DEFINED
#endif
#else
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#endif
using ChannelReadCtx = void*;
using ChannelReadFreeFn = void (*)(uint8_t*, uint32_t, size_t);
using ChannelReadFn = ChannelReadFreeFn (*)(
uint8_t** ,
uint32_t* ,
size_t* ,
const void* ,
ChannelReadCtx
);
using ChannelWriteCtx = void*;
using ChannelWriteFn =
void (*)(const uint8_t* , uint32_t , ChannelWriteCtx );
using PayloadChannelReadCtx = void*;
using PayloadChannelReadFreeFn = void (*)(uint8_t*, uint32_t, size_t);
using PayloadChannelReadFn = PayloadChannelReadFreeFn (*)(
uint8_t** ,
uint32_t* ,
size_t* ,
uint8_t** ,
uint32_t* ,
size_t* ,
const void* ,
PayloadChannelReadCtx );
using PayloadChannelWriteCtx = void*;
using PayloadChannelWriteFn = void (*)(
const uint8_t* ,
uint32_t ,
const uint8_t* ,
uint32_t ,
ChannelWriteCtx );
#endif