sfml3-rb 0.2.2 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +9 -0
  3. data/CHANGELOG.md +67 -16
  4. data/README.md +123 -32
  5. data/TODO.md +18 -11
  6. data/ext/audio/audio_enums.c +58 -20
  7. data/ext/audio/listener.c +89 -6
  8. data/ext/audio/music.c +212 -5
  9. data/ext/audio/sound.c +218 -9
  10. data/ext/audio/sound_buffer.c +197 -47
  11. data/ext/audio/sound_buffer_recorder.c +90 -18
  12. data/ext/audio/sound_recorder.c +188 -58
  13. data/ext/audio/sound_source_cone.c +127 -33
  14. data/ext/audio/sound_stream.c +204 -21
  15. data/ext/core/exceptions.c +10 -8
  16. data/ext/core/unicode.c +12 -2
  17. data/ext/ext.c +8 -0
  18. data/ext/graphics/blend_mode.c +218 -60
  19. data/ext/graphics/circle.c +300 -16
  20. data/ext/graphics/color.c +253 -94
  21. data/ext/graphics/drawable.c +16 -4
  22. data/ext/graphics/font.c +144 -25
  23. data/ext/graphics/glyph.c +38 -8
  24. data/ext/graphics/image.c +205 -41
  25. data/ext/graphics/polygon.c +317 -30
  26. data/ext/graphics/rect.c +225 -60
  27. data/ext/graphics/rectangle.c +307 -35
  28. data/ext/graphics/render_state.c +124 -12
  29. data/ext/graphics/render_texture.c +191 -14
  30. data/ext/graphics/render_window.c +55 -0
  31. data/ext/graphics/render_window.h +10 -0
  32. data/ext/graphics/shader.c +289 -17
  33. data/ext/graphics/shape.c +265 -32
  34. data/ext/graphics/sprite.c +245 -30
  35. data/ext/graphics/stencil_mode.c +163 -46
  36. data/ext/graphics/target.c +121 -43
  37. data/ext/graphics/target.h +31 -17
  38. data/ext/graphics/text.c +339 -19
  39. data/ext/graphics/texture.c +291 -6
  40. data/ext/graphics/transform.c +178 -5
  41. data/ext/graphics/transformable.c +127 -12
  42. data/ext/graphics/vertex.c +98 -6
  43. data/ext/graphics/vertex_array.c +142 -21
  44. data/ext/graphics/vertex_buffer.c +154 -12
  45. data/ext/graphics/view.c +140 -6
  46. data/ext/network/ftp.c +278 -12
  47. data/ext/network/http.c +179 -44
  48. data/ext/network/ip_address.c +127 -35
  49. data/ext/network/network_enums.c +248 -141
  50. data/ext/network/packet.c +280 -41
  51. data/ext/network/socket_selector.c +98 -21
  52. data/ext/network/tcp_listener.c +82 -18
  53. data/ext/network/tcp_socket.c +135 -27
  54. data/ext/network/udp_socket.c +129 -28
  55. data/ext/ports.rb +7 -0
  56. data/ext/system/buffer.c +47 -16
  57. data/ext/system/clock.c +77 -12
  58. data/ext/system/input_stream.c +113 -51
  59. data/ext/system/sleep.c +10 -2
  60. data/ext/system/time.c +182 -40
  61. data/ext/system/vec2.c +166 -39
  62. data/ext/system/vec3.c +177 -39
  63. data/ext/window/clipboard.c +47 -17
  64. data/ext/window/context.c +66 -13
  65. data/ext/window/context_settings.c +132 -42
  66. data/ext/window/cursor.c +45 -9
  67. data/ext/window/event.c +164 -53
  68. data/ext/window/joystick.c +69 -3
  69. data/ext/window/keyboard.c +168 -116
  70. data/ext/window/mouse.c +64 -13
  71. data/ext/window/sensor.c +28 -2
  72. data/ext/window/touch.c +32 -12
  73. data/ext/window/video_mode.c +93 -31
  74. data/ext/window/vulkan.c +34 -6
  75. data/ext/window/window.c +228 -229
  76. data/ext/window/window.h +4 -4
  77. data/ext/window/window_base.c +251 -0
  78. data/ext/window/window_base.h +43 -0
  79. data/ext/window/window_base.inc +236 -0
  80. data/lib/sfml/version.rb +1 -1
  81. data/sig/audio/audio_enums.rbs +30 -0
  82. data/sig/audio/listener.rbs +16 -0
  83. data/sig/audio/music.rbs +56 -0
  84. data/sig/audio/sound.rbs +51 -0
  85. data/sig/audio/sound_buffer.rbs +17 -0
  86. data/sig/audio/sound_buffer_recorder.rbs +14 -0
  87. data/sig/audio/sound_recorder.rbs +17 -0
  88. data/sig/audio/sound_source_cone.rbs +14 -0
  89. data/sig/audio/sound_stream.rbs +51 -0
  90. data/sig/graphics/blend_mode.rbs +29 -0
  91. data/sig/graphics/circle.rbs +44 -0
  92. data/sig/graphics/color.rbs +39 -0
  93. data/sig/graphics/drawable.rbs +5 -0
  94. data/sig/graphics/font.rbs +20 -0
  95. data/sig/graphics/glyph.rbs +7 -0
  96. data/sig/graphics/image.rbs +22 -0
  97. data/sig/graphics/polygon.rbs +42 -0
  98. data/sig/graphics/rect.rbs +33 -0
  99. data/sig/graphics/rectangle.rbs +42 -0
  100. data/sig/graphics/render_state.rbs +21 -0
  101. data/sig/graphics/render_target.rbs +18 -0
  102. data/sig/graphics/render_texture.rbs +39 -0
  103. data/sig/graphics/render_window.rbs +7 -0
  104. data/sig/graphics/shader.rbs +39 -0
  105. data/sig/graphics/shape.rbs +38 -0
  106. data/sig/graphics/sprite.rbs +34 -0
  107. data/sig/graphics/stencil_mode.rbs +18 -0
  108. data/sig/graphics/target.rbs +8 -0
  109. data/sig/graphics/text.rbs +48 -0
  110. data/sig/graphics/texture.rbs +34 -0
  111. data/sig/graphics/transform.rbs +37 -0
  112. data/sig/graphics/transformable.rbs +25 -0
  113. data/sig/graphics/vertex.rbs +17 -0
  114. data/sig/graphics/vertex_array.rbs +17 -0
  115. data/sig/graphics/vertex_buffer.rbs +22 -0
  116. data/sig/graphics/view.rbs +23 -0
  117. data/sig/network/ftp.rbs +46 -0
  118. data/sig/network/http.rbs +27 -0
  119. data/sig/network/ip_address.rbs +22 -0
  120. data/sig/network/network_enums.rbs +95 -0
  121. data/sig/network/packet.rbs +40 -0
  122. data/sig/network/socket_selector.rbs +14 -0
  123. data/sig/network/tcp_listener.rbs +13 -0
  124. data/sig/network/tcp_socket.rbs +18 -0
  125. data/sig/network/udp_socket.rbs +17 -0
  126. data/sig/sfml/version.rbs +3 -0
  127. data/sig/system/buffer.rbs +11 -0
  128. data/sig/system/clock.rbs +13 -0
  129. data/sig/system/input_stream.rbs +7 -0
  130. data/sig/system/sleep.rbs +3 -0
  131. data/sig/system/time.rbs +28 -0
  132. data/sig/system/vec2.rbs +26 -0
  133. data/sig/system/vec3.rbs +27 -0
  134. data/sig/window/clipboard.rbs +8 -0
  135. data/sig/window/context.rbs +11 -0
  136. data/sig/window/context_settings.rbs +20 -0
  137. data/sig/window/cursor.rbs +6 -0
  138. data/sig/window/event.rbs +20 -0
  139. data/sig/window/joystick.rbs +15 -0
  140. data/sig/window/keyboard.rbs +10 -0
  141. data/sig/window/mouse.rbs +9 -0
  142. data/sig/window/sensor.rbs +8 -0
  143. data/sig/window/touch.rbs +6 -0
  144. data/sig/window/video_mode.rbs +16 -0
  145. data/sig/window/vulkan.rbs +7 -0
  146. data/sig/window/window.rbs +34 -0
  147. data/sig/window/window_base.rbs +33 -0
  148. metadata +76 -3
