Skip to content

Commit 65b9076

Browse files
Feature: create buffers from variadic arguments (#40)
The nicer API simplifies some of the tests.
1 parent de3a334 commit 65b9076

File tree

4 files changed

+44
-17
lines changed

4 files changed

+44
-17
lines changed

firebolt/arrays/base.mojo

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,23 @@ struct ArrayData(Copyable, Movable, Representable, Stringable, Writable):
3333
var children: List[ArcPointer[ArrayData]]
3434
var offset: Int
3535

36+
@staticmethod
37+
fn from_buffer[
38+
dtype: DataType
39+
](var buffer: Buffer, length: Int) -> ArrayData:
40+
"""Build an ArrayData from a buffer where all the values are not null.
41+
"""
42+
var bitmap = Bitmap.alloc(length)
43+
bitmap.unsafe_range_set(0, length, True)
44+
return ArrayData(
45+
dtype=materialize[dtype](),
46+
length=length,
47+
bitmap=ArcPointer(bitmap^),
48+
buffers=List(ArcPointer(buffer^)),
49+
children=List[ArcPointer[ArrayData]](),
50+
offset=0,
51+
)
52+
3653
fn __copyinit__(out self, existing: Self):
3754
self.dtype = existing.dtype.copy()
3855
self.length = existing.length

firebolt/arrays/tests/test_nested.mojo

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,9 @@ fn build_list_of_list[data_type: DataType]() raises -> ListArray:
2929
)
3030

3131
# Define the PrimitiveArrays.
32-
var value_offset = ArcPointer(Buffer.alloc(7))
33-
value_offset[].unsafe_set[DType.int32](0, 0)
34-
value_offset[].unsafe_set[DType.int32](1, 2)
35-
value_offset[].unsafe_set[DType.int32](2, 4)
36-
value_offset[].unsafe_set[DType.int32](3, 7)
37-
value_offset[].unsafe_set[DType.int32](4, 7)
38-
value_offset[].unsafe_set[DType.int32](5, 8)
39-
value_offset[].unsafe_set[DType.int32](6, 10)
32+
var value_offset = ArcPointer(
33+
Buffer.from_values[DType.int32](0, 2, 4, 7, 7, 8, 10)
34+
)
4035

4136
var list_bitmap = ArcPointer(Bitmap.alloc(6))
4237
list_bitmap[].unsafe_range_set(0, 6, True)
@@ -51,11 +46,7 @@ fn build_list_of_list[data_type: DataType]() raises -> ListArray:
5146
)
5247

5348
# Now define the master array data.
54-
var top_offsets = Buffer.alloc(4)
55-
top_offsets.unsafe_set[DType.int32](0, 0)
56-
top_offsets.unsafe_set[DType.int32](1, 2)
57-
top_offsets.unsafe_set[DType.int32](2, 5)
58-
top_offsets.unsafe_set[DType.int32](3, 6)
49+
var top_offsets = Buffer.from_values[DType.int32](0, 2, 5, 6)
5950
var top_bitmap = ArcPointer(Bitmap.alloc(4))
6051
top_bitmap[].unsafe_range_set(0, 4, True)
6152
return ListArray(
@@ -71,10 +62,11 @@ fn build_list_of_list[data_type: DataType]() raises -> ListArray:
7162

7263

7364
def test_list_int_array():
74-
var ints = Int64Array(capacity=3)
75-
ints.append(1)
76-
ints.append(2)
77-
ints.append(3)
65+
var ints = Int64Array(
66+
ArrayData.from_buffer[int64](
67+
Buffer.from_values[DType.int64](1, 2, 3), 3
68+
)
69+
)
7870
var lists = ListArray(ints^)
7971
assert_equal(lists.data.dtype, list_(materialize[int64]()))
8072

firebolt/buffers.mojo

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,16 @@ struct Buffer(Movable):
6666
memset_zero(ptr.bitcast[UInt8](), size)
6767
return Buffer(ptr, size)
6868

69+
@staticmethod
70+
fn from_values[dtype: DType](*values: Scalar[dtype]) -> Buffer:
71+
"""Build a buffer from a list of values."""
72+
var buffer = Self.alloc[dtype](len(values))
73+
74+
for i in range(len(values)):
75+
buffer.unsafe_set[dtype](i, values[i])
76+
77+
return buffer^
78+
6979
@staticmethod
7080
fn view[
7181
I: Intable, //

firebolt/tests/test_buffers.mojo

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,14 @@ def test_buffer_set_get():
5555
assert_equal(buf.unsafe_get[DType.uint16](1), 44)
5656

5757

58+
def test_buffer_from_values():
59+
var buf = Buffer.from_values[DType.int64](-3, 9, 81)
60+
61+
assert_equal(buf.unsafe_get[DType.int64](0), -3)
62+
assert_equal(buf.unsafe_get[DType.int64](1), 9)
63+
assert_equal(buf.unsafe_get[DType.int64](2), 81)
64+
65+
5866
def test_buffer_swap():
5967
var one = Buffer.alloc(10)
6068
one.unsafe_set(0, 111)

0 commit comments

Comments
 (0)