OSSIA
Open Scenario System for Interactive Application
Loading...
Searching...
No Matches
osc_1_1_extended_policy.hpp
1#pragma once
2#include <ossia/network/osc/detail/osc_common_policy.hpp>
3#include <ossia/network/osc/detail/osc_utils.hpp>
4#include <ossia/network/value/value.hpp>
5
6#include <boost/endian/conversion.hpp>
7
8#include <oscpack/osc/OscOutboundPacketStream.h>
9#include <oscpack/osc/OscTypes.h>
10
11// This handles all the other cases: char, rgb color, etc... as well as arrays
12namespace ossia::net
13{
14struct osc_extended_outbound_dynamic_policy : osc_common_outbound_dynamic_policy
15{
16 using osc_common_outbound_dynamic_policy::operator();
17 mutable int m_depth = 0;
18 void operator()(impulse) const { p << oscpack::Infinitum(); }
19
20 void operator()(bool b) const { p << b; }
21
22 void operator()(char c) const { p << c; }
23
24 void operator()(vec2f vec) const
25 {
26 if(m_depth > 0)
27 {
28 p << oscpack::BeginArray();
29 }
30
31 p << vec[0] << vec[1];
32
33 if(m_depth > 0)
34 {
35 p << oscpack::EndArray();
36 }
37 }
38
39 void operator()(vec3f vec) const
40 {
41 if(m_depth > 0)
42 {
43 p << oscpack::BeginArray();
44 }
45
46 p << vec[0] << vec[1] << vec[2];
47
48 if(m_depth > 0)
49 {
50 p << oscpack::EndArray();
51 }
52 }
53
54 void operator()(vec4f vec) const
55 {
56 if(unit == ossia::rgba8_u{})
57 {
58 p << to_osc_rgba({vec});
59 }
60 else
61 {
62 if(m_depth > 0)
63 {
64 p << oscpack::BeginArray();
65 }
66
67 p << vec[0] << vec[1] << vec[2] << vec[3];
68
69 if(m_depth > 0)
70 {
71 p << oscpack::EndArray();
72 }
73 }
74 }
75
76 // Arrays are nested
77 void operator()(const std::vector<value>& t) const
78 {
79 if(m_depth > 0)
80 {
81 p << oscpack::BeginArray();
82 }
83
84 m_depth++;
85 for(const auto& val : t)
86 {
87 val.apply(*this);
88 }
89 m_depth--;
90
91 if(m_depth > 0)
92 {
93 p << oscpack::EndArray();
94 }
95 }
96
97 void operator()(const value_map_type& t) const
98 {
99 if(m_depth > 0)
100 {
101 p << oscpack::BeginArray();
102 }
103 m_depth++;
104
105 for(const auto& [k, v] : t)
106 {
107 p << oscpack::BeginArray();
108 m_depth++;
109 (*this)(k);
110 v.apply(*this);
111 m_depth--;
112 p << oscpack::EndArray();
113 }
114
115 m_depth--;
116 if(m_depth > 0)
117 {
118 p << oscpack::EndArray();
119 }
120 }
121};
122
123struct osc_extended_outbound_static_policy : osc_common_outbound_static_policy
124{
125 using osc_common_outbound_static_policy::operator();
126 std::size_t operator()(
127 char* buffer, ossia::impulse v, const ossia::extended_type& t) const noexcept
128 {
129 // NOTE: this is a change wrt the old ossia::oscquery::osc_outbound_visitor
130 buffer[0] = ',';
131 if(t.empty())
132 buffer[1] = oscpack::INFINITUM_TYPE_TAG;
133 else if(t == "nil")
134 buffer[1] = oscpack::NIL_TYPE_TAG;
135 else if(t == "empty")
136 buffer[1] = '\0';
137 buffer[2] = '\0';
138 buffer[3] = '\0';
139
140 return 4;
141 }
142
143 std::size_t operator()(char* buffer, ossia::impulse v) const noexcept
144 {
145 // NOTE: this is a change wrt the old ossia::oscquery::osc_outbound_visitor
146 buffer[0] = ',';
147 buffer[1] = '\0';
148 buffer[2] = '\0';
149 buffer[3] = '\0';
150
151 return 4;
152 }
153
154 std::size_t operator()(char* buffer, bool v) const noexcept
155 {
156 buffer[0] = ',';
157 buffer[1] = v ? oscpack::TRUE_TYPE_TAG : oscpack::FALSE_TYPE_TAG;
158 buffer[2] = '\0';
159 buffer[3] = '\0';
160
161 return 4;
162 }
163
164 std::size_t operator()(char* buffer, char v) const noexcept
165 {
166 buffer[0] = ',';
167 buffer[1] = oscpack::CHAR_TYPE_TAG;
168 buffer[2] = '\0';
169 buffer[3] = '\0';
170
171 boost::endian::endian_store<int32_t, 4, boost::endian::order::big>(
172 (unsigned char*)buffer + 4, (int32_t)v);
173
174 return 8;
175 }
176
177 std::size_t operator()(char* buffer, oscpack::RgbaColor v) const noexcept
178 {
179 buffer[0] = ',';
180 buffer[1] = oscpack::RGBA_COLOR_TYPE_TAG;
181 buffer[2] = '\0';
182 buffer[3] = '\0';
183
184 boost::endian::endian_store<uint32_t, 4, boost::endian::order::big>(
185 (unsigned char*)buffer + 4, v.value);
186 return 8;
187 }
188
189 std::size_t operator()(char* buffer, vec4f t) const noexcept
190 {
191 if(unit == ossia::rgba8_u{})
192 {
193 return (*this)(buffer, to_osc_rgba({t}));
194 }
195 else
196 {
197 return osc_common_outbound_static_policy::operator()(buffer, t);
198 }
199 }
200};
201
202struct osc_extended_policy
203{
204 using static_policy = osc_extended_outbound_static_policy;
205 using dynamic_policy = osc_extended_outbound_dynamic_policy;
206};
207
208}
std::string extended_type
How a low-level type should be interpreted.
Definition complex_type.hpp:9