59 lines
1.8 KiB
Cython
59 lines
1.8 KiB
Cython
# Copyright 2013-2017 DataStax, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
"""
|
|
Simple buffer data structure that provides a view on existing memory
|
|
(e.g. from a bytes object). This memory must stay alive while the
|
|
buffer is in use.
|
|
"""
|
|
|
|
from cpython.bytes cimport PyBytes_AS_STRING
|
|
# char* PyBytes_AS_STRING(object string)
|
|
# Macro form of PyBytes_AsString() but without error
|
|
# checking. Only string objects are supported; no Unicode objects
|
|
# should be passed.
|
|
|
|
|
|
cdef struct Buffer:
|
|
char *ptr
|
|
Py_ssize_t size
|
|
|
|
|
|
cdef inline bytes to_bytes(Buffer *buf):
|
|
return buf.ptr[:buf.size]
|
|
|
|
cdef inline char *buf_ptr(Buffer *buf):
|
|
return buf.ptr
|
|
|
|
cdef inline char *buf_read(Buffer *buf, Py_ssize_t size) except NULL:
|
|
if size > buf.size:
|
|
raise IndexError("Requested more than length of buffer")
|
|
return buf.ptr
|
|
|
|
cdef inline int slice_buffer(Buffer *buf, Buffer *out,
|
|
Py_ssize_t start, Py_ssize_t size) except -1:
|
|
if size < 0:
|
|
raise ValueError("Length must be positive")
|
|
|
|
if start + size > buf.size:
|
|
raise IndexError("Buffer slice out of bounds")
|
|
|
|
out.ptr = buf.ptr + start
|
|
out.size = size
|
|
return 0
|
|
|
|
cdef inline void from_ptr_and_size(char *ptr, Py_ssize_t size, Buffer *out):
|
|
out.ptr = ptr
|
|
out.size = size
|