sfml3-rb 0.2.2 → 0.3.0

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