Alien-SVN
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
src/subversion/subversion/bindings/ctypes-python/csvn/types.py view on Meta::CPAN
def __iter__(self):
for (key, _) in self.items():
yield key
def items(self):
pool = Pool()
hi = apr_hash_first(pool, self)
while hi:
key_vp = c_void_p()
val_vp = c_void_p()
apr_hash_this(hi, byref(key_vp), None, byref(val_vp))
val = cast(val_vp, self.type)
if self.wrapper:
val = self.wrapper.from_param(val)
yield (string_at(key_vp), val)
hi = apr_hash_next(hi)
def __len__(self):
return int(apr_hash_count(self))
def byref(self):
return byref(self._as_parameter_)
def pointer(self):
return pointer(self._as_parameter_)
_as_parameter_ = property(fget=lambda self: self.hash)
class Array(ListMixin):
"""An array wrapper for apr_array_header_t"""
def __init__(self, type, items=None, size=0):
self.type = type
self.pool = Pool()
if not items:
self.header = apr_array_make(self.pool, size, sizeof(type))
elif isinstance(items, POINTER(apr_array_header_t)):
self.header = items
elif isinstance(items, Array):
self.header = apr_array_copy(self.pool, items)
else:
self.header = apr_array_make(self.pool, len(items),
sizeof(type))
self.extend(items)
_as_parameter_ = property(fget=lambda self: self.header)
elts = property(fget=lambda self: cast(self.header[0].elts.raw,
POINTER(self.type)))
def _get_element(self, i):
return self.elts[i]
def _set_element(self, i, value):
self.elts[i] = value
def __len__(self):
return self.header[0].nelts
def _resize_region(self, start, end, new_size):
diff = start-end+new_size
# Growing
if diff > 0:
l = len(self)
# Make space for the new items
for i in range(diff):
apr_array_push(self)
# Move the old items out of the way, if necessary
if end < l:
src_idx = max(end-diff,0)
memmove(byref(self.elts + end),
byref(self.elts[src_idx]),
(l-src_idx)*self.header[0].elt_size)
# Shrinking
elif diff < 0:
# Overwrite the deleted items with items we still need
if end < len(self):
memmove(byref(self.elts[end+diff]),
byref(self.elts[end]),
(len(self)-end)*self.header[0].elt_size)
# Shrink the array
for i in range(-diff):
apr_array_pop(self)
try:
# On Windows we need to do some magic to get the os-level file handle
from msvcrt import get_osfhandle
except ImportError:
get_osfhandle = lambda fileno: fileno
class APRFile(object):
"""Wrap a Python file-like object as an APR File"""
def __init__(self, pyfile):
self.pyfile = pyfile
self.pool = Pool()
self._as_parameter_ = POINTER(apr_file_t)()
self.tempfile = None
if hasattr(pyfile, "fileno"):
# Looks like this is a real file. We can just write
# directly to said file
osfile = apr_os_file_t(get_osfhandle(pyfile.fileno()))
else:
# Looks like this is a StringIO buffer or a fake file.
# Write to a temporary file and copy the output to the
# buffer when we are closed or flushed
self.tempfile = TemporaryFile()
osfile = apr_os_file_t(get_osfhandle(self.tempfile.fileno()))
apr_os_file_put(byref(self._as_parameter_), byref(osfile),
APR_CREATE | APR_WRITE | APR_BINARY, self.pool)
def flush(self):
"""Flush output to the underlying Python object"""
if self.tempfile:
self.tempfile.seek(0)
view all matches for this distributionview release on metacpan - search on metacpan
( run in 4.270 seconds using v1.00-cache-2.02-grep-82fe00e-cpan-f5108d614456 )