xnd 0.2.0dev3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CONTRIBUTING.md +42 -0
- data/Gemfile +3 -0
- data/History.md +0 -0
- data/README.md +7 -0
- data/Rakefile +135 -0
- data/ext/ruby_xnd/extconf.rb +70 -0
- data/ext/ruby_xnd/float_pack_unpack.c +277 -0
- data/ext/ruby_xnd/float_pack_unpack.h +39 -0
- data/ext/ruby_xnd/gc_guard.c +36 -0
- data/ext/ruby_xnd/gc_guard.h +12 -0
- data/ext/ruby_xnd/include/xnd.h +449 -0
- data/ext/ruby_xnd/lib/libxnd.a +0 -0
- data/ext/ruby_xnd/lib/libxnd.so +1 -0
- data/ext/ruby_xnd/lib/libxnd.so.0 +1 -0
- data/ext/ruby_xnd/lib/libxnd.so.0.2.0dev3 +0 -0
- data/ext/ruby_xnd/memory_block_object.c +32 -0
- data/ext/ruby_xnd/memory_block_object.h +33 -0
- data/ext/ruby_xnd/ruby_xnd.c +1953 -0
- data/ext/ruby_xnd/ruby_xnd.h +61 -0
- data/ext/ruby_xnd/ruby_xnd_internal.h +85 -0
- data/ext/ruby_xnd/util.h +170 -0
- data/ext/ruby_xnd/xnd/AUTHORS.txt +5 -0
- data/ext/ruby_xnd/xnd/INSTALL.txt +134 -0
- data/ext/ruby_xnd/xnd/LICENSE.txt +29 -0
- data/ext/ruby_xnd/xnd/MANIFEST.in +3 -0
- data/ext/ruby_xnd/xnd/Makefile.in +80 -0
- data/ext/ruby_xnd/xnd/README.rst +44 -0
- data/ext/ruby_xnd/xnd/config.guess +1530 -0
- data/ext/ruby_xnd/xnd/config.h.in +22 -0
- data/ext/ruby_xnd/xnd/config.sub +1782 -0
- data/ext/ruby_xnd/xnd/configure +4867 -0
- data/ext/ruby_xnd/xnd/configure.ac +164 -0
- data/ext/ruby_xnd/xnd/doc/Makefile +14 -0
- data/ext/ruby_xnd/xnd/doc/_static/copybutton.js +66 -0
- data/ext/ruby_xnd/xnd/doc/conf.py +26 -0
- data/ext/ruby_xnd/xnd/doc/index.rst +44 -0
- data/ext/ruby_xnd/xnd/doc/libxnd/data-structures.rst +186 -0
- data/ext/ruby_xnd/xnd/doc/libxnd/functions.rst +148 -0
- data/ext/ruby_xnd/xnd/doc/libxnd/index.rst +25 -0
- data/ext/ruby_xnd/xnd/doc/releases/index.rst +34 -0
- data/ext/ruby_xnd/xnd/doc/xnd/align-pack.rst +96 -0
- data/ext/ruby_xnd/xnd/doc/xnd/buffer-protocol.rst +42 -0
- data/ext/ruby_xnd/xnd/doc/xnd/index.rst +30 -0
- data/ext/ruby_xnd/xnd/doc/xnd/quickstart.rst +62 -0
- data/ext/ruby_xnd/xnd/doc/xnd/types.rst +674 -0
- data/ext/ruby_xnd/xnd/install-sh +527 -0
- data/ext/ruby_xnd/xnd/libxnd/Makefile.in +102 -0
- data/ext/ruby_xnd/xnd/libxnd/Makefile.vc +112 -0
- data/ext/ruby_xnd/xnd/libxnd/bitmaps.c +345 -0
- data/ext/ruby_xnd/xnd/libxnd/contrib.h +313 -0
- data/ext/ruby_xnd/xnd/libxnd/copy.c +944 -0
- data/ext/ruby_xnd/xnd/libxnd/equal.c +1216 -0
- data/ext/ruby_xnd/xnd/libxnd/inline.h +154 -0
- data/ext/ruby_xnd/xnd/libxnd/overflow.h +147 -0
- data/ext/ruby_xnd/xnd/libxnd/split.c +286 -0
- data/ext/ruby_xnd/xnd/libxnd/tests/Makefile.in +39 -0
- data/ext/ruby_xnd/xnd/libxnd/tests/Makefile.vc +44 -0
- data/ext/ruby_xnd/xnd/libxnd/tests/README.txt +2 -0
- data/ext/ruby_xnd/xnd/libxnd/tests/runtest.c +101 -0
- data/ext/ruby_xnd/xnd/libxnd/tests/test.h +48 -0
- data/ext/ruby_xnd/xnd/libxnd/tests/test_fixed.c +108 -0
- data/ext/ruby_xnd/xnd/libxnd/xnd.c +1304 -0
- data/ext/ruby_xnd/xnd/libxnd/xnd.h +449 -0
- data/ext/ruby_xnd/xnd/python/test_xnd.py +3144 -0
- data/ext/ruby_xnd/xnd/python/xnd/__init__.py +290 -0
- data/ext/ruby_xnd/xnd/python/xnd/_xnd.c +2822 -0
- data/ext/ruby_xnd/xnd/python/xnd/contrib/pretty.py +850 -0
- data/ext/ruby_xnd/xnd/python/xnd/docstrings.h +129 -0
- data/ext/ruby_xnd/xnd/python/xnd/pyxnd.h +200 -0
- data/ext/ruby_xnd/xnd/python/xnd/util.h +182 -0
- data/ext/ruby_xnd/xnd/python/xnd_randvalue.py +1121 -0
- data/ext/ruby_xnd/xnd/python/xnd_support.py +106 -0
- data/ext/ruby_xnd/xnd/setup.py +303 -0
- data/ext/ruby_xnd/xnd/vcbuild/INSTALL.txt +42 -0
- data/ext/ruby_xnd/xnd/vcbuild/runtest32.bat +16 -0
- data/ext/ruby_xnd/xnd/vcbuild/runtest64.bat +14 -0
- data/ext/ruby_xnd/xnd/vcbuild/vcbuild32.bat +29 -0
- data/ext/ruby_xnd/xnd/vcbuild/vcbuild64.bat +29 -0
- data/ext/ruby_xnd/xnd/vcbuild/vcclean.bat +13 -0
- data/ext/ruby_xnd/xnd/vcbuild/vcdistclean.bat +14 -0
- data/lib/ruby_xnd.so +0 -0
- data/lib/xnd.rb +306 -0
- data/lib/xnd/monkeys.rb +29 -0
- data/lib/xnd/version.rb +6 -0
- data/spec/debug_spec.rb +9 -0
- data/spec/gc_guard_spec.rb +10 -0
- data/spec/leakcheck.rb +9 -0
- data/spec/spec_helper.rb +877 -0
- data/spec/type_inference_spec.rb +81 -0
- data/spec/xnd_spec.rb +2921 -0
- data/xnd.gemspec +47 -0
- metadata +215 -0
@@ -0,0 +1,164 @@
|
|
1
|
+
|
2
|
+
AC_PREREQ([2.67])
|
3
|
+
AC_INIT(xnd, 0.2.0dev3, skrah@bytereef.org, xnd, https://github.com/plures/)
|
4
|
+
AC_CONFIG_HEADER(config.h)
|
5
|
+
AC_CONFIG_FILES([Makefile libxnd/Makefile libxnd/tests/Makefile])
|
6
|
+
|
7
|
+
# System and machine type (only used for Darwin):
|
8
|
+
AC_MSG_CHECKING(system as reported by uname -s)
|
9
|
+
ac_sys_system=`uname -s`
|
10
|
+
AC_MSG_RESULT($ac_sys_system)
|
11
|
+
|
12
|
+
LIBSTATIC=libxnd.a
|
13
|
+
case $ac_sys_system in
|
14
|
+
darwin*|Darwin*)
|
15
|
+
LIBRARY_PATH="DYLD_LIBRARY_PATH"
|
16
|
+
LIBNAME="libxnd.dylib"
|
17
|
+
LIBSONAME="libxnd.0.dylib"
|
18
|
+
LIBSHARED="libxnd.0.2.0dev3.dylib"
|
19
|
+
CONFIGURE_LDFLAGS="-dynamiclib -install_name @rpath/$LIBSONAME -undefined dynamic_lookup -compatibility_version 0.2 -current_version 0.2.0"
|
20
|
+
;;
|
21
|
+
*)
|
22
|
+
LIBRARY_PATH="LD_LIBRARY_PATH"
|
23
|
+
LIBNAME="libxnd.so"
|
24
|
+
LIBSONAME="libxnd.so.0"
|
25
|
+
LIBSHARED="libxnd.so.0.2.0dev3"
|
26
|
+
CONFIGURE_LDFLAGS="-shared -Wl,-soname,$LIBSONAME"
|
27
|
+
;;
|
28
|
+
esac
|
29
|
+
|
30
|
+
AC_SUBST(LIBSTATIC)
|
31
|
+
AC_SUBST(LIBRARY_PATH)
|
32
|
+
AC_SUBST(LIBNAME)
|
33
|
+
AC_SUBST(LIBSONAME)
|
34
|
+
AC_SUBST(LIBSHARED)
|
35
|
+
|
36
|
+
|
37
|
+
# Apparently purely informational for this particular build:
|
38
|
+
AC_CANONICAL_HOST
|
39
|
+
AC_SUBST(build)
|
40
|
+
AC_SUBST(host)
|
41
|
+
|
42
|
+
# Language and compiler:
|
43
|
+
AC_LANG_C
|
44
|
+
saved_cflags=$CFLAGS
|
45
|
+
AC_PROG_CC
|
46
|
+
CFLAGS=$saved_cflags
|
47
|
+
|
48
|
+
# ar and ranlib:
|
49
|
+
AC_CHECK_TOOL(AR, ar, ar)
|
50
|
+
AC_PROG_RANLIB
|
51
|
+
AC_SUBST(RANLIB)
|
52
|
+
|
53
|
+
|
54
|
+
# Checks for header files:
|
55
|
+
AC_HEADER_STDC
|
56
|
+
|
57
|
+
# Install program:
|
58
|
+
AC_PROG_INSTALL
|
59
|
+
AC_SUBST(INSTALL)
|
60
|
+
|
61
|
+
# Add an explicit include directory.
|
62
|
+
AC_MSG_CHECKING(for --with-includes)
|
63
|
+
AC_ARG_WITH(includes,
|
64
|
+
AS_HELP_STRING([--with-includes="/usr/local/include"],
|
65
|
+
[absolute path to an include directory]),
|
66
|
+
[],
|
67
|
+
[with_includes="none"])
|
68
|
+
|
69
|
+
AC_MSG_RESULT($with_includes)
|
70
|
+
|
71
|
+
if test "$with_includes" = "none"; then
|
72
|
+
CONFIGURE_INCLUDES=../ndtypes/libndtypes
|
73
|
+
CONFIGURE_INCLUDES_TEST=../../ndtypes/libndtypes
|
74
|
+
else
|
75
|
+
CONFIGURE_INCLUDES=$with_includes
|
76
|
+
CONFIGURE_INCLUDES_TEST=$with_includes
|
77
|
+
fi
|
78
|
+
|
79
|
+
AC_SUBST(CONFIGURE_INCLUDES)
|
80
|
+
AC_SUBST(CONFIGURE_INCLUDES_TEST)
|
81
|
+
|
82
|
+
# Add an explicit library path.
|
83
|
+
AC_MSG_CHECKING(for --with-libs)
|
84
|
+
AC_ARG_WITH(libs,
|
85
|
+
AS_HELP_STRING([--with-libs="/usr/local/lib"],
|
86
|
+
[absolute path to a library directory]),
|
87
|
+
[],
|
88
|
+
[with_libs="none"])
|
89
|
+
|
90
|
+
AC_MSG_RESULT($with_libs)
|
91
|
+
|
92
|
+
if test "$with_libs" = "none"; then
|
93
|
+
CONFIGURE_LIBS=../ndtypes/libndtypes
|
94
|
+
CONFIGURE_LIBS_TEST=../../ndtypes/libndtypes
|
95
|
+
else
|
96
|
+
CONFIGURE_LIBS=$with_libs
|
97
|
+
CONFIGURE_LIBS_TEST=$with_libs
|
98
|
+
fi
|
99
|
+
|
100
|
+
AC_SUBST(CONFIGURE_LIBS)
|
101
|
+
AC_SUBST(CONFIGURE_LIBS_TEST)
|
102
|
+
|
103
|
+
# Without documentation:
|
104
|
+
AC_MSG_CHECKING([for --with-docs])
|
105
|
+
AC_ARG_WITH([docs],
|
106
|
+
AS_HELP_STRING([--with-docs], [install documentation - enabled by default]),,
|
107
|
+
with_docs=yes)
|
108
|
+
AC_MSG_RESULT([$with_docs])
|
109
|
+
if test "$with_docs" = yes; then
|
110
|
+
NDT_INSTALL_DOCS="install_docs"
|
111
|
+
else
|
112
|
+
NDT_INSTALL_DOCS=""
|
113
|
+
fi
|
114
|
+
|
115
|
+
AC_SUBST(NDT_INSTALL_DOCS)
|
116
|
+
|
117
|
+
# Compiler dependent settings:
|
118
|
+
XND_WARN=
|
119
|
+
XND_OPT="-O2"
|
120
|
+
case $CC in
|
121
|
+
*gcc*)
|
122
|
+
XND_WARN="-Wall -Wextra -std=c11 -pedantic"
|
123
|
+
XND_OPT="-O2"
|
124
|
+
;;
|
125
|
+
*icc*)
|
126
|
+
AR=xiar
|
127
|
+
XND_WARN="-Wall"
|
128
|
+
XND_OPT="-O2"
|
129
|
+
;;
|
130
|
+
*clang*)
|
131
|
+
XND_WARN="-Wall -Wextra -std=c11 -pedantic"
|
132
|
+
XND_OPT="-O2"
|
133
|
+
;;
|
134
|
+
esac
|
135
|
+
|
136
|
+
|
137
|
+
|
138
|
+
# Substitute variables and generate output:
|
139
|
+
if test -z "$LD"; then
|
140
|
+
LD="$CC"
|
141
|
+
fi
|
142
|
+
AC_SUBST(LD)
|
143
|
+
AC_SUBST(AR)
|
144
|
+
AC_SUBST(XND_WARN)
|
145
|
+
AC_SUBST(XND_OPT)
|
146
|
+
|
147
|
+
|
148
|
+
if test -z "$CFLAGS"; then
|
149
|
+
CONFIGURE_CFLAGS="$XND_INCLUDE $XND_WARN $XND_CONFIG $XND_OPT"
|
150
|
+
else
|
151
|
+
CONFIGURE_CFLAGS="$XND_INCLUDE $XND_WARN $XND_CONFIG $XND_OPT $CFLAGS"
|
152
|
+
fi
|
153
|
+
|
154
|
+
if test -z "$LDFLAGS"; then
|
155
|
+
CONFIGURE_LDFLAGS="$XND_LINK $CONFIGURE_LDFLAGS"
|
156
|
+
else
|
157
|
+
CONFIGURE_LDFLAGS="$XND_LINK $CONFIGURE_LDFLAGS $LDFLAGS"
|
158
|
+
fi
|
159
|
+
|
160
|
+
AC_SUBST(CONFIGURE_CFLAGS)
|
161
|
+
AC_SUBST(CONFIGURE_LDFLAGS)
|
162
|
+
|
163
|
+
AC_OUTPUT
|
164
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Makefile for Sphinx documentation.
|
2
|
+
SPHINXBUILD = sphinx-build
|
3
|
+
BUILDDIR = build
|
4
|
+
|
5
|
+
default: html
|
6
|
+
|
7
|
+
html:
|
8
|
+
sphinx-build -b html -d build/doctrees . build/html
|
9
|
+
|
10
|
+
doctest:
|
11
|
+
sphinx-build -b doctest -d build/doctrees . build/html
|
12
|
+
|
13
|
+
clean:
|
14
|
+
rm -rf $(BUILDDIR)/*
|
@@ -0,0 +1,66 @@
|
|
1
|
+
// Copyright 2014 PSF. Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
|
2
|
+
// File originates from the cpython source found in Doc/tools/sphinxext/static/copybutton.js
|
3
|
+
|
4
|
+
$(document).ready(function() {
|
5
|
+
/* Add a [>>>] button on the top-right corner of code samples to hide
|
6
|
+
* the >>> and ... prompts and the output and thus make the code
|
7
|
+
* copyable. */
|
8
|
+
var div = $('.highlight-py .highlight,' +
|
9
|
+
'.highlight-default .highlight,' +
|
10
|
+
'.highlight-py3 .highlight')
|
11
|
+
var pre = div.find('pre');
|
12
|
+
|
13
|
+
// get the styles from the current theme
|
14
|
+
pre.parent().parent().css('position', 'relative');
|
15
|
+
var hide_text = 'Hide the prompts and output';
|
16
|
+
var show_text = 'Show the prompts and output';
|
17
|
+
var border_width = pre.css('border-top-width');
|
18
|
+
var border_style = pre.css('border-top-style');
|
19
|
+
var border_color = pre.css('border-top-color');
|
20
|
+
var button_styles = {
|
21
|
+
'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0',
|
22
|
+
'border-color': border_color, 'border-style': border_style,
|
23
|
+
'border-width': border_width, 'color': border_color, 'text-size': '75%',
|
24
|
+
'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '0.2em',
|
25
|
+
'border-radius': '0 3px 0 0'
|
26
|
+
}
|
27
|
+
|
28
|
+
// create and add the button to all the code blocks that contain >>>
|
29
|
+
div.each(function(index) {
|
30
|
+
var jthis = $(this);
|
31
|
+
if (jthis.find('.gp').length > 0) {
|
32
|
+
var button = $('<span class="copybutton">>>></span>');
|
33
|
+
button.css(button_styles)
|
34
|
+
button.attr('title', hide_text);
|
35
|
+
button.data('hidden', 'false');
|
36
|
+
jthis.prepend(button);
|
37
|
+
}
|
38
|
+
// tracebacks (.gt) contain bare text elements that need to be
|
39
|
+
// wrapped in a span to work with .nextUntil() (see later)
|
40
|
+
jthis.find('pre:has(.gt)').contents().filter(function() {
|
41
|
+
return ((this.nodeType == 3) && (this.data.trim().length > 0));
|
42
|
+
}).wrap('<span>');
|
43
|
+
});
|
44
|
+
|
45
|
+
// define the behavior of the button when it's clicked
|
46
|
+
$('.copybutton').click(function(e){
|
47
|
+
e.preventDefault();
|
48
|
+
var button = $(this);
|
49
|
+
if (button.data('hidden') === 'false') {
|
50
|
+
// hide the code output
|
51
|
+
button.parent().find('.go, .gp, .gt').hide();
|
52
|
+
button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden');
|
53
|
+
button.css('text-decoration', 'line-through');
|
54
|
+
button.attr('title', show_text);
|
55
|
+
button.data('hidden', 'true');
|
56
|
+
} else {
|
57
|
+
// show the code output
|
58
|
+
button.parent().find('.go, .gp, .gt').show();
|
59
|
+
button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible');
|
60
|
+
button.css('text-decoration', 'none');
|
61
|
+
button.attr('title', hide_text);
|
62
|
+
button.data('hidden', 'false');
|
63
|
+
}
|
64
|
+
});
|
65
|
+
});
|
66
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
import sys, os, docutils
|
2
|
+
|
3
|
+
|
4
|
+
extensions = ['sphinx.ext.intersphinx', 'sphinx.ext.doctest']
|
5
|
+
|
6
|
+
source_suffix = '.rst'
|
7
|
+
master_doc = 'index'
|
8
|
+
project = 'xnd'
|
9
|
+
copyright = '2017-2018, Plures Project'
|
10
|
+
version = 'v0.2.0dev3'
|
11
|
+
release = 'v0.2.0dev3'
|
12
|
+
exclude_patterns = ['doc', 'build']
|
13
|
+
pygments_style = 'sphinx'
|
14
|
+
html_static_path = ['_static']
|
15
|
+
|
16
|
+
primary_domain = 'py'
|
17
|
+
add_function_parentheses = False
|
18
|
+
|
19
|
+
|
20
|
+
def setup(app):
|
21
|
+
app.add_crossref_type('topic', 'topic', 'single: %s',
|
22
|
+
docutils.nodes.strong)
|
23
|
+
app.add_javascript("copybutton.js")
|
24
|
+
|
25
|
+
|
26
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
.. meta::
|
2
|
+
:robots: index, follow
|
3
|
+
:description: xnd documentation
|
4
|
+
:keywords: libxnd, xnd, C, Python, array computing
|
5
|
+
|
6
|
+
.. sectionauthor:: Stefan Krah <skrah at bytereef.org>
|
7
|
+
|
8
|
+
|
9
|
+
xnd
|
10
|
+
===
|
11
|
+
|
12
|
+
xnd is a package for typed memory blocks.
|
13
|
+
|
14
|
+
|
15
|
+
Libxnd
|
16
|
+
------
|
17
|
+
|
18
|
+
C library.
|
19
|
+
|
20
|
+
.. toctree::
|
21
|
+
:maxdepth: 1
|
22
|
+
|
23
|
+
libxnd/index.rst
|
24
|
+
|
25
|
+
|
26
|
+
Xnd
|
27
|
+
---
|
28
|
+
|
29
|
+
Python module.
|
30
|
+
|
31
|
+
|
32
|
+
.. toctree::
|
33
|
+
:maxdepth: 1
|
34
|
+
|
35
|
+
xnd/index.rst
|
36
|
+
|
37
|
+
|
38
|
+
Releases
|
39
|
+
--------
|
40
|
+
|
41
|
+
.. toctree::
|
42
|
+
:maxdepth: 1
|
43
|
+
|
44
|
+
releases/index.rst
|
@@ -0,0 +1,186 @@
|
|
1
|
+
.. meta::
|
2
|
+
:robots: index,follow
|
3
|
+
:description: libxnd documentation
|
4
|
+
|
5
|
+
.. sectionauthor:: Stefan Krah <skrah at bytereef.org>
|
6
|
+
|
7
|
+
|
8
|
+
Data structures
|
9
|
+
===============
|
10
|
+
|
11
|
+
libxnd is a lightweight container library that leaves most of the work to
|
12
|
+
libndtypes. The underlying idea is to have a small struct that contains
|
13
|
+
bitmaps, a linear index, a type and a data pointer.
|
14
|
+
|
15
|
+
The type contains all low level access information.
|
16
|
+
|
17
|
+
Since the struct is small, it can easily be passed around by value when
|
18
|
+
it serves as a view on the data.
|
19
|
+
|
20
|
+
The owner of the data is a master buffer with some additional bookkeeping
|
21
|
+
fields.
|
22
|
+
|
23
|
+
|
24
|
+
Bitmaps
|
25
|
+
-------
|
26
|
+
|
27
|
+
.. topic:: bitmaps
|
28
|
+
|
29
|
+
.. code-block:: c
|
30
|
+
|
31
|
+
typedef struct xnd_bitmap xnd_bitmap_t;
|
32
|
+
|
33
|
+
struct xnd_bitmap {
|
34
|
+
uint8_t *data; /* bitmap */
|
35
|
+
int64_t size; /* number of subtree bitmaps in the "next" array */
|
36
|
+
xnd_bitmap_t *next; /* array of bitmaps for subtrees */
|
37
|
+
};
|
38
|
+
|
39
|
+
libxnd supports data with optional values. Any type can have a bitmap for its
|
40
|
+
data. Bitmaps are addressed using the linear index in the :c:macro:`xnd_t`
|
41
|
+
struct.
|
42
|
+
|
43
|
+
For a scalar, the bitmap contains just one addressable bit.
|
44
|
+
|
45
|
+
For fixed and variable arrays, the bitmap contains one bit for each item.
|
46
|
+
|
47
|
+
Container types like tuples and records have new bitmaps for each of their
|
48
|
+
fields if any of the field subtrees contains optional data.
|
49
|
+
|
50
|
+
These field bitmaps are in the *next* array.
|
51
|
+
|
52
|
+
|
53
|
+
View
|
54
|
+
----
|
55
|
+
|
56
|
+
.. topic:: xnd_view
|
57
|
+
|
58
|
+
.. code-block:: c
|
59
|
+
|
60
|
+
|
61
|
+
/* Typed memory block, usually a view. */
|
62
|
+
typedef struct xnd {
|
63
|
+
xnd_bitmap_t bitmap; /* bitmap tree */
|
64
|
+
int64_t index; /* linear index for var dims */
|
65
|
+
const ndt_t *type; /* type of the data */
|
66
|
+
char *ptr; /* data */
|
67
|
+
} xnd_t;
|
68
|
+
|
69
|
+
This is the xnd view, with a typed data pointer, the current linear index
|
70
|
+
and a bitmap.
|
71
|
+
|
72
|
+
When passing the view around, the linear index needs to be maintained because
|
73
|
+
it is required to determine if a value is missing (NA).
|
74
|
+
|
75
|
+
The convention is to apply the linear index (adjust the *ptr* and set it
|
76
|
+
to *0*) only when a non-optional element at *ndim == 0* is actually
|
77
|
+
accessed.
|
78
|
+
|
79
|
+
This happens for example when getting the value of an element or when
|
80
|
+
descending into a record.
|
81
|
+
|
82
|
+
|
83
|
+
Flags
|
84
|
+
-----
|
85
|
+
|
86
|
+
.. topic:: flags
|
87
|
+
|
88
|
+
.. code-block:: c
|
89
|
+
|
90
|
+
#define XND_OWN_TYPE 0x00000001U /* type pointer */
|
91
|
+
#define XND_OWN_DATA 0x00000002U /* data pointer */
|
92
|
+
#define XND_OWN_STRINGS 0x00000004U /* embedded string pointers */
|
93
|
+
#define XND_OWN_BYTES 0x00000008U /* embedded bytes pointers */
|
94
|
+
#define XND_OWN_POINTERS 0x00000010U /* embedded pointers */
|
95
|
+
|
96
|
+
#define XND_OWN_ALL (XND_OWN_TYPE | \
|
97
|
+
XND_OWN_DATA | \
|
98
|
+
XND_OWN_STRINGS | \
|
99
|
+
XND_OWN_BYTES | \
|
100
|
+
XND_OWN_POINTERS)
|
101
|
+
|
102
|
+
#define XND_OWN_EMBEDDED (XND_OWN_DATA | \
|
103
|
+
XND_OWN_STRINGS | \
|
104
|
+
XND_OWN_BYTES | \
|
105
|
+
XND_OWN_POINTERS)
|
106
|
+
|
107
|
+
|
108
|
+
The ownership flags for the xnd master buffer (see below). Like libndtypes,
|
109
|
+
libxnd itself has no notion of how many exported views a master buffer has.
|
110
|
+
|
111
|
+
This is deliberately done in order to prevent two different memory management
|
112
|
+
schemes from getting in each other's way.
|
113
|
+
|
114
|
+
However, for deallocating a master buffer the flags must be set correctly.
|
115
|
+
|
116
|
+
:c:macro:`XND_OWN_TYPE` is set if the master buffer owns the :c:macro:`ndt_t`.
|
117
|
+
|
118
|
+
:c:macro:`XND_OWN_DATA` is set if the master buffer owns the data pointer.
|
119
|
+
|
120
|
+
|
121
|
+
The *string*, *bytes* and *ref* types have pointers that are embedded in the
|
122
|
+
data. Usually, these are owned and deallocated by libxnd.
|
123
|
+
|
124
|
+
For strings, the Python bindings use the convention that :c:macro:`NULL` strings
|
125
|
+
are interpreted as the empty string. Once a string pointer is initialized it
|
126
|
+
belongs to the master buffer.
|
127
|
+
|
128
|
+
|
129
|
+
Macros
|
130
|
+
------
|
131
|
+
|
132
|
+
.. topic:: macros
|
133
|
+
|
134
|
+
.. code-block:: c
|
135
|
+
|
136
|
+
/* Convenience macros to extract embedded values. */
|
137
|
+
#define XND_POINTER_DATA(ptr) (*((char **)ptr))
|
138
|
+
#define XND_BYTES_SIZE(ptr) (((ndt_bytes_t *)ptr)->size)
|
139
|
+
#define XND_BYTES_DATA(ptr) (((ndt_bytes_t *)ptr)->data)
|
140
|
+
|
141
|
+
These macros should be used to extract embedded *ref*, *string* and *bytes*
|
142
|
+
data.
|
143
|
+
|
144
|
+
|
145
|
+
|
146
|
+
Master buffer
|
147
|
+
-------------
|
148
|
+
|
149
|
+
.. topic:: xnd_master
|
150
|
+
|
151
|
+
.. code-block:: c
|
152
|
+
|
153
|
+
/* Master memory block. */
|
154
|
+
typedef struct xnd_master {
|
155
|
+
uint32_t flags; /* ownership flags */
|
156
|
+
xnd_t master; /* typed memory */
|
157
|
+
} xnd_master_t;
|
158
|
+
|
159
|
+
This is the master buffer. *flags* are explained above, the *master* buffer
|
160
|
+
should be considered constant.
|
161
|
+
|
162
|
+
For traversing memory, copy a new view buffer by value.
|
163
|
+
|
164
|
+
|
165
|
+
Slice and index keys
|
166
|
+
--------------------
|
167
|
+
|
168
|
+
.. topic:: xnd_key
|
169
|
+
|
170
|
+
.. code-block:: c
|
171
|
+
|
172
|
+
enum xnd_key { Index, FieldName, Slice };
|
173
|
+
typedef struct {
|
174
|
+
enum xnd_key tag;
|
175
|
+
union {
|
176
|
+
int64_t Index;
|
177
|
+
const char *FieldName;
|
178
|
+
ndt_slice_t Slice;
|
179
|
+
};
|
180
|
+
} xnd_index_t;
|
181
|
+
|
182
|
+
Slicing and indexing uses the same model as Python. Indices are usually
|
183
|
+
integers, but record fields may also be indexed with field names.
|
184
|
+
|
185
|
+
*ndt_slice_t* has *start*, *stop*, *step* fields that must be filled in with
|
186
|
+
normalized values following the same protocol as :c:func:`PySlice_Unpack`.
|