ndtypes 0.2.0dev4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CONTRIBUTING.md +50 -0
- data/Gemfile +2 -0
- data/History.md +0 -0
- data/README.md +19 -0
- data/Rakefile +125 -0
- data/ext/ruby_ndtypes/extconf.rb +55 -0
- data/ext/ruby_ndtypes/gc_guard.c +36 -0
- data/ext/ruby_ndtypes/gc_guard.h +12 -0
- data/ext/ruby_ndtypes/ndtypes/AUTHORS.txt +5 -0
- data/ext/ruby_ndtypes/ndtypes/INSTALL.txt +101 -0
- data/ext/ruby_ndtypes/ndtypes/LICENSE.txt +29 -0
- data/ext/ruby_ndtypes/ndtypes/MANIFEST.in +3 -0
- data/ext/ruby_ndtypes/ndtypes/Makefile.in +87 -0
- data/ext/ruby_ndtypes/ndtypes/README.rst +47 -0
- data/ext/ruby_ndtypes/ndtypes/config.guess +1530 -0
- data/ext/ruby_ndtypes/ndtypes/config.h.in +67 -0
- data/ext/ruby_ndtypes/ndtypes/config.sub +1782 -0
- data/ext/ruby_ndtypes/ndtypes/configure +5260 -0
- data/ext/ruby_ndtypes/ndtypes/configure.ac +161 -0
- data/ext/ruby_ndtypes/ndtypes/doc/Makefile +14 -0
- data/ext/ruby_ndtypes/ndtypes/doc/_static/copybutton.js +66 -0
- data/ext/ruby_ndtypes/ndtypes/doc/conf.py +26 -0
- data/ext/ruby_ndtypes/ndtypes/doc/grammar/grammar.rst +27 -0
- data/ext/ruby_ndtypes/ndtypes/doc/index.rst +56 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/context.rst +131 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/encodings.rst +68 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/fields-values.rst +175 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/functions.rst +72 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/index.rst +43 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/init.rst +48 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/io.rst +100 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/memory.rst +124 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/predicates.rst +110 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/typedef.rst +31 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/types.rst +594 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/util.rst +166 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/buffer-protocol.rst +27 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/index.rst +21 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/pattern-matching.rst +330 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/quickstart.rst +144 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/types.rst +544 -0
- data/ext/ruby_ndtypes/ndtypes/doc/releases/index.rst +35 -0
- data/ext/ruby_ndtypes/ndtypes/install-sh +527 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.in +271 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.vc +269 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/alloc.c +230 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/attr.c +268 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/attr.h +109 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/Makefile.in +73 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/Makefile.vc +70 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/README.txt +16 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.c +2179 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.h +134 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.y +428 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.c +2543 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.h +735 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.l +176 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/export.c +543 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/import.c +110 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/context.c +228 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/copy.c +634 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/encodings.c +116 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/equal.c +288 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.c +3067 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.h +180 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.y +417 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/io.c +1658 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.c +2773 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.h +734 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.l +222 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/match.c +1132 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.c +2323 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.h.in +893 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/overflow.h +161 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.c +473 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.h +92 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parser.c +246 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.c +269 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.h +197 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/Makefile.in +48 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/Makefile.vc +46 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/deserialize.c +1007 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/serialize.c +442 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/slice.h +42 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.c +238 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.h +50 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.c +371 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.h +100 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.in +55 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.vc +45 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/alloc_fail.c +82 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/alloc_fail.h +49 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/runtest.c +1657 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test.h +85 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_array.c +115 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_buffer.c +137 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_indent.c +201 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_match.c +2397 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_numba.c +57 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse.c +349 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_error.c +27839 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_roundtrip.c +350 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_record.c +231 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_typecheck.c +375 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_typedef.c +65 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/valgrind.supp +30 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tools/bench.c +79 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tools/indent.c +94 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tools/print_ast.c +96 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/util.c +474 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/values.c +228 -0
- data/ext/ruby_ndtypes/ndtypes/python/bench.py +49 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndt_randtype.py +409 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndt_support.py +14 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/__init__.py +70 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/_ndtypes.c +1332 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/docstrings.h +319 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/pyndtypes.h +154 -0
- data/ext/ruby_ndtypes/ndtypes/python/test_ndtypes.py +1977 -0
- data/ext/ruby_ndtypes/ndtypes/setup.py +288 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/INSTALL.txt +41 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/runtest32.bat +15 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/runtest64.bat +13 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/vcbuild32.bat +38 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/vcbuild64.bat +38 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/vcclean.bat +13 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/vcdistclean.bat +14 -0
- data/ext/ruby_ndtypes/ruby_ndtypes.c +1003 -0
- data/ext/ruby_ndtypes/ruby_ndtypes.h +37 -0
- data/ext/ruby_ndtypes/ruby_ndtypes_internal.h +28 -0
- data/lib/ndtypes.rb +45 -0
- data/lib/ndtypes/errors.rb +2 -0
- data/lib/ndtypes/version.rb +6 -0
- data/ndtypes.gemspec +47 -0
- data/spec/gc_table_spec.rb +10 -0
- data/spec/ndtypes_spec.rb +289 -0
- data/spec/spec_helper.rb +241 -0
- metadata +242 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
.. meta::
|
|
2
|
+
:robots: index,follow
|
|
3
|
+
:description: libndtypes documentation
|
|
4
|
+
|
|
5
|
+
.. sectionauthor:: Stefan Krah <skrah at bytereef.org>
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Memory handling
|
|
9
|
+
===============
|
|
10
|
+
|
|
11
|
+
Type allocation and deallocation
|
|
12
|
+
--------------------------------
|
|
13
|
+
|
|
14
|
+
.. code-block:: c
|
|
15
|
+
|
|
16
|
+
ndt_t *ndt_new(enum ndt tag, ndt_context_t *ctx);
|
|
17
|
+
|
|
18
|
+
Allocate a new type according to *tag* with the common fields initialized to
|
|
19
|
+
the default values.
|
|
20
|
+
|
|
21
|
+
Most types need additional initialization, so this function is rarely used
|
|
22
|
+
on its own.
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
.. code-block:: c
|
|
26
|
+
|
|
27
|
+
ndt_t *ndt_tuple_new(enum ndt_variadic flag, int64_t shape, ndt_context_t *ctx);
|
|
28
|
+
ndt_t *ndt_record_new(enum ndt_variadic flag, int64_t shape, ndt_context_t *ctx);
|
|
29
|
+
|
|
30
|
+
Allocate a new tuple or record type. Because of their internal complexity
|
|
31
|
+
these types have dedicated allocation functions.
|
|
32
|
+
|
|
33
|
+
As above, the functions are never used outside of wrapper functions.
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
.. code-block:: c
|
|
37
|
+
|
|
38
|
+
void ndt_del(ndt_t *t);
|
|
39
|
+
|
|
40
|
+
Deallocate a type. *t* may be :c:macro:`NULL`. This function is meant to
|
|
41
|
+
be used by applications directly.
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
Custom allocators
|
|
45
|
+
-----------------
|
|
46
|
+
|
|
47
|
+
.. code-block:: c
|
|
48
|
+
|
|
49
|
+
extern void *(* ndt_mallocfunc)(size_t size);
|
|
50
|
+
extern void *(* ndt_callocfunc)(size_t nmemb, size_t size);
|
|
51
|
+
extern void *(* ndt_reallocfunc)(void *ptr, size_t size);
|
|
52
|
+
extern void (* ndt_freefunc)(void *ptr);
|
|
53
|
+
|
|
54
|
+
libndtypes allows applications to set custom allocators at program start.
|
|
55
|
+
By default these global variables are set to the usual libc allocators.
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
Allocation/deallocation
|
|
59
|
+
-----------------------
|
|
60
|
+
|
|
61
|
+
.. code-block:: c
|
|
62
|
+
|
|
63
|
+
void *ndt_alloc(int64_t nmemb, int64_t size);
|
|
64
|
+
|
|
65
|
+
Allocate *nmemb \* size* bytes, using the function set in the custom allocator.
|
|
66
|
+
|
|
67
|
+
Overflow in the multiplication is checked. Return :c:macro:`NULL` on overflow
|
|
68
|
+
or if the allocation fails.
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
.. code-block:: c
|
|
72
|
+
|
|
73
|
+
void *ndt_alloc_size(size_t size);
|
|
74
|
+
|
|
75
|
+
Allocate *size* bytes, using the function set in the custom allocator.
|
|
76
|
+
|
|
77
|
+
Return :c:macro:`NULL` on overflow or if the allocation fails.
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
.. code-block:: c
|
|
81
|
+
|
|
82
|
+
void *ndt_calloc(int64_t nmemb, int64_t size);
|
|
83
|
+
|
|
84
|
+
Allocate *nmemb \* size* zero-initialized bytes, using the function set in the custom
|
|
85
|
+
allocator.
|
|
86
|
+
|
|
87
|
+
Return :c:macro:`NULL` if the allocation fails.
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
.. code-block:: c
|
|
91
|
+
|
|
92
|
+
void *ndt_realloc(void *ptr, int64_t nmemb, int64_t size);
|
|
93
|
+
|
|
94
|
+
Reallocate *ptr* to use *nmemb \* size* bytes.
|
|
95
|
+
|
|
96
|
+
Return :c:macro:`NULL` on overflow or if the allocation fails. As usual, *ptr*
|
|
97
|
+
is still valid after failure.
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
.. code-block:: c
|
|
101
|
+
|
|
102
|
+
void ndt_free(void *ptr);
|
|
103
|
+
|
|
104
|
+
Free a pointer allocated by one of the above functions. *ptr* may be
|
|
105
|
+
:c:macro:`NULL` if the custom allocator allows this -- the C Standard
|
|
106
|
+
requires :func:`free` to accept :c:macro:`NULL`.
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
Aligned allocation/deallocation
|
|
110
|
+
-------------------------------
|
|
111
|
+
|
|
112
|
+
.. code-block:: c
|
|
113
|
+
|
|
114
|
+
void *ndt_aligned_calloc(uint16_t alignment, int64_t size);
|
|
115
|
+
|
|
116
|
+
Allocate *size* bytes with a guaranteed *alignment*.
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
.. code-block:: c
|
|
120
|
+
|
|
121
|
+
void ndt_aligned_free(void *ptr);
|
|
122
|
+
|
|
123
|
+
Free a pointer that was allocated by :func:`ndt_aligned_calloc`. *ptr*
|
|
124
|
+
may be :c:macro:`NULL`.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
.. meta::
|
|
2
|
+
:robots: index,follow
|
|
3
|
+
:description: libndtypes documentation
|
|
4
|
+
|
|
5
|
+
.. sectionauthor:: Stefan Krah <skrah at bytereef.org>
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Predicates
|
|
9
|
+
==========
|
|
10
|
+
|
|
11
|
+
libndtypes has a number of type predicates.
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
.. topic:: ndt_is_abstract
|
|
15
|
+
.. topic:: ndt_is_concrete
|
|
16
|
+
|
|
17
|
+
.. code-block:: c
|
|
18
|
+
|
|
19
|
+
int ndt_is_abstract(const ndt_t *t);
|
|
20
|
+
int ndt_is_concrete(const ndt_t *t);
|
|
21
|
+
|
|
22
|
+
Determine whether a type is abstract or concrete. These functions need
|
|
23
|
+
to be called to check whether the concrete type fields are defined.
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
.. topic:: ndt_is_optional
|
|
27
|
+
|
|
28
|
+
.. code-block:: c
|
|
29
|
+
|
|
30
|
+
int ndt_is_optional(const ndt_t *t);
|
|
31
|
+
|
|
32
|
+
Check if a type is optional.
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
.. topic:: ndt_subtree_is_optional
|
|
36
|
+
|
|
37
|
+
.. code-block:: c
|
|
38
|
+
|
|
39
|
+
int ndt_subtree_is_optional(const ndt_t *t);
|
|
40
|
+
|
|
41
|
+
Check if a subtree of a type is optional. This is useful for deciding if
|
|
42
|
+
bitmaps need to be allocated for subtrees.
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
.. topic:: ndt_is_ndarray
|
|
46
|
+
|
|
47
|
+
.. code-block:: c
|
|
48
|
+
|
|
49
|
+
int ndt_is_ndarray(const ndt_t *t);
|
|
50
|
+
|
|
51
|
+
Check if a type describes an n-dimensional (n > 0) array of fixed dimensions.
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
.. topic:: ndt_is_c_contiguous
|
|
55
|
+
.. topic:: ndt_is_f_contiguous
|
|
56
|
+
|
|
57
|
+
.. code-block:: c
|
|
58
|
+
|
|
59
|
+
int ndt_is_c_contiguous(const ndt_t *t);
|
|
60
|
+
int ndt_is_f_contiguous(const ndt_t *t);
|
|
61
|
+
|
|
62
|
+
Check if a type is an n-dimensional (n > 0) contiguous C or Fortran
|
|
63
|
+
array. Currently this returns 0 for scalars.
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
.. topic:: ndt_is_scalar
|
|
67
|
+
|
|
68
|
+
.. code-block:: c
|
|
69
|
+
|
|
70
|
+
int ndt_is_scalar(const ndt_t *t);
|
|
71
|
+
|
|
72
|
+
Check if a type is a scalar.
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
.. topic:: ndt_is_signed
|
|
76
|
+
.. topic:: ndt_is_unsigned
|
|
77
|
+
.. topic:: ndt_is_float
|
|
78
|
+
.. topic:: ndt_is_complex
|
|
79
|
+
|
|
80
|
+
.. code-block:: c
|
|
81
|
+
|
|
82
|
+
int ndt_is_signed(const ndt_t *t);
|
|
83
|
+
int ndt_is_unsigned(const ndt_t *t);
|
|
84
|
+
int ndt_is_float(const ndt_t *t);
|
|
85
|
+
int ndt_is_complex(const ndt_t *t);
|
|
86
|
+
|
|
87
|
+
Check if a type is signed, unsigned, float or complex.
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
.. topic:: ndt_endian_is_set
|
|
91
|
+
|
|
92
|
+
.. code-block:: c
|
|
93
|
+
|
|
94
|
+
int ndt_endian_is_set(const ndt_t *t);
|
|
95
|
+
|
|
96
|
+
Check whether the endianness of a type is explicitly set.
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
.. topic:: ndt_is_little_endian
|
|
100
|
+
.. topic:: ndt_is_big_endian
|
|
101
|
+
|
|
102
|
+
.. code-block:: c
|
|
103
|
+
|
|
104
|
+
int ndt_is_little_endian(const ndt_t *t);
|
|
105
|
+
int ndt_is_big_endian(const ndt_t *t);
|
|
106
|
+
|
|
107
|
+
Check whether a type is big or little endian. Use the native order
|
|
108
|
+
if no endian flag is set.
|
|
109
|
+
|
|
110
|
+
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
.. meta::
|
|
2
|
+
:robots: index,follow
|
|
3
|
+
:description: libndtypes documentation
|
|
4
|
+
|
|
5
|
+
.. sectionauthor:: Stefan Krah <skrah at bytereef.org>
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Typedef
|
|
9
|
+
=======
|
|
10
|
+
|
|
11
|
+
libndtypes has a global lookup table for type aliases. These aliases are
|
|
12
|
+
treated as nominal types in pattern matching.
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
.. code-block:: c
|
|
16
|
+
|
|
17
|
+
int ndt_init(ndt_context_t *ctx);
|
|
18
|
+
|
|
19
|
+
This function must be called at program start to initialize the typedef
|
|
20
|
+
table.
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
.. code-block:: c
|
|
24
|
+
|
|
25
|
+
int ndt_typedef(const char *name, ndt_t *type, ndt_context_t *ctx);
|
|
26
|
+
|
|
27
|
+
Create a nominal type alias for *type*. The function steals the *type*
|
|
28
|
+
argument.
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
@@ -0,0 +1,594 @@
|
|
|
1
|
+
.. meta::
|
|
2
|
+
:robots: index,follow
|
|
3
|
+
:description: libndtypes documentation
|
|
4
|
+
|
|
5
|
+
.. sectionauthor:: Stefan Krah <skrah at bytereef.org>
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Types
|
|
9
|
+
=====
|
|
10
|
+
|
|
11
|
+
Types are implemented as a tagged union. For the defined type enum values
|
|
12
|
+
it is best to refer to :c:macro:`ndtypes.h` directly or to search the constructor
|
|
13
|
+
functions below.
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
Abstract and concrete types
|
|
17
|
+
---------------------------
|
|
18
|
+
|
|
19
|
+
.. topic:: abstract_concrete
|
|
20
|
+
|
|
21
|
+
.. code-block:: c
|
|
22
|
+
|
|
23
|
+
/* Protect access to concrete type fields. */
|
|
24
|
+
enum ndt_access {
|
|
25
|
+
Abstract,
|
|
26
|
+
Concrete
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
An important concept in libndtypes are abstract and concrete types.
|
|
30
|
+
|
|
31
|
+
Abstract types can have symbolic values like dimension or type variables
|
|
32
|
+
and are used for type checking.
|
|
33
|
+
|
|
34
|
+
Concrete types additionally have full memory layout information like
|
|
35
|
+
alignment and data size.
|
|
36
|
+
|
|
37
|
+
In order to protect against accidental access to undefined concrete fields, types
|
|
38
|
+
have the *ndt_access* field that is set to *Abstract* or *Concrete*.
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
Flags
|
|
42
|
+
-----
|
|
43
|
+
|
|
44
|
+
.. code-block:: c
|
|
45
|
+
|
|
46
|
+
/* flags */
|
|
47
|
+
#define NDT_LITTLE_ENDIAN 0x00000001U
|
|
48
|
+
#define NDT_BIG_ENDIAN 0x00000002U
|
|
49
|
+
#define NDT_OPTION 0x00000004U
|
|
50
|
+
#define NDT_SUBTREE_OPTION 0x00000008U
|
|
51
|
+
#define NDT_ELLIPSIS 0x00000010U
|
|
52
|
+
|
|
53
|
+
The endian flags are set if a type has explicit endianness. If native order
|
|
54
|
+
is used, they are unset.
|
|
55
|
+
|
|
56
|
+
:c:macro:`NDT_OPTION` is set if a type itself is optional.
|
|
57
|
+
|
|
58
|
+
:c:macro:`NDT_SUBTREE_OPTION` is set if any subtree of a type is optional.
|
|
59
|
+
|
|
60
|
+
:c:macro:`NDT_ELLIPSIS` is set if the tail of a dimension sequence contains
|
|
61
|
+
an ellipsis dimension. The flag is not propagated to an outer array with
|
|
62
|
+
a dtype that contains an inner array with an ellipsis.
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
Common fields
|
|
66
|
+
-------------
|
|
67
|
+
|
|
68
|
+
.. topic:: common_fields
|
|
69
|
+
|
|
70
|
+
.. code-block:: c
|
|
71
|
+
|
|
72
|
+
struct _ndt {
|
|
73
|
+
/* Always defined */
|
|
74
|
+
enum ndt tag;
|
|
75
|
+
enum ndt_access access;
|
|
76
|
+
uint32_t flags;
|
|
77
|
+
int ndim;
|
|
78
|
+
/* Undefined if the type is abstract */
|
|
79
|
+
int64_t datasize;
|
|
80
|
+
uint16_t align;
|
|
81
|
+
...
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
*tag*, *access* and *flags* are explained above. Every type has an *ndim* field
|
|
85
|
+
even when it is not an array, in which case *ndim* is zero.
|
|
86
|
+
|
|
87
|
+
The *datasize* and *align* fields are defined for concrete types.
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
Abstract fields
|
|
91
|
+
---------------
|
|
92
|
+
|
|
93
|
+
.. topic:: abstract_fields
|
|
94
|
+
|
|
95
|
+
.. code-block:: c
|
|
96
|
+
|
|
97
|
+
union {
|
|
98
|
+
...
|
|
99
|
+
|
|
100
|
+
struct {
|
|
101
|
+
int64_t shape;
|
|
102
|
+
ndt_t *type;
|
|
103
|
+
} FixedDim;
|
|
104
|
+
|
|
105
|
+
...
|
|
106
|
+
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
These fields are always defined for both abstract and concrete types.
|
|
110
|
+
:c:macro:`FixedDim` is just an example field. Refer to :c:macro:`ndtypes.h`
|
|
111
|
+
directly for the complete set of fields.
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
Concrete fields
|
|
115
|
+
---------------
|
|
116
|
+
|
|
117
|
+
.. topic:: concrete_fields
|
|
118
|
+
|
|
119
|
+
.. code-block:: c
|
|
120
|
+
|
|
121
|
+
struct {
|
|
122
|
+
union {
|
|
123
|
+
struct {
|
|
124
|
+
int64_t itemsize;
|
|
125
|
+
int64_t step;
|
|
126
|
+
} FixedDim;
|
|
127
|
+
|
|
128
|
+
...
|
|
129
|
+
|
|
130
|
+
};
|
|
131
|
+
} Concrete;
|
|
132
|
+
|
|
133
|
+
These fields are only defined for concrete types. For internal reasons
|
|
134
|
+
(facilitating copying etc.) they are initialized to zero for abstract
|
|
135
|
+
types.
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
Type constructor functions
|
|
139
|
+
--------------------------
|
|
140
|
+
|
|
141
|
+
All functions in this section steal their arguments. On success, heap
|
|
142
|
+
allocated memory like *type* and *name* arguments belong to the return
|
|
143
|
+
value.
|
|
144
|
+
|
|
145
|
+
On error, all arguments are deallocated within the respective functions.
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
Special types
|
|
149
|
+
--------------
|
|
150
|
+
|
|
151
|
+
The types in this section all have some property that makes them different
|
|
152
|
+
from the regular types.
|
|
153
|
+
|
|
154
|
+
.. topic:: ndt_option
|
|
155
|
+
|
|
156
|
+
.. code-block:: c
|
|
157
|
+
|
|
158
|
+
ndt_t *ndt_option(ndt_t *type);
|
|
159
|
+
|
|
160
|
+
This constructor is unique in that it does *not* create a new type with an
|
|
161
|
+
:c:macro:`Option` tag, but sets the :c:macro:`NDT_OPTION` flag of its argument.
|
|
162
|
+
|
|
163
|
+
The reason is that having a separate :c:macro:`Option` tag complicates the
|
|
164
|
+
type traversal when using libndtypes.
|
|
165
|
+
|
|
166
|
+
The function returns its argument and cannot fail.
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
.. topic:: ndt_module
|
|
170
|
+
|
|
171
|
+
.. code-block:: c
|
|
172
|
+
|
|
173
|
+
ndt_t *ndt_module(char *name, ndt_t *type, ndt_context_t *ctx);
|
|
174
|
+
|
|
175
|
+
The module type is for implementing type name spaces and is always abstract.
|
|
176
|
+
Used in type checking.
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
.. topic:: ndt_function
|
|
180
|
+
|
|
181
|
+
.. code-block:: c
|
|
182
|
+
|
|
183
|
+
ndt_t *ndt_function(ndt_t *ret, ndt_t *pos, ndt_t *kwds, ndt_context_t *ctx);
|
|
184
|
+
|
|
185
|
+
The function type is used for declaring function signatures.
|
|
186
|
+
Used in type checking.
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
.. topic:: ndt_void
|
|
190
|
+
|
|
191
|
+
.. code-block:: c
|
|
192
|
+
|
|
193
|
+
ndt_t *ndt_void(ndt_context_t *ctx)
|
|
194
|
+
|
|
195
|
+
Currently only used as the empty return value in function signatures.
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
Any type
|
|
199
|
+
--------
|
|
200
|
+
|
|
201
|
+
.. topic:: ndt_any
|
|
202
|
+
|
|
203
|
+
.. code-block:: c
|
|
204
|
+
|
|
205
|
+
ndt_t *ndt_any_kind(ndt_context_t *ctx);
|
|
206
|
+
|
|
207
|
+
Constructs the abstract *Any* type. Used in type checking.
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
Dimension types
|
|
211
|
+
---------------
|
|
212
|
+
|
|
213
|
+
.. code-block:: c
|
|
214
|
+
|
|
215
|
+
ndt_t *ndt_fixed_dim(ndt_t *type, int64_t shape, int64_t step, ndt_context_t *ctx);
|
|
216
|
+
|
|
217
|
+
*type* is either a dtype or the tail of the dimension list.
|
|
218
|
+
|
|
219
|
+
*shape* is the dimension size and must be a natural number.
|
|
220
|
+
|
|
221
|
+
*step* is the amount to add to the linear index in order to move to
|
|
222
|
+
the next dimension element. *step* may be negative.
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
If *step* is :c:macro:`INT64_MAX`, the steps are computed from the dimensions
|
|
226
|
+
shapes and the resulting array is C-contiguous. This is the regular case.
|
|
227
|
+
|
|
228
|
+
If *step* is given, it is used without further checks. This is mostly useful
|
|
229
|
+
for slicing. The computed datasize is the minimum datasize such that all index
|
|
230
|
+
combinations are within the bounds of the allocated memory.
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
.. topic:: ndt_to_fortran
|
|
234
|
+
|
|
235
|
+
.. code-block:: c
|
|
236
|
+
|
|
237
|
+
ndt_t *ndt_to_fortran(const ndt_t *type, ndt_context_t *ctx);
|
|
238
|
+
|
|
239
|
+
Convert a C-contiguous chain of fixed dimensions to Fortran order.
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
.. topic:: ndt_abstract_var_dim
|
|
244
|
+
|
|
245
|
+
.. code-block:: c
|
|
246
|
+
|
|
247
|
+
ndt_t *ndt_abstract_var_dim(ndt_t *type, ndt_context_t *ctx);
|
|
248
|
+
|
|
249
|
+
Create an abstract *var* dimension for pattern matching.
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
.. topic:: ndt_var_dim
|
|
254
|
+
|
|
255
|
+
.. code-block:: c
|
|
256
|
+
|
|
257
|
+
/* Ownership flag for var dim offsets */
|
|
258
|
+
enum ndt_offsets {
|
|
259
|
+
InternalOffsets,
|
|
260
|
+
ExternalOffsets,
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
ndt_t *ndt_var_dim(ndt_t *type,
|
|
264
|
+
enum ndt_offsets flag, int32_t noffsets, const int32_t *offsets,
|
|
265
|
+
int32_t nslices, ndt_slice_t *slices,
|
|
266
|
+
ndt_context_t *ctx);
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
Create a concrete *var* dimension. Variable dimensions are offset-based
|
|
270
|
+
and use the same addressing scheme as the Arrow data format.
|
|
271
|
+
|
|
272
|
+
Offset arrays can be very large, so copying must be avoided. For ease of
|
|
273
|
+
use, libndtypes supports creating offset arrays from a datashape string.
|
|
274
|
+
In that case, *flag* must be set to :c:macro:`InternalOffsets` and the offsets
|
|
275
|
+
are managed by the type.
|
|
276
|
+
|
|
277
|
+
However, in the most common case offsets are generated and managed elsewhere.
|
|
278
|
+
In that case, *flag* must be set to :c:macro:`ExternalOffsets`.
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
The offset-based scheme makes it hard to store a sliced var dimension or
|
|
282
|
+
repeatedly slice a var dimension. This would require additional shape
|
|
283
|
+
arrays that are as large as the offset arrays.
|
|
284
|
+
|
|
285
|
+
Instead, var dimensions have the concept of a slice stack that stores
|
|
286
|
+
all slices that need to be applied to a var dimension.
|
|
287
|
+
|
|
288
|
+
Accessing elements recomputes the (start, stop, step) triples that result
|
|
289
|
+
from applying the entire slice stack.
|
|
290
|
+
|
|
291
|
+
The *nslices* and *slices* arguments are used to provide this stack. For
|
|
292
|
+
an unsliced var dimension these arguments must be *0* and *NULL*.
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
.. topic:: ndt_symbolic_dim
|
|
297
|
+
|
|
298
|
+
.. code-block:: c
|
|
299
|
+
|
|
300
|
+
ndt_t *ndt_symbolic_dim(char *name, ndt_t *type, ndt_context_t *ctx);
|
|
301
|
+
|
|
302
|
+
Create a dimension variable for pattern matching. The variable stands for
|
|
303
|
+
a fixed dimension.
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
.. topic:: ndt_ellipsis_dim
|
|
308
|
+
|
|
309
|
+
.. code-block:: c
|
|
310
|
+
|
|
311
|
+
ndt_ellipsis_dim(char *name, ndt_t *type, ndt_context_t *ctx);
|
|
312
|
+
|
|
313
|
+
Create an ellipsis dimension for pattern matching. If *name* is non-NULL,
|
|
314
|
+
a named ellipsis variable is created.
|
|
315
|
+
|
|
316
|
+
In pattern matching, multiple named ellipsis variables always stand for
|
|
317
|
+
the exact same sequence of dimensions.
|
|
318
|
+
|
|
319
|
+
By contrast, multiple unnamed ellipses stand for any sequence of dimensions
|
|
320
|
+
that can be broadcast together.
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
Container types
|
|
324
|
+
---------------
|
|
325
|
+
|
|
326
|
+
.. topic:: ndt_tuple
|
|
327
|
+
|
|
328
|
+
.. code-block:: c
|
|
329
|
+
|
|
330
|
+
ndt_t *ndt_tuple(enum ndt_variadic flag, ndt_field_t *fields, int64_t shape,
|
|
331
|
+
uint16_opt_t align, uint16_opt_t pack, ndt_context_t *ctx);
|
|
332
|
+
|
|
333
|
+
Construct a tuple type. *fields* is the field sequence, *shape* the length
|
|
334
|
+
of the tuple.
|
|
335
|
+
|
|
336
|
+
*align* and *pack* are mutually exclusive and have the exact same meaning
|
|
337
|
+
as gcc's *aligned* and *packed* attributes applied to an entire struct.
|
|
338
|
+
|
|
339
|
+
Either of these may only be given if no field has an *align* or *pack*
|
|
340
|
+
attribute.
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
.. topic:: ndt_record
|
|
344
|
+
|
|
345
|
+
.. code-block:: c
|
|
346
|
+
|
|
347
|
+
ndt_t *ndt_record(enum ndt_variadic flag, ndt_field_t *fields, int64_t shape,
|
|
348
|
+
uint16_opt_t align, uint16_opt_t pack, ndt_context_t *ctx);
|
|
349
|
+
|
|
350
|
+
Construct a record (struct) type. *fields* is the field sequence, *shape*
|
|
351
|
+
the length of the record.
|
|
352
|
+
|
|
353
|
+
*align* and *pack* are mutually exclusive and have the exact same meaning
|
|
354
|
+
as gcc's *aligned* and *packed* attributes applied to an entire struct.
|
|
355
|
+
|
|
356
|
+
Either of these may only be given if no field has an *align* or *pack*
|
|
357
|
+
attribute.
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
.. topic:: ndt_ref
|
|
361
|
+
|
|
362
|
+
.. code-block:: c
|
|
363
|
+
|
|
364
|
+
ndt_t *ndt_ref(ndt_t *type, ndt_context_t *ctx);
|
|
365
|
+
|
|
366
|
+
Construct a reference type. References are pointers whose contents (the values
|
|
367
|
+
pointed to) are addressed transparently.
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
.. topic:: ndt_constr
|
|
371
|
+
|
|
372
|
+
.. code-block:: c
|
|
373
|
+
|
|
374
|
+
ndt_t *ndt_constr(char *name, ndt_t *type, ndt_context_t *ctx);
|
|
375
|
+
|
|
376
|
+
Create a constructor type. Constructor types are equal if their names
|
|
377
|
+
and types are equal.
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
.. topic:: ndt_nominal
|
|
381
|
+
|
|
382
|
+
.. code-block:: c
|
|
383
|
+
|
|
384
|
+
ndt_t *ndt_nominal(char *name, ndt_t *type, ndt_context_t *ctx);
|
|
385
|
+
|
|
386
|
+
Same as constructor, but the type is stored in a lookup table. Comparisons
|
|
387
|
+
and pattern matching are only by name. The name is globally unique.
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
Scalars
|
|
391
|
+
-------
|
|
392
|
+
|
|
393
|
+
.. topic:: ndt_scalar_kind
|
|
394
|
+
|
|
395
|
+
.. code-block:: c
|
|
396
|
+
|
|
397
|
+
ndt_t *ndt_scalar_kind(ndt_context_t *ctx);
|
|
398
|
+
|
|
399
|
+
Create a scalar kind type for pattern matching.
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
Categorical
|
|
403
|
+
-----------
|
|
404
|
+
|
|
405
|
+
.. topic:: ndt_categorical
|
|
406
|
+
|
|
407
|
+
.. code-block:: c
|
|
408
|
+
|
|
409
|
+
ndt_t *ndt_categorical(ndt_value_t *types, int64_t ntypes, ndt_context_t *ctx);
|
|
410
|
+
|
|
411
|
+
Create a categorical type. The categories are given as an array of typed
|
|
412
|
+
values.
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
|
|
416
|
+
Fixed string and fixed bytes
|
|
417
|
+
----------------------------
|
|
418
|
+
|
|
419
|
+
.. topic:: ndt_fixed_string_kind
|
|
420
|
+
|
|
421
|
+
.. code-block:: c
|
|
422
|
+
|
|
423
|
+
ndt_t *ndt_fixed_string_kind(ndt_context_t *ctx);
|
|
424
|
+
|
|
425
|
+
Create a fixed string kind symbolic type for pattern matching.
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
.. topic:: ndt_fixed_string
|
|
430
|
+
|
|
431
|
+
.. code-block:: c
|
|
432
|
+
|
|
433
|
+
ndt_t *ndt_fixed_string(int64_t len, enum ndt_encoding encoding, ndt_context_t *ctx);
|
|
434
|
+
|
|
435
|
+
Create a fixed string type. *len is the length in code points, for *encoding* refer
|
|
436
|
+
to the encodings section.
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
.. topic:: ndt_fixed_bytes_kind
|
|
440
|
+
|
|
441
|
+
.. code-block:: c
|
|
442
|
+
|
|
443
|
+
ndt_t *ndt_fixed_bytes(int64_t size, uint16_opt_t align, ndt_context_t *ctx);
|
|
444
|
+
|
|
445
|
+
Create a fixed bytes kind symbolic type for pattern matching.
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
|
|
449
|
+
.. topic:: ndt_fixed_bytes
|
|
450
|
+
|
|
451
|
+
.. code-block:: c
|
|
452
|
+
|
|
453
|
+
ndt_t *ndt_fixed_bytes(int64_t size, uint16_opt_t align, ndt_context_t *ctx);
|
|
454
|
+
|
|
455
|
+
Create a fixed bytes type with size *size* and alignment *align*.
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
String, bytes, char
|
|
459
|
+
-------------------
|
|
460
|
+
|
|
461
|
+
.. topic:: ndt_string
|
|
462
|
+
|
|
463
|
+
.. code-block:: c
|
|
464
|
+
|
|
465
|
+
ndt_t *ndt_string(ndt_context_t *ctx);
|
|
466
|
+
|
|
467
|
+
Create a string type. The value representation in memory is a pointer to a
|
|
468
|
+
:c:macro:`NUL`-terminated UTF-8 string.
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
.. topic:: ndt_bytes
|
|
472
|
+
|
|
473
|
+
.. code-block:: c
|
|
474
|
+
|
|
475
|
+
ndt_t *ndt_bytes(uint16_opt_t target_align, ndt_context_t *ctx);
|
|
476
|
+
|
|
477
|
+
Create a bytes type. The value representation in memory is a struct containing
|
|
478
|
+
an :c:macro:`int64_t` *size* field and a pointer to :c:macro:`uint8_t`.
|
|
479
|
+
|
|
480
|
+
The alignment of the pointer value is *target_align*.
|
|
481
|
+
|
|
482
|
+
|
|
483
|
+
|
|
484
|
+
.. topic:: ndt_char
|
|
485
|
+
|
|
486
|
+
.. code-block:: c
|
|
487
|
+
|
|
488
|
+
ndt_t *ndt_char(enum ndt_encoding encoding, ndt_context_t *ctx);
|
|
489
|
+
|
|
490
|
+
Create a char type with a specific *encoding*. Encodings apart from UTF-32
|
|
491
|
+
may be removed in the future, since single UTF-8 chars etc. have no real
|
|
492
|
+
meaning and arrays of UTF-8 chars can be represented by the fixed string type.
|
|
493
|
+
|
|
494
|
+
|
|
495
|
+
Integer kinds
|
|
496
|
+
-------------
|
|
497
|
+
|
|
498
|
+
.. topic:: ndt_signed_kind
|
|
499
|
+
|
|
500
|
+
.. code-block:: c
|
|
501
|
+
|
|
502
|
+
ndt_t *ndt_signed_kind(ndt_context_t *ctx);
|
|
503
|
+
|
|
504
|
+
Create a symbolic signed kind type for pattern matching.
|
|
505
|
+
|
|
506
|
+
|
|
507
|
+
.. topic:: ndt_unsigned_kind
|
|
508
|
+
|
|
509
|
+
.. code-block:: c
|
|
510
|
+
|
|
511
|
+
ndt_t *ndt_unsigned_kind(ndt_context_t *ctx);
|
|
512
|
+
|
|
513
|
+
Create a symbolic unsigned kind type for pattern matching.
|
|
514
|
+
|
|
515
|
+
|
|
516
|
+
.. topic:: ndt_float_kind
|
|
517
|
+
|
|
518
|
+
.. code-block:: c
|
|
519
|
+
|
|
520
|
+
ndt_t *ndt_float_kind(ndt_context_t *ctx);
|
|
521
|
+
|
|
522
|
+
Create a symbolic float kind type for pattern matching.
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
.. topic:: ndt_complex_kind
|
|
526
|
+
|
|
527
|
+
.. code-block:: c
|
|
528
|
+
|
|
529
|
+
ndt_t *ndt_complex_kind(ndt_context_t *ctx);
|
|
530
|
+
|
|
531
|
+
Create a symbolic complex kind type for pattern matching.
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
Numbers
|
|
535
|
+
-------
|
|
536
|
+
|
|
537
|
+
.. topic:: ndt_primitive
|
|
538
|
+
|
|
539
|
+
.. code-block:: c
|
|
540
|
+
|
|
541
|
+
ndt_t *ndt_primitive(enum ndt tag, uint32_t flags, ndt_context_t *ctx);
|
|
542
|
+
|
|
543
|
+
Create a number type according to the given enum value. *flags* can be
|
|
544
|
+
:c:macro:`NDT_LITTLE_ENDIAN` or :c:macro:`NDT_BIG_ENDIAN`.
|
|
545
|
+
|
|
546
|
+
If no endian flag is given, native order is assumed.
|
|
547
|
+
|
|
548
|
+
|
|
549
|
+
.. topic:: ndt_signed
|
|
550
|
+
|
|
551
|
+
.. code-block:: c
|
|
552
|
+
|
|
553
|
+
ndt_t *ndt_signed(int size, uint32_t flags, ndt_context_t *ctx);
|
|
554
|
+
|
|
555
|
+
Create a signed fixed width integer according to *size*. *flags* as above.
|
|
556
|
+
|
|
557
|
+
|
|
558
|
+
.. topic:: ndt_unsigned
|
|
559
|
+
|
|
560
|
+
.. code-block:: c
|
|
561
|
+
|
|
562
|
+
ndt_t *ndt_unsigned(int size, uint32_t flags, ndt_context_t *ctx);
|
|
563
|
+
|
|
564
|
+
Create an unsigned fixed width integer according to *size*. *flags* as above.
|
|
565
|
+
|
|
566
|
+
|
|
567
|
+
.. topic:: ndt_from_alias
|
|
568
|
+
|
|
569
|
+
.. code-block:: c
|
|
570
|
+
|
|
571
|
+
enum ndt_alias {
|
|
572
|
+
Size,
|
|
573
|
+
Intptr,
|
|
574
|
+
Uintptr
|
|
575
|
+
};
|
|
576
|
+
|
|
577
|
+
ndt_t *ndt_from_alias(enum ndt_alias tag, uint32_t flags, ndt_context_t *ctx);
|
|
578
|
+
|
|
579
|
+
Create a fixed width integer type from an alias. Sizes are platform dependent.
|
|
580
|
+
|
|
581
|
+
|
|
582
|
+
Type variables
|
|
583
|
+
--------------
|
|
584
|
+
|
|
585
|
+
.. topic:: ndt_typevar
|
|
586
|
+
|
|
587
|
+
.. code-block:: c
|
|
588
|
+
|
|
589
|
+
ndt_t *ndt_typevar(char *name, ndt_context_t *ctx);
|
|
590
|
+
|
|
591
|
+
Create a type variable for pattern matching.
|
|
592
|
+
|
|
593
|
+
|
|
594
|
+
|