Skip to content
This repository was archived by the owner on Feb 14, 2025. It is now read-only.

Commit 8cdcc37

Browse files
committed
wip refactoring structs to use span for read trait. Scanner still needs some work
1 parent dfabc33 commit 8cdcc37

File tree

11 files changed

+204
-166
lines changed

11 files changed

+204
-166
lines changed

CHANGELOG.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,23 @@
1-
21
# Change Log
2+
33
All notable changes to this project will be documented in this file.
44

55
The format is based on [Keep a Changelog](http://keepachangelog.com/)
66
and this project adheres to [Semantic Versioning](http://semver.org/).
77

88
## [Unreleased] - yyyy-mm-dd
99

10+
## [0.0.2] - 2024-06-19
11+
12+
### Added
13+
14+
- UDP support in `net` package.
15+
- `examples` package with `tcp` and `udp` examples using `Socket` and their respective `dial` and `listen` functions.
16+
17+
### Removed
18+
19+
- `Listener`, `Dialer`, and `Conn` interfaces have been removed until Trait support improves. For now, call `listen_tcp/listen_udp` and `dial_tcp/dial_udp` functions directly.
20+
1021
## [0.0.1] - 2024-06-16
1122

1223
### Changed

examples/udp/listener_server.mojo

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ from gojo.net import UDPAddr, get_ip_address, listen_udp, HostPort
22
import gojo.io
33

44

5-
fn udp_listener() raises:
5+
fn main() raises:
66
var listener = listen_udp("udp", UDPAddr("127.0.0.1", 12000))
77

88
while True:
@@ -21,7 +21,3 @@ fn udp_listener() raises:
2121
var bytes_sent: Int
2222
bytes_sent, err = listener.write_to(message.as_bytes(), UDPAddr(remote.host, remote.port))
2323
print("Message sent:", message)
24-
25-
26-
fn main() raises:
27-
udp_listener()

examples/udp/socket_server.mojo

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ from gojo.syscall import SocketType
33
import gojo.io
44

55

6-
fn udp_server() raises:
6+
fn main() raises:
77
var socket = Socket(socket_type=SocketType.SOCK_DGRAM)
88
alias host = "127.0.0.1"
99
alias port = 12000
@@ -26,7 +26,3 @@ fn udp_server() raises:
2626
var bytes_sent: Int
2727
bytes_sent, err = socket.send_to(message.as_bytes(), remote.host, remote.port)
2828
print("Message sent:", message)
29-
30-
31-
fn main() raises:
32-
udp_server()

gojo/bufio/bufio.mojo

Lines changed: 57 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,8 @@ struct Reader[R: io.Reader](Sized, io.Reader, io.ByteReader, io.ByteScanner):
108108
if self.read_pos > 0:
109109
var data_to_slide = self.as_bytes_slice()[self.read_pos : self.write_pos]
110110
# TODO: Temp copying of elements until I figure out a better pattern or slice refs are added
111-
for i in range(len(self.buf)):
112-
if i > len(self.buf):
113-
self.buf[i] = data_to_slide[i]
114-
else:
115-
self.buf.append(data_to_slide[i])
111+
for i in range(len(data_to_slide)):
112+
self.buf[i] = data_to_slide[i]
116113

117114
# self.buf.reserve(current_capacity)
118115
self.write_pos -= self.read_pos
@@ -126,20 +123,22 @@ struct Reader[R: io.Reader](Sized, io.Reader, io.ByteReader, io.ByteScanner):
126123
# Read new data: try a limited number of times.
127124
var i: Int = MAX_CONSECUTIVE_EMPTY_READS
128125
while i > 0:
129-
# TODO: Using temp until slicing can return a Reference
130-
var temp = List[UInt8](capacity=io.BUFFER_SIZE)
126+
# TODO: Using temp until slicing can return a Reference, does reading directly into a Span of self.buf work?
127+
# Maybe we need to read into the end of the buffer.
128+
var span = self.as_bytes_slice()
131129
var bytes_read: Int
132130
var err: Error
133-
bytes_read, err = self.reader.read(temp)
131+
bytes_read, err = self.reader.read(span)
132+
print("bytes read, bufio reader", bytes_read)
134133
if bytes_read < 0:
135134
panic(ERR_NEGATIVE_READ)
136135

137-
# TODO: Temp copying of elements until I figure out a better pattern or slice refs are added
138-
for i in range(len(temp)):
139-
if i + self.write_pos > len(temp):
140-
self.buf[i + self.write_pos] = temp[i]
141-
else:
142-
self.buf.append(temp[i])
136+
# # TODO: Temp copying of elements until I figure out a better pattern or slice refs are added
137+
# for i in range(len(temp)):
138+
# if i + self.write_pos > len(temp):
139+
# self.buf[i + self.write_pos] = temp[i]
140+
# else:
141+
# self.buf.append(temp[i])
143142
self.write_pos += bytes_read
144143

145144
if err:
@@ -230,44 +229,47 @@ struct Reader[R: io.Reader](Sized, io.Reader, io.ByteReader, io.ByteScanner):
230229
if remain == 0:
231230
return number_of_bytes, Error()
232231

233-
fn read(inout self, inout dest: List[UInt8]) -> (Int, Error):
232+
fn read(inout self, inout dest: Span[UInt8, True]) -> (Int, Error):
234233
"""Reads data into dest.
235234
It returns the number of bytes read into dest.
236235
The bytes are taken from at most one Read on the underlying [Reader],
237236
hence n may be less than len(src).
238237
To read exactly len(src) bytes, use io.ReadFull(b, src).
239238
If the underlying [Reader] can return a non-zero count with io.EOF,
240239
then this Read method can do so as well; see the [io.Reader] docs."""
241-
var space_available = dest.capacity - len(dest)
242-
if space_available == 0:
243-
if self.buffered() > 0:
244-
return 0, Error()
245-
return 0, self.read_error()
240+
# TODO: How do we check the capacity of a Span? Or UnsafePointer?
241+
# var space_available = dest.capacity - len(dest)
242+
# if space_available == 0:
243+
# if self.buffered() > 0:
244+
# return 0, Error()
245+
# return 0, self.read_error()
246246

247247
var bytes_read: Int = 0
248248
if self.read_pos == self.write_pos:
249-
if space_available >= len(self.buf):
250-
# Large read, empty buffer.
251-
# Read directly into dest to avoid copy.
252-
var bytes_read: Int
253-
var err: Error
254-
bytes_read, err = self.reader.read(dest)
249+
# TODO: How do we check the capacity of a Span? Or UnsafePointer? For now just assume the buffer DOES have enough space.
250+
# if space_available >= len(self.buf):
251+
# Large read, empty buffer.
252+
# Read directly into dest to avoid copy.
253+
# var bytes_read: Int
254+
# var err: Error
255+
# bytes_read, err = self.reader.read(dest)
256+
# print("bufio reader", bytes_read, err)
255257

256-
self.err = err
257-
if bytes_read < 0:
258-
panic(ERR_NEGATIVE_READ)
258+
# self.err = err
259+
# if bytes_read < 0:
260+
# panic(ERR_NEGATIVE_READ)
259261

260-
if bytes_read > 0:
261-
self.last_byte = int(dest[bytes_read - 1])
262-
self.last_rune_size = -1
262+
# if bytes_read > 0:
263+
# self.last_byte = int(dest[bytes_read - 1])
264+
# self.last_rune_size = -1
263265

264-
return bytes_read, self.read_error()
266+
# return bytes_read, self.read_error()
265267

266268
# One read.
267269
# Do not use self.fill, which will loop.
268270
self.read_pos = 0
269271
self.write_pos = 0
270-
var buf = List[UInt8](self.as_bytes_slice()) # TODO: I'm hoping this reads into self.data directly lol
272+
var buf = self.as_bytes_slice() # TODO: I'm hoping this reads into self.data directly lol
271273
var bytes_read: Int
272274
var err: Error
273275
bytes_read, err = self.reader.read(buf)
@@ -281,11 +283,17 @@ struct Reader[R: io.Reader](Sized, io.Reader, io.ByteReader, io.ByteScanner):
281283
self.write_pos += bytes_read
282284

283285
# copy as much as we can
284-
# Note: if the slice panics here, it is probably because
285-
# the underlying reader returned a bad count. See issue 49795.
286-
bytes_read = copy(dest, self.as_bytes_slice()[self.read_pos : self.write_pos])
286+
var source = self.as_bytes_slice()[self.read_pos : self.write_pos]
287+
bytes_read = 0
288+
var start = len(dest)
289+
290+
for i in range(len(source)):
291+
dest[i + start] = source[i]
292+
bytes_read += 1
293+
294+
dest._len += bytes_read
287295
self.read_pos += bytes_read
288-
self.last_byte = int(self.as_bytes_slice()[self.read_pos - 1])
296+
self.last_byte = int(self.buf[self.read_pos - 1])
289297
self.last_rune_size = -1
290298
return bytes_read, Error()
291299

@@ -931,18 +939,17 @@ struct Writer[W: io.Writer, size: Int = io.BUFFER_SIZE](
931939
while nr < MAX_CONSECUTIVE_EMPTY_READS:
932940
# TODO: should really be using a slice that returns refs and not a copy.
933941
# Read into remaining unused space in the buffer. We need to reserve capacity for the slice otherwise read will never hit EOF.
934-
var sl = List[UInt8](self.as_bytes_slice()[self.bytes_written : len(self.buf)])
935-
sl.reserve(self.buf.capacity)
936-
bytes_read, err = reader.read(sl)
937-
if bytes_read > 0:
938-
# TODO: Temp copying of elements until I figure out a better pattern or slice refs are added
939-
var bytes_read = 0
940-
for i in range(len(sl)):
941-
if i + self.bytes_written > len(sl):
942-
self.buf[i + self.bytes_written] = sl[i]
943-
else:
944-
self.buf.append(sl[i])
945-
bytes_read += 1
942+
var buf = self.as_bytes_slice()[self.bytes_written : len(self.buf)]
943+
bytes_read, err = reader.read(buf)
944+
# if bytes_read > 0:
945+
# # TODO: Temp copying of elements until I figure out a better pattern or slice refs are added
946+
# var bytes_read = 0
947+
# for i in range(len(sl)):
948+
# if i + self.bytes_written > len(sl):
949+
# self.buf[i + self.bytes_written] = sl[i]
950+
# else:
951+
# self.buf.append(sl[i])
952+
# bytes_read += 1
946953

947954
if bytes_read != 0 or err:
948955
break

0 commit comments

Comments
 (0)