std.byte_array.ByteArray
class pub builtin ByteArrayAn array of bytes.
Byte arrays are arrays specialised for storing individual bytes in the most
efficient way possible. Unlike a regular Array of Int values, each value
only requires a single byte of space, instead of requiring 8 bytes of space.
Byte arrays are primarily meant for reading and writing data from/to a stream,
such as a file or a socket. If you simply want to store a list of numbers,
you're better off using the Array type.
Static methods
filled
Show source codeHide source code
fn pub static filled(with: Int, times: Int) -> ByteArray {
let bytes = new
bytes.resize(times, with)
bytes
}fn pub static filled(with: Int, times: Int) -> ByteArrayReturns a ByteArray filled with the given byte.
The times argument specifies how many times the with argument must
exist in the byte array.
Examples
let bytes = ByteArray.filled(with: 0, times: 2)
bytes.get(0) # => 0
bytes.get(1) # => 0
from_array
Show source codeHide source code
fn pub static from_array(array: ref Array[Int]) -> ByteArray {
let bytes = ByteArray.new
array.iter.each(fn (v) { bytes.push(v) })
bytes
}fn pub static from_array(array: ref Array[Int]) -> ByteArrayReturns a new ByteArray created from the given Array.
from_pointer
Show source codeHide source code
fn pub static from_pointer(pointer: Pointer[UInt8], size: Int) -> ByteArray {
inko_byte_array_from_pointer(_INKO.state, pointer, size)
}fn pub static from_pointer(pointer: Pointer[UInt8], size: Int) -> ByteArrayReturns a ByteArray created from a raw pointer.
The size argument specifies the number of bytes to read starting at the
given pointer.
The purpose of this method is to allow creating a ByteArray from a pointer
returned by C code. Avoid using this method for anything else.
new
Show source codeHide source code
fn pub static new -> ByteArray {
inko_byte_array_new(_INKO.state)
}fn pub static new -> ByteArrayReturns a new empty ByteArray.
with_capacity
Show source codeHide source code
fn pub static with_capacity(size: Int) -> ByteArray {
if size < 0 { invalid_capacity(size) }
inko_byte_array_with_capacity(_INKO.state, size)
}fn pub static with_capacity(size: Int) -> ByteArrayReturns a ByteArray with enough space for size bytes.
The actual capacity may be greater than the given value.
Panics
This method panics of size if less than zero.
Examples
ByteArray.with_capacity(32).capacity # => 32
Instance methods
!=
Show source codeHide source code
fn pub !=(other: T) -> Bool {
(self == other).false?
}fn pub !=(other: T) -> BoolReturns true if self and the given object are not equal to each other.
==
Show source codeHide source code
fn pub ==(other: ref ByteArray) -> Bool {
let size = self.size
if size == other.size {
ptr.equal(to_pointer, other.to_pointer, size: size)
} else {
false
}
}fn pub ==(other: ref ByteArray) -> BoolReturns true if two ByteArray objects are equal to each other.
Two ByteArray objects are considered equal if they have the exact same
values in the exact same order.
Examples
Comparing two ByteArray objects:
ByteArray.from_array([10]) == ByteArray.from_array([10]) # => true
ByteArray.from_array([10]) == ByteArray.from_array([20]) # => false
append
Show source codeHide source code
fn pub mut append(other: ByteArray) {
inko_byte_array_append(self, other)
}fn pub mut append(other: ByteArray)Appends the bytes of the given ByteArray to self.
Examples
let a = ByteArray.from_array([10])
let b = ByteArray.from_array([20])
a.append(b)
a # => ByteArray.from_array([10, 20])
byte
Show source codeHide source code
fn pub byte(index: Int) -> Int {
get(index)
}fn pub byte(index: Int) -> IntAn alias for ByteArray.get.
bytes
Show source codeHide source code
fn pub bytes -> Stream[Int] {
iter
}fn pub bytes -> Stream[Int]An alias for ByteArray.iter.
capacity
Show source codeHide source code
fn pub capacity -> Int {
inko_byte_array_capacity(self)
}fn pub capacity -> IntReturns the number of bytes that can be stored in self before self needs
to be resized.
Examples
ByteArray.new.capacity # => 0
ByteArray.with_capacity(32).capacity # => 32
clear
Show source codeHide source code
fn pub mut clear {
inko_byte_array_clear(self)
}fn pub mut clearRemoves all values from this ByteArray.
Examples
Removing all values:
let bytes = ByteArray.from_array([10, 20, 30])
bytes.clear
bytes.size # => 0
clone
Show source codeHide source code
fn pub clone -> ByteArray {
inko_byte_array_clone(_INKO.state, self)
}fn pub clone -> ByteArrayCreates a clone of self.
contains?
Show source codeHide source code
fn pub contains?(value: ref Int) -> Bool {
iter.any?(fn (ours) { ours == value })
}fn pub contains?(value: ref Int) -> BoolReturns true if the given byte is contained in self.
Examples
let bytes = ByteArray.from_array([10, 20])
bytes.contains?(10) # => true
copy_from
Show source codeHide source code
fn pub mut copy_from(bytes: ref ByteArray, at: Int, size: Int) -> Int {
inko_byte_array_copy_from(self, bytes, at, size)
}fn pub mut copy_from(bytes: ref ByteArray, at: Int, size: Int) -> IntCopies up to size bytes from bytes into self, starting at the index
at.
The return value is the number of bytes copied. This value may be less than
size if there are fewer bytes in bytes.
Examples
let a = ByteArray.from_array([1, 2, 3, 4])
let b = ByteArray.new
b.copy_from(a, at: 0, size: 2)
b # => ByteArray.from_array([1, 2])
drain_to_string
Show source codeHide source code
fn pub mut drain_to_string -> String {
inko_byte_array_drain_to_string(_INKO.state, self)
}fn pub mut drain_to_string -> StringReturns a new String using the bytes in this ByteArray, draining it in
the process.
After this method is finished, self is left empty. This allows one to
convert a temporary ByteArray into a String, without requiring the list
of bytes to be allocated twice.
Examples
Draining a ByteArray into a String:
let bytes = ByteArray.from_array([105, 110, 107, 111])
bytes.drain_to_string # => 'inko'
bytes.empty? # => true
empty?
Show source codeHide source code
fn pub empty? -> Bool {
size == 0
}fn pub empty? -> BoolReturns true if self is empty.
Examples
ByteArray.new.empty? => true
ends_with?
Show source codeHide source code
fn pub ends_with?[T: Bytes](suffix: ref T) -> Bool {
ptr.ends_with?(to_pointer, size, suffix.to_pointer, suffix.size)
}fn pub ends_with?[T: Bytes](suffix: ref T) -> BoolReturns true if self ends with the given sequence of bytes.
Examples
'hello'.to_byte_array.ends_with?('o'.to_byte_array) # => true
'hello'.to_byte_array.ends_with?('o') # => true
equals_string?
Show source codeHide source code
fn pub equals_string?(string: String) -> Bool {
let size = self.size
if size == string.size {
ptr.equal(to_pointer, string.to_pointer, size)
} else {
false
}
}fn pub equals_string?(string: String) -> BoolReturns true if self is the same as the given String.
Examples
'hello'.to_byte_array.equals_string?('hello') # => true
fmt
Show source codeHide source code
fn pub fmt(formatter: mut Formatter) {
let fmt = formatter.array
iter.each(fn (byte) { fmt.value(byte) })
fmt.finish
}fn pub fmt(formatter: mut Formatter)Formats self in a human-readable format for debugging purposes.
get
Show source codeHide source code
fn pub get(index: Int) -> Int {
bounds_check(index, size)
inko_byte_array_get(self, index)
}fn pub get(index: Int) -> IntReturns the byte at the given index.
Panics
This method panics if the index is out of bounds.
Examples
Retrieving an existing byte:
let bytes = ByteArray.from_array([10, 20])
bytes.get(0) # => 10
hash
Show source codeHide source code
fn pub hash[H: mut + Hasher](hasher: mut H) {
iter.each(fn (v) { hasher.write(v) })
}fn pub hash[H: mut + Hasher](hasher: mut H: mut)Writes the hash for self into the given Hasher.
into_byte_array
Show source codeHide source code
fn pub move into_byte_array -> ByteArray {
self
}fn pub move into_byte_array -> ByteArrayinto_string
Show source codeHide source code
fn pub move into_string -> String {
drain_to_string
}fn pub move into_string -> StringMoves self into a String.
iter
Show source codeHide source code
fn pub iter -> Stream[Int] {
let mut idx = 0
let max = size
Stream.new(fn move {
if idx < max {
Option.Some(inko_byte_array_get(self, idx := idx + 1))
} else {
Option.None
}
})
}fn pub iter -> Stream[Int]Returns an iterator over the bytes in self.
last
Show source codeHide source code
fn pub last -> Option[Int] {
opt(size - 1)
}fn pub last -> Option[Int]Returns the last byte in self
Examples
ByteArray.new.last # => Option.None
ByteArray.from_array([10, 20]).last # => Option.Some(20)
opt
Show source codeHide source code
fn pub opt(index: Int) -> Option[Int] {
if index < 0 or index >= size { return Option.None }
Option.Some(inko_byte_array_get(self, index))
}fn pub opt(index: Int) -> Option[Int]Returns the byte at the given index, returning None if the index is out of bounds.
Examples
Retrieving an existing byte:
let bytes = ByteArray.from_array([10, 20])
bytes.opt(0) # => Option.Some(10)
Retrieving a non-existing byte:
let bytes = ByteArray.from_array([10, 20])
bytes.opt(5) # => Option.None
pop
Show source codeHide source code
fn pub mut pop -> Option[Int] {
match inko_byte_array_pop(self) {
case -1 -> Option.None
case val -> Option.Some(val)
}
}fn pub mut pop -> Option[Int]Removes a value from the back of the ByteArray, returning the removed
value.
If no value was found, a None is returned instead.
Examples
Popping an existing value:
let bytes = ByteArray.from_array([10])
bytes.pop # => Option.Some(10)
bytes.size # => 0
Popping a value when the ByteArray is empty:
let bytes = ByteArray.new
bytes.pop # => Option.None
push
Show source codeHide source code
fn pub mut push(value: Int) {
inko_byte_array_push(self, value)
_INKO.moved(value)
}fn pub mut push(value: Int)Pushes a value to the back of the ByteArray, returning the pushed value.
Examples
Pushing a value into a ByteArray:
let bytes = ByteArray.new
bytes.push(10) # => 10
bytes.size # => 1
remove_at
Show source codeHide source code
fn pub mut remove_at(index: Int) -> Int {
bounds_check(index, size)
inko_byte_array_remove(self, index)
}fn pub mut remove_at(index: Int) -> IntRemoves the value at the given index, returning the removed value.
Examples
Removing an existing value:
let bytes = ByteArray.from_array([10])
bytes.remove_at(0) # => 10
bytes.size # => 0
Panics
This method panics if the index is out of bounds.
reserve
Show source codeHide source code
fn pub mut reserve(size: Int) {
if capacity - self.size >= size { return }
inko_byte_array_reserve(self, size)
}fn pub mut reserve(size: Int)Reserves space for exactly size additional values.
If the capacity is great enough or the given size is less than zero, this method does nothing.
resize
Show source codeHide source code
fn pub mut resize(size: Int, value: Int) {
if size < 0 { invalid_size(size) }
inko_byte_array_resize(self, size, value)
}fn pub mut resize(size: Int, value: Int)Resizes self to the new size.
If the given size is greater than the current size, the value argument is
used to fill in the additional slots. If the given size is less than the
current size, self is simply truncated.
Panics
This method panics if the given size is less than zero.
Examples
let bytes = ByteArray.new
bytes.resize(size: 2, value: 1)
bytes # => ByteArray.from_array([1, 1])
bytes.resize(size: 0, value: 0)
bytes # => ByteArray.new
reverse
Show source codeHide source code
fn pub mut reverse {
let mut a = 0
let mut b = size - 1
while a < b {
let a_val = inko_byte_array_get(self, a)
inko_byte_array_set(self, a, inko_byte_array_set(self, b, a_val))
a += 1
b -= 1
}
}fn pub mut reverseReverses self in-place
Examples
let a = ByteArray.from_array([10, 20, 30])
a.reverse
a # => ByteArray.from_array([30, 20, 10])
set
Show source codeHide source code
fn pub mut set(index: Int, value: Int) {
bounds_check(index, size)
inko_byte_array_set(self, index, value)
_INKO.moved(value)
}fn pub mut set(index: Int, value: Int)Stores a byte at the given index, then returns it.
Panics
This method panics if the index is out of bounds.
Examples
Setting the value of an existing index:
let bytes = ByteArray.from_array([10, 20])
bytes.set(0, 30)
bytes.get(0) # => 30
size
Show source codeHide source code
fn pub size -> Int {
inko_byte_array_size(self)
}fn pub size -> IntReturns the number of bytes in this ByteArray.
Examples
Obtaining the size of a ByteArray
ByteArray.new.size # => 0
ByteArray.from_array([10]).size # => 1
slice
Show source codeHide source code
fn pub slice(start: Int, size: Int) -> ByteArray {
bounds_check(start, self.size)
inko_byte_array_slice(_INKO.state, self, start, size)
}fn pub slice(start: Int, size: Int) -> ByteArraySlices self into a new ByteArray.
Similar to slicing a String, slicing a ByteArray allows one to extract
a sub-array by providing a start position and the number of bytes to
include starting at the start position.
Examples
Slicing a ByteArray:
let bytes = ByteArray.from_array([1, 2, 3, 4])
let sliced = bytes.slice(start: 1, size: 2)
sliced.get(0) # => 2
sliced.get(1) # => 3
starts_with?
Show source codeHide source code
fn pub starts_with?[T: Bytes](prefix: ref T) -> Bool {
ptr.starts_with?(to_pointer, size, prefix.to_pointer, prefix.size)
}fn pub starts_with?[T: Bytes](prefix: ref T) -> BoolReturns true if self starts with the given sequence of bytes.
Examples
'hello'.to_byte_array.starts_with?('h'.to_byte_array) # => true
'hello'.to_byte_array.starts_with?('h') # => true
to_array
Show source codeHide source code
fn pub to_array -> Array[Int] {
iter.to_array
}fn pub to_array -> Array[Int]Converts the ByteArray to an Array!(Int).
Examples
Converting a ByteArray:
let bytes = ByteArray.from_array([105, 110, 107, 111])
bytes.to_array # => [105, 110, 107, 111]
to_byte_array
Show source codeHide source code
fn pub to_byte_array -> ByteArray {
clone
}fn pub to_byte_array -> ByteArrayto_pointer
Show source codeHide source code
fn pub to_pointer -> Pointer[UInt8] {
inko_byte_array_to_pointer(self)
}fn pub to_pointer -> Pointer[UInt8]Returns a raw pointer to the bytes of self.
This method is meant to be used when passing byte arrays to foreign functions. You should avoid using it for anything else.
to_string
Show source codeHide source code
fn pub to_string -> String {
inko_byte_array_to_string(_INKO.state, self)
}fn pub to_string -> StringReturns a new String using the bytes in this ByteArray.
Any invalid UTF-8 sequences will be replaced with U+FFFD REPLACEMENT
CHARACTER, which looks like this: �
Examples
Converting a ByteArray into a String:
let bytes = ByteArray.from_array([105, 110, 107, 111])
bytes.to_string # => 'inko'
Implemented traits
IntoByteArray
impl IntoByteArray for ByteArrayToByteArray
impl ToByteArray for ByteArrayClone
impl Clone[ByteArray] for ByteArrayContains
impl Contains[Int] for ByteArrayEqual
impl Equal[ref ByteArray] for ByteArrayDrop
impl Drop for ByteArrayFormat
impl Format for ByteArrayHash
impl Hash for ByteArrayBytes
impl Bytes for ByteArrayIntoString
impl IntoString for ByteArrayToString
impl ToString for ByteArray