OSSIA
Open Scenario System for Interactive Application
Loading...
Searching...
No Matches
no_framing.hpp
1#pragma once
2#include <ossia/network/sockets/writers.hpp>
3
4#include <boost/asio/buffer.hpp>
5#include <boost/asio/error.hpp>
6#include <boost/asio/write.hpp>
7
8namespace ossia::net
9{
10
11struct no_framing
12{
13 template <typename Socket>
14 struct encoder
15 {
16 Socket& socket;
17 void write(const char* data, std::size_t sz)
18 {
19 this->write(socket, boost::asio::buffer(data, sz));
20 }
21
22 template <typename T>
23 void write(T& sock, const boost::asio::const_buffer& buf)
24 {
25 boost::asio::write(sock, buf);
26 }
27
28 template <typename T>
29 void write(multi_socket_writer<T>& sock, const boost::asio::const_buffer& buf)
30 {
31 sock.write(buf);
32 }
33 };
34
35 template <typename Socket>
36 struct decoder
37 {
38 Socket& socket;
39 alignas(64) uint8_t m_readbuf[4096];
40
41 explicit decoder(Socket& s)
42 : socket{s}
43 {
44 }
45
46 decoder() = delete;
47 decoder(const decoder&) = delete;
48 decoder(decoder&&) = delete;
49 decoder& operator=(const decoder&) = delete;
50 decoder& operator=(decoder&&) = delete;
51
52 template <typename F>
53 void receive(F f)
54 {
55 socket.async_read_some(
56 boost::asio::buffer(m_readbuf),
57 [this,
58 f = std::move(f)](boost::system::error_code ec, std::size_t sz) mutable {
59 if(!f.validate_stream(ec))
60 return;
61
62 f(m_readbuf, sz);
63 receive(std::move(f));
64 });
65 }
66 };
67};
68
69}