OSSIA
Open Scenario System for Interactive Application
osc_common_policy.hpp
1 #pragma once
2 #include <ossia/network/osc/detail/osc_utils.hpp>
3 #include <ossia/network/value/value.hpp>
4 
5 #include <boost/endian/conversion.hpp>
6 
7 #include <oscpack/osc/OscOutboundPacketStream.h>
8 #include <oscpack/osc/OscTypes.h>
9 
10 namespace ossia::net
11 {
12 // Handling for types compatible with all OSC version
13 
14 // This class is an implementation detail. It is used to send things that work
15 // for all versions of OSC. Used for the dynamic std::vector<ossia::value>
16 // case.
17 struct osc_common_outbound_dynamic_policy
18 {
19  oscpack::OutboundPacketStream& p;
20  const ossia::unit_t& unit;
21 
22  void operator()(int32_t i) const { p << i; }
23 
24  void operator()(float f) const { p << f; }
25 
26  void operator()(const std::string& str) const { p << (std::string_view)str; }
27 
28  void operator()(oscpack::Blob str) const { p << str; }
29 
30  void operator()(vec2f vec) const { p << vec[0] << vec[1]; }
31 
32  void operator()(vec3f vec) const { p << vec[0] << vec[1] << vec[2]; }
33 
34  void operator()(vec4f vec) const { p << vec[0] << vec[1] << vec[2] << vec[3]; }
35 
36  void operator()() const { }
37 };
38 
39 // Since most of the time we have known types, we can optimize a fair bit the
40 // writing of the osc messages.
41 // Mirrors ossia::net::osc_outbound_array_visitor
42 struct osc_common_outbound_static_policy
43 {
44  const ossia::unit_t& unit;
45  std::size_t operator()(char* buffer, float v) const noexcept
46  {
47  buffer[0] = ',';
48  buffer[1] = oscpack::FLOAT_TYPE_TAG;
49  buffer[2] = '\0';
50  buffer[3] = '\0';
51 
52  boost::endian::endian_store<float, 4, boost::endian::order::big>(
53  (unsigned char*)buffer + 4, v);
54  return 8;
55  }
56 
57  std::size_t operator()(char* buffer, int32_t v) const noexcept
58  {
59  buffer[0] = ',';
60  buffer[1] = oscpack::INT32_TYPE_TAG;
61  buffer[2] = '\0';
62  buffer[3] = '\0';
63 
64  boost::endian::endian_store<int32_t, 4, boost::endian::order::big>(
65  (unsigned char*)buffer + 4, v);
66  return 8;
67  }
68 
69  std::size_t operator()(char* buffer, const std::string& v) const noexcept
70  {
71  buffer[0] = ',';
72  buffer[1] = oscpack::STRING_TYPE_TAG;
73  buffer[2] = '\0';
74  buffer[3] = '\0';
75 
76  std::size_t written = write_string(v, buffer + 4);
77  return 4 + written;
78  }
79 
80  std::size_t operator()(char* buffer, const oscpack::Blob& v) const noexcept
81  {
82  buffer[0] = ',';
83  buffer[1] = oscpack::BLOB_TYPE_TAG;
84  buffer[2] = '\0';
85  buffer[3] = '\0';
86 
87  std::size_t written
88  = write_string(std::string_view((const char*)v.data, v.size), buffer + 4);
89  return 4 + written;
90  }
91 
92  std::size_t operator()(char* buffer, vec2f v) const noexcept
93  {
94  buffer[0] = ',';
95  buffer[1] = oscpack::FLOAT_TYPE_TAG;
96  buffer[2] = oscpack::FLOAT_TYPE_TAG;
97  buffer[3] = '\0';
98 
99  boost::endian::endian_store<float, 4, boost::endian::order::big>(
100  (unsigned char*)buffer + 4, v[0]);
101  boost::endian::endian_store<float, 4, boost::endian::order::big>(
102  (unsigned char*)buffer + 8, v[1]);
103 
104  return 12;
105  }
106 
107  std::size_t operator()(char* buffer, vec3f v) const noexcept
108  {
109  buffer[0] = ',';
110  buffer[1] = oscpack::FLOAT_TYPE_TAG;
111  buffer[2] = oscpack::FLOAT_TYPE_TAG;
112  buffer[3] = oscpack::FLOAT_TYPE_TAG;
113  buffer[4] = '\0';
114  buffer[5] = '\0';
115  buffer[6] = '\0';
116  buffer[7] = '\0';
117 
118  boost::endian::endian_store<float, 4, boost::endian::order::big>(
119  (unsigned char*)buffer + 8, v[0]);
120  boost::endian::endian_store<float, 4, boost::endian::order::big>(
121  (unsigned char*)buffer + 12, v[1]);
122  boost::endian::endian_store<float, 4, boost::endian::order::big>(
123  (unsigned char*)buffer + 16, v[2]);
124 
125  return 20;
126  }
127 
128  std::size_t operator()(char* buffer, vec4f v) const noexcept
129  {
130  buffer[0] = ',';
131  buffer[1] = oscpack::FLOAT_TYPE_TAG;
132  buffer[2] = oscpack::FLOAT_TYPE_TAG;
133  buffer[3] = oscpack::FLOAT_TYPE_TAG;
134  buffer[4] = oscpack::FLOAT_TYPE_TAG;
135  buffer[5] = '\0';
136  buffer[6] = '\0';
137  buffer[7] = '\0';
138 
139  boost::endian::endian_store<float, 4, boost::endian::order::big>(
140  (unsigned char*)buffer + 8, v[0]);
141  boost::endian::endian_store<float, 4, boost::endian::order::big>(
142  (unsigned char*)buffer + 12, v[1]);
143  boost::endian::endian_store<float, 4, boost::endian::order::big>(
144  (unsigned char*)buffer + 16, v[2]);
145  boost::endian::endian_store<float, 4, boost::endian::order::big>(
146  (unsigned char*)buffer + 20, v[3]);
147 
148  return 24;
149  }
150 };
151 
152 }
Definition: dataspace.hpp:24