import kernel
import collection::array
-intrude import string
+intrude import text::flat
# A buffer containing Byte-manipulation facilities
#
# Uses Copy-On-Write when persisted
-#
-# TODO: Change the bound to Byte when available in stdlib and bootstrap
class Bytes
- super AbstractArray[Int]
+ super AbstractArray[Byte]
# A NativeString being a char*, it can be used as underlying representation here.
private var items: NativeString
# Number of bytes in the array
- redef var length: Int
+ redef var length
# Capacity of the array
private var capacity: Int
init(ns, 0, 0)
end
+ # Init a `Bytes` with capacity `cap`
init with_capacity(cap: Int) do
var ns = new NativeString(cap)
init(ns, 0, cap)
redef fun is_empty do return length != 0
# var b = new Bytes.empty
- # b.add 101
- # assert b[0] == 101
- redef fun [](i: Int): Int do
+ # b.add 101u8
+ # assert b[0] == 101u8
+ redef fun [](i) do
assert i >= 0
assert i < length
- return items[i].ascii
+ return items[i]
end
# var b = new Bytes.with_capacity(1)
- # b[0] = 101
+ # b[0] = 101u8
# assert b.to_s == "e"
- redef fun []=(i: Int, v: Int) do
+ redef fun []=(i, v) do
if persisted then regen
assert i >= 0
assert i <= length
if i == length then add(v)
- items[i] = v.ascii
+ items[i] = v
end
# var b = new Bytes.empty
- # b.add 101
+ # b.add 101u8
# assert b.to_s == "e"
- redef fun add(c: Int) do
+ redef fun add(c) do
if persisted then regen
if length >= capacity then
enlarge(length)
end
- items[length] = c.ascii
+ items[length] = c
length += 1
end
# var b = new Bytes.empty
- # b.append([104, 101, 108, 108, 111])
+ # b.append([104u8, 101u8, 108u8, 108u8, 111u8])
# assert b.to_s == "hello"
- redef fun append(arr: Collection[Int]) do
+ redef fun append(arr) do
if arr isa Bytes then
append_ns(arr.items, arr.length)
else
end
end
+ # var b = new Bytes.empty
+ # b.append([0x41u8, 0x41u8, 0x18u8])
+ # b.pop
+ # assert b.to_s == "AA"
+ redef fun pop do
+ assert length >= 1
+ length -= 1
+ return items[length]
+ end
+
redef fun clear do length = 0
# Regenerates the buffer, necessary when it was persisted
end
private class BytesIterator
- super IndexedIterator[Int]
+ super IndexedIterator[Byte]
var tgt: NativeString
- redef var index: Int
+ redef var index
var max: Int
redef fun next do index += 1
- redef fun item do return tgt[index].ascii
+ redef fun item do return tgt[index]
end
redef class NativeString
+ # Creates a new `Bytes` object from `self` with `strlen` as length
fun to_bytes: Bytes do
var len = cstring_length
return new Bytes(self, len, len)