@@ -108,11 +108,8 @@ struct Reader[R: io.Reader](Sized, io.Reader, io.ByteReader, io.ByteScanner):
108
108
if self .read_pos > 0 :
109
109
var data_to_slide = self .as_bytes_slice()[self .read_pos : self .write_pos]
110
110
# 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]
116
113
117
114
# self.buf.reserve(current_capacity)
118
115
self .write_pos -= self .read_pos
@@ -126,20 +123,22 @@ struct Reader[R: io.Reader](Sized, io.Reader, io.ByteReader, io.ByteScanner):
126
123
# Read new data: try a limited number of times.
127
124
var i : Int = MAX_CONSECUTIVE_EMPTY_READS
128
125
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()
131
129
var bytes_read : Int
132
130
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)
134
133
if bytes_read < 0 :
135
134
panic(ERR_NEGATIVE_READ )
136
135
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])
143
142
self .write_pos += bytes_read
144
143
145
144
if err:
@@ -230,44 +229,47 @@ struct Reader[R: io.Reader](Sized, io.Reader, io.ByteReader, io.ByteScanner):
230
229
if remain == 0 :
231
230
return number_of_bytes, Error()
232
231
233
- fn read (inout self , inout dest : List [UInt8]) -> (Int, Error):
232
+ fn read (inout self , inout dest : Span [UInt8, True ]) -> (Int, Error):
234
233
""" Reads data into dest.
235
234
It returns the number of bytes read into dest.
236
235
The bytes are taken from at most one Read on the underlying [Reader],
237
236
hence n may be less than len(src).
238
237
To read exactly len(src) bytes, use io.ReadFull(b, src).
239
238
If the underlying [Reader] can return a non-zero count with io.EOF,
240
239
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()
246
246
247
247
var bytes_read : Int = 0
248
248
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)
255
257
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)
259
261
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
263
265
264
- return bytes_read, self .read_error()
266
+ # return bytes_read, self.read_error()
265
267
266
268
# One read.
267
269
# Do not use self.fill, which will loop.
268
270
self .read_pos = 0
269
271
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
271
273
var bytes_read : Int
272
274
var err : Error
273
275
bytes_read, err = self .reader.read(buf)
@@ -281,11 +283,17 @@ struct Reader[R: io.Reader](Sized, io.Reader, io.ByteReader, io.ByteScanner):
281
283
self .write_pos += bytes_read
282
284
283
285
# 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
287
295
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 ])
289
297
self .last_rune_size = - 1
290
298
return bytes_read, Error()
291
299
@@ -931,18 +939,17 @@ struct Writer[W: io.Writer, size: Int = io.BUFFER_SIZE](
931
939
while nr < MAX_CONSECUTIVE_EMPTY_READS :
932
940
# TODO : should really be using a slice that returns refs and not a copy.
933
941
# 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
946
953
947
954
if bytes_read != 0 or err:
948
955
break
0 commit comments