OSSIA
Open Scenario System for Interactive Application
Loading...
Searching...
No Matches
writers.hpp
1#pragma once
2#include <ossia/detail/config.hpp>
3
4#include <boost/asio/buffer.hpp>
5#include <boost/asio/error.hpp>
6
7#include <cinttypes>
8#include <memory>
9#include <vector>
10
11namespace ossia::net
12{
24{
25 lifetime_token() = default;
26 lifetime_token(const lifetime_token&) = delete;
28 lifetime_token& operator=(const lifetime_token&) = delete;
29 lifetime_token& operator=(lifetime_token&&) = delete;
30
31 [[nodiscard]] std::weak_ptr<void> watch() const noexcept { return m_token; }
32
35 void reset() noexcept { m_token.reset(); }
36
37private:
38 std::shared_ptr<void> m_token{std::make_shared<char>()};
39};
40
41template <typename T>
42struct socket_writer
43{
44 T& socket;
45 void operator()(const char* data, std::size_t sz) const { socket.write(data, sz); }
46};
47
48template <typename Socket>
49struct multi_socket_writer
50{
51 std::vector<Socket>& sockets;
52 void write(const boost::asio::const_buffer& buf)
53 {
54 for(auto& sock : sockets)
55 {
56 sock->write(buf);
57 }
58 }
59 void write_some(const boost::asio::const_buffer& buf)
60 {
61 for(auto& sock : sockets)
62 {
63 sock->write(buf);
64 }
65 }
66};
67
68template <typename T, typename F>
69struct stream_processor
70{
71 T& self;
72 F on_message;
73 template <typename... Args>
74 void operator()(Args&&... args) const
75 {
76 this->on_message(std::forward<Args>(args)...);
77 }
78
79 bool validate_stream(boost::system::error_code ec) const
80 {
81 if(ec == boost::asio::error::operation_aborted)
82 {
83 self.on_fail();
84 return false;
85 }
86
87 if(ec == boost::asio::error::eof)
88 {
89 self.on_close();
90 return false;
91 }
92
93 return true;
94 }
95};
96}
Definition writers.hpp:24
void reset() noexcept
Definition writers.hpp:35