Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions tests/test_buffer.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
# ########################################### #

import numpy as np
import pytest

import xobjects as xo
from xobjects.test_helpers import for_all_test_contexts, requires_context
Expand Down Expand Up @@ -94,6 +95,35 @@ def test_free_simple(test_context):
ch.free_string(offset)
ch.check()

@for_all_test_contexts
def test_free(test_context):
class CheckFree(xo.Struct):
a = xo.Float64
ch = CheckFree(a=5, _context=test_context)
assert ch._buffer.capacity == 8
assert ch._buffer.chunks == []
with pytest.raises(ValueError, match="Cannot free outside of buffer"):
ch._buffer.free(-2, 8)
with pytest.raises(ValueError, match="Cannot free outside of buffer"):
ch._buffer.free(0, 10)
with pytest.raises(ValueError, match="Cannot free outside of buffer"):
ch._buffer.free(7,2)
ch._buffer.free(0,4)
assert len(ch._buffer.chunks) == 1
assert ch._buffer.chunks[0].start == 0
assert ch._buffer.chunks[0].end == 4
ch._buffer.free(0,4) # Does nothing
ch._buffer.free(2,4) # Increases free chunk
assert len(ch._buffer.chunks) == 1
assert ch._buffer.chunks[0].start == 0
assert ch._buffer.chunks[0].end == 6
ch._buffer.free(7,1)
assert len(ch._buffer.chunks) == 2
assert ch._buffer.chunks[0].start == 0
assert ch._buffer.chunks[0].end == 6
assert ch._buffer.chunks[1].start == 7
assert ch._buffer.chunks[1].end == 8


@for_all_test_contexts
def test_grow(test_context):
Expand Down
6 changes: 5 additions & 1 deletion xobjects/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -472,9 +472,13 @@ def grow(self, capacity):
self.capacity = newcapacity

def free(self, offset, size):
if offset < 0 or offset + size > self.capacity:
raise ValueError("Cannot free outside of buffer")
nch = Chunk(offset, offset + size)
# insert sorted
if offset > self.chunks[-1].start: # new chuck at the end
if len(self.chunks) == 0:
self.chunks.append(nch)
elif offset > self.chunks[-1].start: # new chuck at the end
self.chunks.append(nch)
else: # new chuck needs to be inserted
for ic, ch in enumerate(self.chunks):
Expand Down
Loading