data/ext/network/packet.c CHANGED
@@ -7,19 +7,14 @@
7
7
  #include "core/exceptions.h"
8
8
  #include "core/macros.h"
9
9
 
10
- /* Strings are NUL-terminated on the wire and carry no length, so readString
11
- has to be handed a buffer. This bounds a single read; longer strings are
12
- still read correctly by CSFML, they just cannot be returned safely. */
13
- #define PACKET_STRING_BUFFER 4096
14
-
15
10
  typedef struct {
16
- sfPacket *packet;
11
+ sfPacket* packet;
17
12
  } Packet;
18
13
 
19
14
  static VALUE rb_cPacket;
20
15
 
21
- static void Packet_free(void *ptr) {
22
- Packet *packet = ptr;
16
+ static void Packet_free(void* ptr) {
17
+ Packet* packet = ptr;
23
18
 
24
19
  sfPacket_destroy(packet->packet);
25
20
  free(packet);
@@ -28,11 +23,10 @@ static void Packet_free(void *ptr) {
28
23
  static const rb_data_type_t Packet_data_type = {
29
24
  .wrap_struct_name = "SFML::Packet",
30
25
  .function = {.dmark = NULL, .dfree = Packet_free, .dsize = NULL},
31
- .flags = RUBY_TYPED_FREE_IMMEDIATELY
32
- };
26
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY};
33
27
 
34
- static VALUE Packet_wrap(VALUE klass, sfPacket *packet) {
35
- Packet *ptr;
28
+ static VALUE Packet_wrap(VALUE klass, sfPacket* packet) {
29
+ Packet* ptr;
36
30
 
37
31
  if (packet == NULL) {
38
32
  rb_raise(rb_eRuntimeError, "failed to create packet");
@@ -44,58 +38,121 @@ static VALUE Packet_wrap(VALUE klass, sfPacket *packet) {
44
38
  return TypedData_Wrap_Struct(klass, &Packet_data_type, ptr);
45
39
  }
46
40
 
47
- static VALUE Packet_new(VALUE klass) {
41
+ static VALUE Packet_alloc(VALUE klass) {
48
42
  return Packet_wrap(klass, sfPacket_create());
49
43
  }
50
44
 
45
+ /* call-seq:
46
+ * Packet.new -> Packet
47
+ *
48
+ * Creates a new, empty packet.
49
+ *
50
+ * @return [Packet] a new, empty packet
51
+ */
52
+ static VALUE Packet_initialize(VALUE self) {
53
+ return self;
54
+ }
55
+
56
+ /* call-seq: copy -> Packet
57
+ *
58
+ * Returns an independent copy of the packet.
59
+ *
60
+ * @return [Packet] an independent copy with the same data and read position
61
+ */
51
62
  static VALUE Packet_copy(VALUE self) {
52
63
  return Packet_wrap(Get_Klass_Packet(), sfPacket_copy(Get_Packet_Struct(self)));
53
64
  }
54
65
 
66
+ /* call-seq:
67
+ * append(data) -> self
68
+ *
69
+ * Appends raw bytes to the end of the packet, growing it as needed.
70
+ * +data+ is any String-convertible value.
71
+ *
72
+ * @return [self]
73
+ */
55
74
  static VALUE Packet_append(VALUE self, VALUE rb_data) {
56
75
  StringValue(rb_data);
57
76
 
58
- sfPacket_append(Get_Packet_Struct(self), RSTRING_PTR(rb_data), (size_t) RSTRING_LEN(rb_data));
77
+ sfPacket_append(Get_Packet_Struct(self), RSTRING_PTR(rb_data), (size_t)RSTRING_LEN(rb_data));
59
78
 
60
79
  return self;
61
80
  }
62
81
 
82
+ /* call-seq: clear -> self
83
+ *
84
+ * Empties the packet and resets its read position to zero.
85
+ *
86
+ * @return [self]
87
+ */
63
88
  static VALUE Packet_clear(VALUE self) {
64
89
  sfPacket_clear(Get_Packet_Struct(self));
65
90
  return self;
66
91
  }
67
92
 
93
+ /* call-seq: data -> String
94
+ *
95
+ * Returns the packet's raw byte content.
96
+ *
97
+ * @return [String] the packet's raw byte content
98
+ */
68
99
  static VALUE Packet_data(VALUE self) {
69
- const void *data = sfPacket_getData(Get_Packet_Struct(self));
100
+ const void* data = sfPacket_getData(Get_Packet_Struct(self));
70
101
 
71
- return rb_str_new((const char *) data, (long) sfPacket_getDataSize(Get_Packet_Struct(self)));
102
+ return rb_str_new((const char*)data, (long)sfPacket_getDataSize(Get_Packet_Struct(self)));
72
103
  }
73
104
 
105
+ /* call-seq: data_size -> Integer
106
+ *
107
+ * Returns the number of bytes held by the packet.
108
+ *
109
+ * @return [Integer] the number of bytes in the packet's data
110
+ */
74
111
  static VALUE Packet_data_size(VALUE self) {
75
112
  return SIZET2NUM(sfPacket_getDataSize(Get_Packet_Struct(self)));
76
113
  }
77
114
 
115
+ /* call-seq: read_position -> Integer
116
+ *
117
+ * Returns the current read position, in bytes.
118
+ *
119
+ * @return [Integer] the current read position, in bytes
120
+ */
78
121
  static VALUE Packet_read_position(VALUE self) {
79
122
  return SIZET2NUM(sfPacket_getReadPosition(Get_Packet_Struct(self)));
80
123
  }
81
124
 
125
+ /* call-seq: end_of_packet? -> true or false
126
+ *
127
+ * Returns +true+ once all of the packet's data has been read.
128
+ *
129
+ * @return [Boolean] whether the end of the packet has been reached, i.e.
130
+ * whether all the data has been read
131
+ */
82
132
  static VALUE Packet_end_of_packet(VALUE self) {
83
133
  return BOOL2RB(sfPacket_endOfPacket(Get_Packet_Struct(self)));
84
134
  }
85
135
 
136
+ /* call-seq: can_read? -> true or false
137
+ *
138
+ * Returns +true+ if the packet is still in a valid reading state.
139
+ *
140
+ * @return [Boolean] whether the packet is in a valid reading state, i.e.
141
+ * whether the last read operation succeeded
142
+ */
86
143
  static VALUE Packet_can_read(VALUE self) {
87
144
  return BOOL2RB(sfPacket_canRead(Get_Packet_Struct(self)));
88
145
  }
89
146
 
90
- #define PACKET_READER(name, c_type, conv) \
91
- static VALUE Packet_read_##name(VALUE self) { \
92
- return conv(sfPacket_read##c_type(Get_Packet_Struct(self))); \
147
+ #define PACKET_READER(name, c_type, conv) \
148
+ static VALUE Packet_read_##name(VALUE self) { \
149
+ return conv(sfPacket_read##c_type(Get_Packet_Struct(self))); \
93
150
  }
94
151
 
95
- #define PACKET_WRITER(name, c_type, num2) \
96
- static VALUE Packet_write_##name(VALUE self, VALUE rb_value) { \
97
- sfPacket_write##c_type(Get_Packet_Struct(self), num2(rb_value)); \
98
- return rb_value; \
152
+ #define PACKET_WRITER(name, c_type, num2) \
153
+ static VALUE Packet_write_##name(VALUE self, VALUE rb_value) { \
154
+ sfPacket_write##c_type(Get_Packet_Struct(self), num2(rb_value)); \
155
+ return rb_value; \
99
156
  }
100
157
 
101
158
  PACKET_READER(bool, Bool, BOOL2RB)
@@ -111,36 +168,75 @@ PACKET_READER(float, Float, DBL2NUM)
111
168
  PACKET_READER(double, Double, DBL2NUM)
112
169
 
113
170
  PACKET_WRITER(bool, Bool, RTEST)
114
- PACKET_WRITER(int8, Int8, (int8_t) NUM2INT)
115
- PACKET_WRITER(uint8, Uint8, (uint8_t) NUM2INT)
116
- PACKET_WRITER(int16, Int16, (int16_t) NUM2INT)
117
- PACKET_WRITER(uint16, Uint16, (uint16_t) NUM2INT)
118
- PACKET_WRITER(int32, Int32, (int32_t) NUM2INT)
119
- PACKET_WRITER(uint32, Uint32, (uint32_t) NUM2UINT)
120
- PACKET_WRITER(int64, Int64, (int64_t) NUM2LL)
121
- PACKET_WRITER(uint64, Uint64, (uint64_t) NUM2ULL)
122
- PACKET_WRITER(float, Float, (float) NUM2DBL)
171
+ PACKET_WRITER(int8, Int8, (int8_t)NUM2INT)
172
+ PACKET_WRITER(uint8, Uint8, (uint8_t)NUM2INT)
173
+ PACKET_WRITER(int16, Int16, (int16_t)NUM2INT)
174
+ PACKET_WRITER(uint16, Uint16, (uint16_t)NUM2INT)
175
+ PACKET_WRITER(int32, Int32, (int32_t)NUM2INT)
176
+ PACKET_WRITER(uint32, Uint32, (uint32_t)NUM2UINT)
177
+ PACKET_WRITER(int64, Int64, (int64_t)NUM2LL)
178
+ PACKET_WRITER(uint64, Uint64, (uint64_t)NUM2ULL)
179
+ PACKET_WRITER(float, Float, (float)NUM2DBL)
123
180
  PACKET_WRITER(double, Double, NUM2DBL)
124
181
 
182
+ /* Document-method: SFML::Packet#read_string
183
+ * call-seq: read_string -> String
184
+ *
185
+ * Reads a NUL-terminated string previously written with #write_string.
186
+ *
187
+ * @return [String]
188
+ */
125
189
  static VALUE Packet_read_string(VALUE self) {
126
- char buffer[PACKET_STRING_BUFFER];
190
+ void* packet = Get_Packet_Struct(self);
191
+ /* sfPacket_readString has no destination-length parameter: CSFML's C++
192
+ side bounds the string it extracts by the packet's own remaining
193
+ unread data, but then copies that (unbounded, from the caller's point
194
+ of view) string into whatever buffer it's given -- a fixed-size stack
195
+ buffer here would be a stack overflow for a packet holding a longer
196
+ string (e.g. one received from the network). The extracted string can
197
+ never exceed the packet's remaining data size, so sizing the buffer to
198
+ that is always sufficient. */
199
+ size_t remaining = sfPacket_getDataSize(packet) - sfPacket_getReadPosition(packet);
200
+ char* buffer = malloc(remaining + 1);
201
+ VALUE result;
202
+
203
+ if (buffer == NULL) {
204
+ rb_raise(rb_eNoMemError, "failed to allocate read buffer");
205
+ }
127
206
 
128
207
  buffer[0] = '\0';
129
- sfPacket_readString(Get_Packet_Struct(self), buffer);
130
- buffer[PACKET_STRING_BUFFER - 1] = '\0';
208
+ sfPacket_readString(packet, buffer);
209
+ buffer[remaining] = '\0';
210
+
211
+ result = rb_str_new_cstr(buffer);
212
+ free(buffer);
131
213
 
132
- return rb_str_new_cstr(buffer);
214
+ return result;
133
215
  }
134
216
 
217
+ /* call-seq:
218
+ * write_string(value) -> value
219
+ *
220
+ * Writes a NUL-terminated string, readable back with #read_string.
221
+ *
222
+ * @return [String] +value+
223
+ */
135
224
  static VALUE Packet_write_string(VALUE self, VALUE rb_value) {
136
225
  sfPacket_writeString(Get_Packet_Struct(self), StringValueCStr(rb_value));
137
226
  return rb_value;
138
227
  }
139
228
 
140
- void Init_Packet(VALUE rb_module) {
141
- rb_cPacket = rb_define_class_under(rb_module, "Packet", rb_cObject);
229
+ /* Document-class: SFML::Packet
230
+ * A structured byte buffer for use with TcpSocket/UdpSocket, with typed
231
+ * sequential read/write access. Reads and writes must happen in the same
232
+ * order the data was written, since the packet keeps no type tags on the
233
+ * wire.
234
+ */
235
+ void Init_Packet(VALUE rb_mSFML) {
236
+ rb_cPacket = rb_define_class_under(rb_mSFML, "Packet", rb_cObject);
237
+ rb_define_alloc_func(rb_cPacket, Packet_alloc);
142
238
 
143
- rb_define_singleton_method(rb_cPacket, "new", Packet_new, 0);
239
+ rb_define_method(rb_cPacket, "initialize", Packet_initialize, 0);
144
240
 
145
241
  rb_define_method(rb_cPacket, "copy", Packet_copy, 0);
146
242
  rb_define_method(rb_cPacket, "append", Packet_append, 1);
@@ -151,29 +247,172 @@ void Init_Packet(VALUE rb_module) {
151
247
  rb_define_method(rb_cPacket, "end_of_packet?", Packet_end_of_packet, 0);
152
248
  rb_define_method(rb_cPacket, "can_read?", Packet_can_read, 0);
153
249
 
250
+ /* call-seq: read_bool -> true or false
251
+ *
252
+ * Reads a boolean from the packet.
253
+ *
254
+ * @return [Boolean]
255
+ */
154
256
  rb_define_method(rb_cPacket, "read_bool", Packet_read_bool, 0);
257
+ /* call-seq: read_int8 -> Integer
258
+ *
259
+ * Reads a signed 8-bit integer from the packet.
260
+ *
261
+ * @return [Integer] a signed 8-bit integer
262
+ */
155
263
  rb_define_method(rb_cPacket, "read_int8", Packet_read_int8, 0);
264
+ /* call-seq: read_uint8 -> Integer
265
+ *
266
+ * Reads an unsigned 8-bit integer from the packet.
267
+ *
268
+ * @return [Integer] an unsigned 8-bit integer
269
+ */
156
270
  rb_define_method(rb_cPacket, "read_uint8", Packet_read_uint8, 0);
271
+ /* call-seq: read_int16 -> Integer
272
+ *
273
+ * Reads a signed 16-bit integer from the packet.
274
+ *
275
+ * @return [Integer] a signed 16-bit integer
276
+ */
157
277
  rb_define_method(rb_cPacket, "read_int16", Packet_read_int16, 0);
278
+ /* call-seq: read_uint16 -> Integer
279
+ *
280
+ * Reads an unsigned 16-bit integer from the packet.
281
+ *
282
+ * @return [Integer] an unsigned 16-bit integer
283
+ */
158
284
  rb_define_method(rb_cPacket, "read_uint16", Packet_read_uint16, 0);
285
+ /* call-seq: read_int32 -> Integer
286
+ *
287
+ * Reads a signed 32-bit integer from the packet.
288
+ *
289
+ * @return [Integer] a signed 32-bit integer
290
+ */
159
291
  rb_define_method(rb_cPacket, "read_int32", Packet_read_int32, 0);
292
+ /* call-seq: read_uint32 -> Integer
293
+ *
294
+ * Reads an unsigned 32-bit integer from the packet.
295
+ *
296
+ * @return [Integer] an unsigned 32-bit integer
297
+ */
160
298
  rb_define_method(rb_cPacket, "read_uint32", Packet_read_uint32, 0);
299
+ /* call-seq: read_int64 -> Integer
300
+ *
301
+ * Reads a signed 64-bit integer from the packet.
302
+ *
303
+ * @return [Integer] a signed 64-bit integer
304
+ */
161
305
  rb_define_method(rb_cPacket, "read_int64", Packet_read_int64, 0);
306
+ /* call-seq: read_uint64 -> Integer
307
+ *
308
+ * Reads an unsigned 64-bit integer from the packet.
309
+ *
310
+ * @return [Integer] an unsigned 64-bit integer
311
+ */
162
312
  rb_define_method(rb_cPacket, "read_uint64", Packet_read_uint64, 0);
313
+ /* call-seq: read_float -> Float
314
+ *
315
+ * Reads a single-precision float from the packet.
316
+ *
317
+ * @return [Float] a single-precision float
318
+ */
163
319
  rb_define_method(rb_cPacket, "read_float", Packet_read_float, 0);
320
+ /* call-seq: read_double -> Float
321
+ *
322
+ * Reads a double-precision float from the packet.
323
+ *
324
+ * @return [Float] a double-precision float
325
+ */
164
326
  rb_define_method(rb_cPacket, "read_double", Packet_read_double, 0);
165
327
  rb_define_method(rb_cPacket, "read_string", Packet_read_string, 0);
166
328
 
329
+ /* call-seq:
330
+ * write_bool(value) -> value
331
+ *
332
+ * Writes +value+ as a boolean.
333
+ *
334
+ * @return [Boolean] +value+
335
+ */
167
336
  rb_define_method(rb_cPacket, "write_bool", Packet_write_bool, 1);
337
+ /* call-seq:
338
+ * write_int8(value) -> value
339
+ *
340
+ * Writes +value+ as a signed 8-bit integer.
341
+ *
342
+ * @return [Integer] +value+
343
+ */
168
344
  rb_define_method(rb_cPacket, "write_int8", Packet_write_int8, 1);
345
+ /* call-seq:
346
+ * write_uint8(value) -> value
347
+ *
348
+ * Writes +value+ as an unsigned 8-bit integer.
349
+ *
350
+ * @return [Integer] +value+
351
+ */
169
352
  rb_define_method(rb_cPacket, "write_uint8", Packet_write_uint8, 1);
353
+ /* call-seq:
354
+ * write_int16(value) -> value
355
+ *
356
+ * Writes +value+ as a signed 16-bit integer.
357
+ *
358
+ * @return [Integer] +value+
359
+ */
170
360
  rb_define_method(rb_cPacket, "write_int16", Packet_write_int16, 1);
361
+ /* call-seq:
362
+ * write_uint16(value) -> value
363
+ *
364
+ * Writes +value+ as an unsigned 16-bit integer.
365
+ *
366
+ * @return [Integer] +value+
367
+ */
171
368
  rb_define_method(rb_cPacket, "write_uint16", Packet_write_uint16, 1);
369
+ /* call-seq:
370
+ * write_int32(value) -> value
371
+ *
372
+ * Writes +value+ as a signed 32-bit integer.
373
+ *
374
+ * @return [Integer] +value+
375
+ */
172
376
  rb_define_method(rb_cPacket, "write_int32", Packet_write_int32, 1);
377
+ /* call-seq:
378
+ * write_uint32(value) -> value
379
+ *
380
+ * Writes +value+ as an unsigned 32-bit integer.
381
+ *
382
+ * @return [Integer] +value+
383
+ */
173
384
  rb_define_method(rb_cPacket, "write_uint32", Packet_write_uint32, 1);
385
+ /* call-seq:
386
+ * write_int64(value) -> value
387
+ *
388
+ * Writes +value+ as a signed 64-bit integer.
389
+ *
390
+ * @return [Integer] +value+
391
+ */
174
392
  rb_define_method(rb_cPacket, "write_int64", Packet_write_int64, 1);
393
+ /* call-seq:
394
+ * write_uint64(value) -> value
395
+ *
396
+ * Writes +value+ as an unsigned 64-bit integer.
397
+ *
398
+ * @return [Integer] +value+
399
+ */
175
400
  rb_define_method(rb_cPacket, "write_uint64", Packet_write_uint64, 1);
401
+ /* call-seq:
402
+ * write_float(value) -> value
403
+ *
404
+ * Writes +value+ as a single-precision float.
405
+ *
406
+ * @return [Float] +value+
407
+ */
176
408
  rb_define_method(rb_cPacket, "write_float", Packet_write_float, 1);
409
+ /* call-seq:
410
+ * write_double(value) -> value
411
+ *
412
+ * Writes +value+ as a double-precision float.
413
+ *
414
+ * @return [Float] +value+
415
+ */
177
416
  rb_define_method(rb_cPacket, "write_double", Packet_write_double, 1);
178
417
  rb_define_method(rb_cPacket, "write_string", Packet_write_string, 1);
179
418
  }
@@ -182,8 +421,8 @@ VALUE Get_Klass_Packet(void) {
182
421
  return rb_cPacket;
183
422
  }
184
423
 
185
- void *Get_Packet_Struct(VALUE self) {
186
- Packet *ptr;
424
+ void* Get_Packet_Struct(VALUE self) {
425
+ Packet* ptr;
187
426
  TypedData_Get_Struct(self, Packet, &Packet_data_type, ptr);
188
427
  return ptr->packet;
189
428
  }
@@ -11,13 +11,13 @@
11
11
  #include "system/time.h"
12
12
 
13
13
  typedef struct {
14
- sfSocketSelector *handle;
14
+ sfSocketSelector* handle;
15
15
  } SocketSelector;
16
16
 
17
17
  static VALUE rb_cSocketSelector;
18
18
 
19
- static void SocketSelector_free(void *ptr) {
20
- SocketSelector *selector = ptr;
19
+ static void SocketSelector_free(void* ptr) {
20
+ SocketSelector* selector = ptr;
21
21
 
22
22
  sfSocketSelector_destroy(selector->handle);
23
23
  free(selector);
@@ -26,11 +26,10 @@ static void SocketSelector_free(void *ptr) {
26
26
  static const rb_data_type_t SocketSelector_data_type = {
27
27
  .wrap_struct_name = "SFML::SocketSelector",
28
28
  .function = {.dmark = NULL, .dfree = SocketSelector_free, .dsize = NULL},
29
- .flags = RUBY_TYPED_FREE_IMMEDIATELY
30
- };
29
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY};
31
30
 
32
- static VALUE SocketSelector_wrap(VALUE klass, sfSocketSelector *handle) {
33
- SocketSelector *ptr;
31
+ static VALUE SocketSelector_wrap(VALUE klass, sfSocketSelector* handle) {
32
+ SocketSelector* ptr;
34
33
 
35
34
  if (handle == NULL) {
36
35
  rb_raise(rb_eRuntimeError, "failed to create socket selector");
@@ -42,17 +41,42 @@ static VALUE SocketSelector_wrap(VALUE klass, sfSocketSelector *handle) {
42
41
  return TypedData_Wrap_Struct(klass, &SocketSelector_data_type, ptr);
43
42
  }
44
43
 
45
- static VALUE SocketSelector_new(VALUE klass) {
44
+ static VALUE SocketSelector_alloc(VALUE klass) {
46
45
  return SocketSelector_wrap(klass, sfSocketSelector_create());
47
46
  }
48
47
 
48
+ /* call-seq:
49
+ * SocketSelector.new -> SocketSelector
50
+ *
51
+ * Creates a new, empty socket selector.
52
+ *
53
+ * @return [SocketSelector]
54
+ */
55
+ static VALUE SocketSelector_initialize(VALUE self) {
56
+ return self;
57
+ }
58
+
59
+ /* call-seq: copy -> SocketSelector
60
+ *
61
+ * Returns an independent copy of the selector.
62
+ *
63
+ * @return [SocketSelector] an independent copy with the same watched sockets
64
+ */
49
65
  static VALUE SocketSelector_copy(VALUE self) {
50
66
  return SocketSelector_wrap(Get_Klass_SocketSelector(),
51
67
  sfSocketSelector_copy(Get_SocketSelector_Struct(self)));
52
68
  }
53
69
 
70
+ /* call-seq:
71
+ * add(socket) -> self
72
+ *
73
+ * Adds a TcpListener, TcpSocket or UdpSocket to watch for activity.
74
+ *
75
+ * @return [self]
76
+ * @raise [TypeError] if +socket+ is none of the above
77
+ */
54
78
  static VALUE SocketSelector_add(VALUE self, VALUE rb_socket) {
55
- sfSocketSelector *selector = Get_SocketSelector_Struct(self);
79
+ sfSocketSelector* selector = Get_SocketSelector_Struct(self);
56
80
 
57
81
  if (rb_obj_is_kind_of(rb_socket, Get_Klass_TcpListener())) {
58
82
  sfSocketSelector_addTcpListener(selector, Get_TcpListener_Struct(rb_socket));
@@ -67,8 +91,16 @@ static VALUE SocketSelector_add(VALUE self, VALUE rb_socket) {
67
91
  return self;
68
92
  }
69
93
 
94
+ /* call-seq:
95
+ * remove(socket) -> self
96
+ *
97
+ * Removes a socket previously added with #add.
98
+ *
99
+ * @return [self]
100
+ * @raise [TypeError] if +socket+ is not a TcpListener, TcpSocket or UdpSocket
101
+ */
70
102
  static VALUE SocketSelector_remove(VALUE self, VALUE rb_socket) {
71
- sfSocketSelector *selector = Get_SocketSelector_Struct(self);
103
+ sfSocketSelector* selector = Get_SocketSelector_Struct(self);
72
104
 
73
105
  if (rb_obj_is_kind_of(rb_socket, Get_Klass_TcpListener())) {
74
106
  sfSocketSelector_removeTcpListener(selector, Get_TcpListener_Struct(rb_socket));
@@ -83,12 +115,26 @@ static VALUE SocketSelector_remove(VALUE self, VALUE rb_socket) {
83
115
  return self;
84
116
  }
85
117
 
118
+ /* call-seq: clear -> self
119
+ *
120
+ * Removes all watched sockets.
121
+ *
122
+ * @return [self]
123
+ */
86
124
  static VALUE SocketSelector_clear(VALUE self) {
87
125
  sfSocketSelector_clear(Get_SocketSelector_Struct(self));
88
126
  return self;
89
127
  }
90
128
 
91
- static VALUE SocketSelector_wait(int argc, VALUE *argv, VALUE self) {
129
+ /* call-seq:
130
+ * wait(timeout = Time.zero) -> true or false
131
+ *
132
+ * Blocks until one of the watched sockets is ready to read, or +timeout+
133
+ * elapses. A zero +timeout+ means wait forever.
134
+ *
135
+ * @return [Boolean] whether a socket became ready (+false+ on timeout)
136
+ */
137
+ static VALUE SocketSelector_wait(int argc, VALUE* argv, VALUE self) {
92
138
  VALUE rb_timeout;
93
139
  sfTime timeout = sfTime_Zero;
94
140
 
@@ -101,32 +147,63 @@ static VALUE SocketSelector_wait(int argc, VALUE *argv, VALUE self) {
101
147
  return BOOL2RB(sfSocketSelector_wait(Get_SocketSelector_Struct(self), timeout));
102
148
  }
103
149
 
150
+ /* call-seq:
151
+ * tcp_listener_ready?(listener) -> true or false
152
+ *
153
+ * Call after #wait returns +true+ to check whether a given watched
154
+ * TcpListener is one of the sockets that became ready.
155
+ *
156
+ * @return [Boolean]
157
+ */
104
158
  static VALUE SocketSelector_tcp_listener_ready(VALUE self, VALUE rb_socket) {
105
159
  return BOOL2RB(sfSocketSelector_isTcpListenerReady(Get_SocketSelector_Struct(self),
106
160
  Get_TcpListener_Struct(rb_socket)));
107
161
  }
108
162
 
163
+ /* call-seq:
164
+ * tcp_socket_ready?(socket) -> true or false
165
+ *
166
+ * Call after #wait returns +true+ to check whether a given watched
167
+ * TcpSocket is one of the sockets that became ready.
168
+ *
169
+ * @return [Boolean]
170
+ */
109
171
  static VALUE SocketSelector_tcp_socket_ready(VALUE self, VALUE rb_socket) {
110
- return BOOL2RB(
111
- sfSocketSelector_isTcpSocketReady(Get_SocketSelector_Struct(self), Get_TcpSocket_Struct(rb_socket)));
172
+ return BOOL2RB(sfSocketSelector_isTcpSocketReady(Get_SocketSelector_Struct(self),
173
+ Get_TcpSocket_Struct(rb_socket)));
112
174
  }
113
175
 
176
+ /* call-seq:
177
+ * udp_socket_ready?(socket) -> true or false
178
+ *
179
+ * Call after #wait returns +true+ to check whether a given watched
180
+ * UdpSocket is one of the sockets that became ready.
181
+ *
182
+ * @return [Boolean]
183
+ */
114
184
  static VALUE SocketSelector_udp_socket_ready(VALUE self, VALUE rb_socket) {
115
- return BOOL2RB(
116
- sfSocketSelector_isUdpSocketReady(Get_SocketSelector_Struct(self), Get_UdpSocket_Struct(rb_socket)));
185
+ return BOOL2RB(sfSocketSelector_isUdpSocketReady(Get_SocketSelector_Struct(self),
186
+ Get_UdpSocket_Struct(rb_socket)));
117
187
  }
118
188
 
119
- void Init_SocketSelector(VALUE rb_module) {
120
- rb_cSocketSelector = rb_define_class_under(rb_module, "SocketSelector", rb_cObject);
189
+ /* Document-class: SFML::SocketSelector
190
+ * Watches a set of TcpListener, TcpSocket and UdpSocket instances and blocks
191
+ * until at least one of them is ready to read, so a single thread can
192
+ * multiplex several sockets without polling.
193
+ */
194
+ void Init_SocketSelector(VALUE rb_mSFML) {
195
+ rb_cSocketSelector = rb_define_class_under(rb_mSFML, "SocketSelector", rb_cObject);
196
+ rb_define_alloc_func(rb_cSocketSelector, SocketSelector_alloc);
121
197
 
122
- rb_define_singleton_method(rb_cSocketSelector, "new", SocketSelector_new, 0);
198
+ rb_define_method(rb_cSocketSelector, "initialize", SocketSelector_initialize, 0);
123
199
 
124
200
  rb_define_method(rb_cSocketSelector, "copy", SocketSelector_copy, 0);
125
201
  rb_define_method(rb_cSocketSelector, "add", SocketSelector_add, 1);
126
202
  rb_define_method(rb_cSocketSelector, "remove", SocketSelector_remove, 1);
127
203
  rb_define_method(rb_cSocketSelector, "clear", SocketSelector_clear, 0);
128
204
  rb_define_method(rb_cSocketSelector, "wait", SocketSelector_wait, -1);
129
- rb_define_method(rb_cSocketSelector, "tcp_listener_ready?", SocketSelector_tcp_listener_ready, 1);
205
+ rb_define_method(rb_cSocketSelector, "tcp_listener_ready?", SocketSelector_tcp_listener_ready,
206
+ 1);
130
207
  rb_define_method(rb_cSocketSelector, "tcp_socket_ready?", SocketSelector_tcp_socket_ready, 1);
131
208
  rb_define_method(rb_cSocketSelector, "udp_socket_ready?", SocketSelector_udp_socket_ready, 1);
132
209
  }
@@ -135,8 +212,8 @@ VALUE Get_Klass_SocketSelector(void) {
135
212
  return rb_cSocketSelector;
136
213
  }
137
214
 
138
- void *Get_SocketSelector_Struct(VALUE self) {
139
- SocketSelector *ptr;
215
+ void* Get_SocketSelector_Struct(VALUE self) {
216
+ SocketSelector* ptr;
140
217
  TypedData_Get_Struct(self, SocketSelector, &SocketSelector_data_type, ptr);
141
218
  return ptr->handle;
142
219
  }