from .lib import TestBase | |
class TestTutorial(TestBase): | |
def test_example(self): | |
# Memory Managers | |
################## | |
import smmap | |
# This instance should be globally available in your application | |
# It is configured to be well suitable for 32-bit or 64 bit applications. | |
mman = smmap.SlidingWindowMapManager() | |
# the manager provides much useful information about its current state | |
# like the amount of open file handles or the amount of mapped memory | |
assert mman.num_file_handles() == 0 | |
assert mman.mapped_memory_size() == 0 | |
# and many more ... | |
# Cursors | |
########## | |
import smmap.test.lib | |
with smmap.test.lib.FileCreator(1024 * 1024 * 8, "test_file") as fc: | |
# obtain a cursor to access some file. | |
c = mman.make_cursor(fc.path) | |
# the cursor is now associated with the file, but not yet usable | |
assert c.is_associated() | |
assert not c.is_valid() | |
# before you can use the cursor, you have to specify a window you want to | |
# access. The following just says you want as much data as possible starting | |
# from offset 0. | |
# To be sure your region could be mapped, query for validity | |
assert c.use_region().is_valid() # use_region returns self | |
# once a region was mapped, you must query its dimension regularly | |
# to assure you don't try to access its buffer out of its bounds | |
assert c.size() | |
c.buffer()[0] # first byte | |
c.buffer()[1:10] # first 9 bytes | |
c.buffer()[c.size() - 1] # last byte | |
# you can query absolute offsets, and check whether an offset is included | |
# in the cursor's data. | |
assert c.ofs_begin() < c.ofs_end() | |
assert c.includes_ofs(100) | |
# If you are over out of bounds with one of your region requests, the | |
# cursor will be come invalid. It cannot be used in that state | |
assert not c.use_region(fc.size, 100).is_valid() | |
# map as much as possible after skipping the first 100 bytes | |
assert c.use_region(100).is_valid() | |
# You can explicitly free cursor resources by unusing the cursor's region | |
c.unuse_region() | |
assert not c.is_valid() | |
# Buffers | |
######### | |
# Create a default buffer which can operate on the whole file | |
buf = smmap.SlidingWindowMapBuffer(mman.make_cursor(fc.path)) | |
# you can use it right away | |
assert buf.cursor().is_valid() | |
buf[0] # access the first byte | |
buf[-1] # access the last ten bytes on the file | |
buf[-10:] # access the last ten bytes | |
# If you want to keep the instance between different accesses, use the | |
# dedicated methods | |
buf.end_access() | |
assert not buf.cursor().is_valid() # you cannot use the buffer anymore | |
assert buf.begin_access(offset=10) # start using the buffer at an offset | |