xnd 0.2.0dev3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTING.md +42 -0
  3. data/Gemfile +3 -0
  4. data/History.md +0 -0
  5. data/README.md +7 -0
  6. data/Rakefile +135 -0
  7. data/ext/ruby_xnd/extconf.rb +70 -0
  8. data/ext/ruby_xnd/float_pack_unpack.c +277 -0
  9. data/ext/ruby_xnd/float_pack_unpack.h +39 -0
  10. data/ext/ruby_xnd/gc_guard.c +36 -0
  11. data/ext/ruby_xnd/gc_guard.h +12 -0
  12. data/ext/ruby_xnd/include/xnd.h +449 -0
  13. data/ext/ruby_xnd/lib/libxnd.a +0 -0
  14. data/ext/ruby_xnd/lib/libxnd.so +1 -0
  15. data/ext/ruby_xnd/lib/libxnd.so.0 +1 -0
  16. data/ext/ruby_xnd/lib/libxnd.so.0.2.0dev3 +0 -0
  17. data/ext/ruby_xnd/memory_block_object.c +32 -0
  18. data/ext/ruby_xnd/memory_block_object.h +33 -0
  19. data/ext/ruby_xnd/ruby_xnd.c +1953 -0
  20. data/ext/ruby_xnd/ruby_xnd.h +61 -0
  21. data/ext/ruby_xnd/ruby_xnd_internal.h +85 -0
  22. data/ext/ruby_xnd/util.h +170 -0
  23. data/ext/ruby_xnd/xnd/AUTHORS.txt +5 -0
  24. data/ext/ruby_xnd/xnd/INSTALL.txt +134 -0
  25. data/ext/ruby_xnd/xnd/LICENSE.txt +29 -0
  26. data/ext/ruby_xnd/xnd/MANIFEST.in +3 -0
  27. data/ext/ruby_xnd/xnd/Makefile.in +80 -0
  28. data/ext/ruby_xnd/xnd/README.rst +44 -0
  29. data/ext/ruby_xnd/xnd/config.guess +1530 -0
  30. data/ext/ruby_xnd/xnd/config.h.in +22 -0
  31. data/ext/ruby_xnd/xnd/config.sub +1782 -0
  32. data/ext/ruby_xnd/xnd/configure +4867 -0
  33. data/ext/ruby_xnd/xnd/configure.ac +164 -0
  34. data/ext/ruby_xnd/xnd/doc/Makefile +14 -0
  35. data/ext/ruby_xnd/xnd/doc/_static/copybutton.js +66 -0
  36. data/ext/ruby_xnd/xnd/doc/conf.py +26 -0
  37. data/ext/ruby_xnd/xnd/doc/index.rst +44 -0
  38. data/ext/ruby_xnd/xnd/doc/libxnd/data-structures.rst +186 -0
  39. data/ext/ruby_xnd/xnd/doc/libxnd/functions.rst +148 -0
  40. data/ext/ruby_xnd/xnd/doc/libxnd/index.rst +25 -0
  41. data/ext/ruby_xnd/xnd/doc/releases/index.rst +34 -0
  42. data/ext/ruby_xnd/xnd/doc/xnd/align-pack.rst +96 -0
  43. data/ext/ruby_xnd/xnd/doc/xnd/buffer-protocol.rst +42 -0
  44. data/ext/ruby_xnd/xnd/doc/xnd/index.rst +30 -0
  45. data/ext/ruby_xnd/xnd/doc/xnd/quickstart.rst +62 -0
  46. data/ext/ruby_xnd/xnd/doc/xnd/types.rst +674 -0
  47. data/ext/ruby_xnd/xnd/install-sh +527 -0
  48. data/ext/ruby_xnd/xnd/libxnd/Makefile.in +102 -0
  49. data/ext/ruby_xnd/xnd/libxnd/Makefile.vc +112 -0
  50. data/ext/ruby_xnd/xnd/libxnd/bitmaps.c +345 -0
  51. data/ext/ruby_xnd/xnd/libxnd/contrib.h +313 -0
  52. data/ext/ruby_xnd/xnd/libxnd/copy.c +944 -0
  53. data/ext/ruby_xnd/xnd/libxnd/equal.c +1216 -0
  54. data/ext/ruby_xnd/xnd/libxnd/inline.h +154 -0
  55. data/ext/ruby_xnd/xnd/libxnd/overflow.h +147 -0
  56. data/ext/ruby_xnd/xnd/libxnd/split.c +286 -0
  57. data/ext/ruby_xnd/xnd/libxnd/tests/Makefile.in +39 -0
  58. data/ext/ruby_xnd/xnd/libxnd/tests/Makefile.vc +44 -0
  59. data/ext/ruby_xnd/xnd/libxnd/tests/README.txt +2 -0
  60. data/ext/ruby_xnd/xnd/libxnd/tests/runtest.c +101 -0
  61. data/ext/ruby_xnd/xnd/libxnd/tests/test.h +48 -0
  62. data/ext/ruby_xnd/xnd/libxnd/tests/test_fixed.c +108 -0
  63. data/ext/ruby_xnd/xnd/libxnd/xnd.c +1304 -0
  64. data/ext/ruby_xnd/xnd/libxnd/xnd.h +449 -0
  65. data/ext/ruby_xnd/xnd/python/test_xnd.py +3144 -0
  66. data/ext/ruby_xnd/xnd/python/xnd/__init__.py +290 -0
  67. data/ext/ruby_xnd/xnd/python/xnd/_xnd.c +2822 -0
  68. data/ext/ruby_xnd/xnd/python/xnd/contrib/pretty.py +850 -0
  69. data/ext/ruby_xnd/xnd/python/xnd/docstrings.h +129 -0
  70. data/ext/ruby_xnd/xnd/python/xnd/pyxnd.h +200 -0
  71. data/ext/ruby_xnd/xnd/python/xnd/util.h +182 -0
  72. data/ext/ruby_xnd/xnd/python/xnd_randvalue.py +1121 -0
  73. data/ext/ruby_xnd/xnd/python/xnd_support.py +106 -0
  74. data/ext/ruby_xnd/xnd/setup.py +303 -0
  75. data/ext/ruby_xnd/xnd/vcbuild/INSTALL.txt +42 -0
  76. data/ext/ruby_xnd/xnd/vcbuild/runtest32.bat +16 -0
  77. data/ext/ruby_xnd/xnd/vcbuild/runtest64.bat +14 -0
  78. data/ext/ruby_xnd/xnd/vcbuild/vcbuild32.bat +29 -0
  79. data/ext/ruby_xnd/xnd/vcbuild/vcbuild64.bat +29 -0
  80. data/ext/ruby_xnd/xnd/vcbuild/vcclean.bat +13 -0
  81. data/ext/ruby_xnd/xnd/vcbuild/vcdistclean.bat +14 -0
  82. data/lib/ruby_xnd.so +0 -0
  83. data/lib/xnd.rb +306 -0
  84. data/lib/xnd/monkeys.rb +29 -0
  85. data/lib/xnd/version.rb +6 -0
  86. data/spec/debug_spec.rb +9 -0
  87. data/spec/gc_guard_spec.rb +10 -0
  88. data/spec/leakcheck.rb +9 -0
  89. data/spec/spec_helper.rb +877 -0
  90. data/spec/type_inference_spec.rb +81 -0
  91. data/spec/xnd_spec.rb +2921 -0
  92. data/xnd.gemspec +47 -0
  93. metadata +215 -0
@@ -0,0 +1,102 @@
1
+
2
+ # ==============================================================================
3
+ # Unix Makefile for libxnd
4
+ # ==============================================================================
5
+
6
+
7
+ LIBSTATIC = @LIBSTATIC@
8
+ LIBNAME = @LIBNAME@
9
+ LIBSONAME = @LIBSONAME@
10
+ LIBSHARED = @LIBSHARED@
11
+
12
+ CC = @CC@
13
+ LD = @LD@
14
+ AR = @AR@
15
+ RANLIB = @RANLIB@
16
+
17
+ XND_INCLUDES = @CONFIGURE_INCLUDES@
18
+
19
+ CONFIGURE_CFLAGS = @CONFIGURE_CFLAGS@
20
+ XND_CFLAGS = $(strip -I$(XND_INCLUDES) $(CONFIGURE_CFLAGS) $(CFLAGS))
21
+ XND_CFLAGS_SHARED = $(XND_CFLAGS) -fPIC
22
+
23
+ CONFIGURE_LDFLAGS = @CONFIGURE_LDFLAGS@
24
+ XND_LDFLAGS = $(strip $(CONFIGURE_LDFLAGS) $(LDFLAGS))
25
+
26
+
27
+ default: $(LIBSTATIC) $(LIBSHARED)
28
+
29
+
30
+ OBJS = bitmaps.o copy.o equal.o split.o xnd.o
31
+
32
+ SHARED_OBJS = .objs/bitmaps.o .objs/copy.o .objs/equal.o .objs/split.o .objs/xnd.o
33
+
34
+
35
+ $(LIBSTATIC): Makefile $(OBJS)
36
+ $(AR) rc $(LIBSTATIC) $(OBJS)
37
+ $(RANLIB) $(LIBSTATIC)
38
+
39
+ $(LIBSHARED): Makefile $(SHARED_OBJS)
40
+ $(LD) $(XND_LDFLAGS) -o $(LIBSHARED) $(SHARED_OBJS)
41
+ ln -sf $(LIBSHARED) $(LIBNAME)
42
+ ln -sf $(LIBSHARED) $(LIBSONAME)
43
+
44
+ bitmaps.o:\
45
+ Makefile bitmaps.c xnd.h
46
+ $(CC) $(XND_CFLAGS) -c bitmaps.c
47
+
48
+ .objs/bitmaps.o:\
49
+ Makefile bitmaps.c xnd.h
50
+ $(CC) $(XND_CFLAGS_SHARED) -c bitmaps.c -o .objs/bitmaps.o
51
+
52
+ copy.o:\
53
+ Makefile copy.c xnd.h
54
+ $(CC) $(XND_CFLAGS) -c copy.c
55
+
56
+ .objs/copy.o:\
57
+ Makefile copy.c xnd.h
58
+ $(CC) $(XND_CFLAGS_SHARED) -c copy.c -o .objs/copy.o
59
+
60
+ equal.o:\
61
+ Makefile equal.c xnd.h
62
+ $(CC) $(XND_CFLAGS) -c equal.c
63
+
64
+ .objs/equal.o:\
65
+ Makefile equal.c xnd.h
66
+ $(CC) $(XND_CFLAGS_SHARED) -c equal.c -o .objs/equal.o
67
+
68
+ split.o:\
69
+ Makefile split.c overflow.h xnd.h
70
+ $(CC) $(XND_CFLAGS) -c split.c
71
+
72
+ .objs/split.o:\
73
+ Makefile split.c overflow.h xnd.h
74
+ $(CC) $(XND_CFLAGS_SHARED) -c split.c -o .objs/split.o
75
+
76
+ xnd.o:\
77
+ Makefile xnd.c xnd.h
78
+ $(CC) $(XND_CFLAGS) -c xnd.c
79
+
80
+ .objs/xnd.o:\
81
+ Makefile xnd.c xnd.h
82
+ $(CC) $(XND_CFLAGS_SHARED) -c xnd.c -o .objs/xnd.o
83
+
84
+
85
+ # Coverage
86
+ coverage:\
87
+ Makefile clean runtest
88
+ ./tests/runtest
89
+ for file in *.c; do gcov -l "$$file" > /dev/null 2>&1; done
90
+
91
+ FORCE:
92
+
93
+ clean: FORCE
94
+ rm -f *.o *.so *.gch *.gcda *.gcno *.gcov *.dyn *.dpi *.lock
95
+ rm -f $(LIBSTATIC) $(LIBSHARED) $(LIBSONAME) $(LIBNAME)
96
+ cd .objs && rm -f *.o *.so *.gch *.gcda *.gcno *.gcov *.dyn *.dpi *.lock
97
+
98
+ distclean: clean
99
+ rm -f Makefile
100
+
101
+
102
+
@@ -0,0 +1,112 @@
1
+
2
+ # ======================================================================
3
+ # Visual C (nmake) Makefile for libxnd
4
+ # ======================================================================
5
+
6
+ LIBSTATIC = libxnd-0.2.0dev3.lib
7
+ LIBIMPORT = libxnd-0.2.0dev3.dll.lib
8
+ LIBSHARED = libxnd-0.2.0dev3.dll
9
+ LIBNDTYPESIMPORT = libndtypes-0.2.0dev3.dll.lib
10
+
11
+ !ifndef LIBNDTYPESINCLUDE
12
+ LIBNDTYPESINCLUDE = ..\ndtypes\libndtypes
13
+ !endif
14
+
15
+ !ifndef LIBNDTYPESDIR
16
+ LIBNDTYPESDIR = ..\ndtypes\libndtypes
17
+ !endif
18
+
19
+ OPT = /MT /Ox /GS /EHsc
20
+ OPT_SHARED = /DXND_EXPORT /MD /Ox /GS /EHsc /Fo.objs^\
21
+
22
+ COMMON_CFLAGS = /nologo /W4 /wd4200 /wd4201 /wd4204
23
+ CFLAGS = $(COMMON_CFLAGS) $(OPT)
24
+ CFLAGS_SHARED = $(COMMON_CFLAGS) $(OPT_SHARED)
25
+
26
+
27
+ default: $(LIBSTATIC) $(LIBSHARED)
28
+ copy /y xnd.h ..\python\xnd
29
+ copy /y $(LIBSTATIC) ..\python\xnd
30
+ copy /y $(LIBIMPORT) ..\python\xnd
31
+ copy /y $(LIBSHARED) ..\python\xnd
32
+
33
+
34
+ OBJS = bitmaps.obj copy.obj equal.obj split.obj xnd.obj
35
+
36
+ SHARED_OBJS = .objs\bitmaps.obj .objs\copy.obj .objs\equal.obj .objs\split.obj .objs\xnd.obj
37
+
38
+
39
+ $(LIBSTATIC):\
40
+ Makefile $(OBJS)
41
+ -@if exist $@ del $(LIBSTATIC)
42
+ lib /nologo /out:$(LIBSTATIC) $(OBJS)
43
+
44
+ $(LIBSHARED):\
45
+ Makefile $(SHARED_OBJS)
46
+ -@if exist $@ del $(LIBSHARED)
47
+ link /nologo /DLL /MANIFEST /out:$(LIBSHARED) /implib:$(LIBIMPORT) $(SHARED_OBJS) "/LIBPATH:$(LIBNDTYPESDIR)" $(LIBNDTYPESIMPORT)
48
+ mt /nologo -manifest $(LIBSHARED).manifest -outputresource:$(LIBSHARED);2
49
+
50
+ bitmaps.obj:\
51
+ Makefile bitmaps.c xnd.h
52
+ $(CC) "-I$(LIBNDTYPESINCLUDE)" $(CFLAGS) -c bitmaps.c
53
+
54
+ .objs\bitmaps.obj:\
55
+ Makefile bitmaps.c xnd.h
56
+ $(CC) "-I$(LIBNDTYPESINCLUDE)" $(CFLAGS_SHARED) -c bitmaps.c
57
+
58
+ copy.obj:\
59
+ Makefile copy.c xnd.h
60
+ $(CC) "-I$(LIBNDTYPESINCLUDE)" $(CFLAGS) -c copy.c
61
+
62
+ .objs\copy.obj:\
63
+ Makefile copy.c xnd.h
64
+ $(CC) "-I$(LIBNDTYPESINCLUDE)" $(CFLAGS_SHARED) -c copy.c
65
+
66
+ equal.obj:\
67
+ Makefile equal.c xnd.h
68
+ $(CC) "-I$(LIBNDTYPESINCLUDE)" $(CFLAGS) -c equal.c
69
+
70
+ .objs\equal.obj:\
71
+ Makefile equal.c xnd.h
72
+ $(CC) "-I$(LIBNDTYPESINCLUDE)" $(CFLAGS_SHARED) -c equal.c
73
+
74
+ split.obj:\
75
+ Makefile split.c overflow.h xnd.h
76
+ $(CC) "-I$(LIBNDTYPESINCLUDE)" $(CFLAGS) -c split.c
77
+
78
+ .objs\split.obj:\
79
+ Makefile split.c overflow.h xnd.h
80
+ $(CC) "-I$(LIBNDTYPESINCLUDE)" $(CFLAGS_SHARED) -c split.c
81
+
82
+ xnd.obj:\
83
+ Makefile xnd.c xnd.h
84
+ $(CC) "-I$(LIBNDTYPESINCLUDE)" $(CFLAGS) -c xnd.c
85
+
86
+ .objs\xnd.obj:\
87
+ Makefile xnd.c xnd.h
88
+ $(CC) "-I$(LIBNDTYPESINCLUDE)" $(CFLAGS_SHARED) -c xnd.c
89
+
90
+ check:\
91
+ Makefile default
92
+ cd tests && copy /y Makefile.vc Makefile && nmake /nologo
93
+ .\tests\runtest.exe
94
+ .\tests\runtest_shared.exe
95
+
96
+
97
+ FORCE:
98
+
99
+ clean: FORCE
100
+ del /q /f *.exe *.obj *.lib *.dll *.exp *.manifest 2>NUL
101
+ cd .objs && del /q /f *.obj 2>NUL
102
+ if exist "..\build\" rd /q /s "..\build\"
103
+ if exist "..\dist\" rd /q /s "..\dist\"
104
+ if exist "..\MANIFEST" del "..\MANIFEST"
105
+ if exist "..\record.txt" del "..\record.txt"
106
+ cd ..\python\xnd && del *.lib *.dll *.pyd xnd.h 2>NUL
107
+
108
+ distclean: clean
109
+ del Makefile 2>NUL
110
+
111
+
112
+
@@ -0,0 +1,345 @@
1
+ /*
2
+ * BSD 3-Clause License
3
+ *
4
+ * Copyright (c) 2017-2018, plures
5
+ * All rights reserved.
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without
8
+ * modification, are permitted provided that the following conditions are met:
9
+ *
10
+ * 1. Redistributions of source code must retain the above copyright notice,
11
+ * this list of conditions and the following disclaimer.
12
+ *
13
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
14
+ * this list of conditions and the following disclaimer in the documentation
15
+ * and/or other materials provided with the distribution.
16
+ *
17
+ * 3. Neither the name of the copyright holder nor the names of its
18
+ * contributors may be used to endorse or promote products derived from
19
+ * this software without specific prior written permission.
20
+ *
21
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ */
32
+
33
+
34
+ #include <stdlib.h>
35
+ #include <stdint.h>
36
+ #include <inttypes.h>
37
+ #include <assert.h>
38
+ #include "ndtypes.h"
39
+ #include "xnd.h"
40
+
41
+
42
+ const xnd_bitmap_t xnd_bitmap_empty = { .data = NULL, .size = 0, .next = NULL};
43
+
44
+
45
+ static int64_t
46
+ bitmap_size(int64_t nelem)
47
+ {
48
+ return (nelem + 7) / 8;
49
+ }
50
+
51
+ static uint8_t *
52
+ bits_new(int64_t n, ndt_context_t *ctx)
53
+ {
54
+ uint8_t *bits;
55
+
56
+ bits = ndt_calloc(bitmap_size(n), 1);
57
+ if (bits == NULL) {
58
+ return ndt_memory_error(ctx);
59
+ }
60
+
61
+ return bits;
62
+ }
63
+
64
+ static xnd_bitmap_t *
65
+ bitmap_array_new(int64_t n, ndt_context_t *ctx)
66
+ {
67
+ xnd_bitmap_t *b;
68
+
69
+ b = ndt_calloc(n, sizeof *b);
70
+ if (b == NULL) {
71
+ return ndt_memory_error(ctx);
72
+ }
73
+
74
+ return b;
75
+ }
76
+
77
+ static int
78
+ bitmap_init(xnd_bitmap_t *b, const ndt_t *t, int64_t nitems, ndt_context_t *ctx)
79
+ {
80
+ xnd_bitmap_t *next;
81
+ int64_t shape, i, k;
82
+ int64_t n;
83
+
84
+ assert(ndt_is_concrete(t));
85
+ assert(b->data == NULL);
86
+ assert(b->size == 0);
87
+ assert(b->next == NULL);
88
+
89
+ if (t->ndim == 0 && ndt_is_optional(t)) {
90
+ b->data = bits_new(nitems, ctx);
91
+ if (b->data == NULL) {
92
+ return -1;
93
+ }
94
+ }
95
+
96
+ if (!ndt_subtree_is_optional(t)) {
97
+ return 0;
98
+ }
99
+
100
+ switch (t->tag) {
101
+ case FixedDim: {
102
+ shape = t->FixedDim.shape;
103
+ return bitmap_init(b, t->FixedDim.type, nitems * shape, ctx);
104
+ }
105
+
106
+ case VarDim: {
107
+ assert(nitems == 1);
108
+ n = nitems;
109
+
110
+ if (t->ndim == 1) {
111
+ int32_t noffsets = t->Concrete.VarDim.noffsets;
112
+ n = t->Concrete.VarDim.offsets[noffsets-1];
113
+ }
114
+
115
+ return bitmap_init(b, t->VarDim.type, n, ctx);
116
+ }
117
+
118
+ case Tuple: {
119
+ shape = t->Tuple.shape;
120
+
121
+ n = nitems * shape;
122
+ b->next = bitmap_array_new(n, ctx);
123
+ if (b->next == NULL) {
124
+ xnd_bitmap_clear(b);
125
+ return -1;
126
+ }
127
+ b->size = n;
128
+
129
+ for (i = 0; i < nitems; i++) {
130
+ for (k = 0; k < shape; k++) {
131
+ next = b->next + i*shape + k;
132
+ if (bitmap_init(next, t->Tuple.types[k], 1, ctx) < 0) {
133
+ xnd_bitmap_clear(b);
134
+ return -1;
135
+ }
136
+ }
137
+ }
138
+
139
+ return 0;
140
+ }
141
+
142
+ case Record: {
143
+ shape = t->Record.shape;
144
+
145
+ n = nitems * shape;
146
+ b->next = bitmap_array_new(n, ctx);
147
+ if (b->next == NULL) {
148
+ xnd_bitmap_clear(b);
149
+ return -1;
150
+ }
151
+ b->size = n;
152
+
153
+ for (i = 0; i < nitems; i++) {
154
+ for (k = 0; k < shape; k++) {
155
+ next = b->next + i*shape + k;
156
+ if (bitmap_init(next, t->Record.types[k], 1, ctx) < 0) {
157
+ xnd_bitmap_clear(b);
158
+ return -1;
159
+ }
160
+ }
161
+ }
162
+
163
+ return 0;
164
+ }
165
+
166
+ case Ref: {
167
+ b->next = bitmap_array_new(nitems, ctx);
168
+ if (b->next == NULL) {
169
+ xnd_bitmap_clear(b);
170
+ return -1;
171
+ }
172
+ b->size = nitems;
173
+
174
+ for (i = 0; i < nitems; i++) {
175
+ next = b->next + i;
176
+ if (bitmap_init(next, t->Ref.type, 1, ctx) < 0) {
177
+ xnd_bitmap_clear(b);
178
+ return -1;
179
+ }
180
+ }
181
+
182
+ return 0;
183
+ }
184
+
185
+ case Constr: {
186
+ b->next = bitmap_array_new(nitems, ctx);
187
+ if (b->next == NULL) {
188
+ xnd_bitmap_clear(b);
189
+ return -1;
190
+ }
191
+ b->size = nitems;
192
+
193
+ for (i = 0; i < nitems; i++) {
194
+ next = b->next + i;
195
+ if (bitmap_init(next, t->Constr.type, 1, ctx) < 0) {
196
+ xnd_bitmap_clear(b);
197
+ return -1;
198
+ }
199
+ }
200
+
201
+ return 0;
202
+ }
203
+
204
+ case Nominal: {
205
+ b->next = bitmap_array_new(nitems, ctx);
206
+ if (b->next == NULL) {
207
+ xnd_bitmap_clear(b);
208
+ return -1;
209
+ }
210
+ b->size = nitems;
211
+
212
+ for (i = 0; i < nitems; i++) {
213
+ next = b->next + i;
214
+ if (bitmap_init(next, t->Nominal.type, 1, ctx) < 0) {
215
+ xnd_bitmap_clear(b);
216
+ return -1;
217
+ }
218
+ }
219
+
220
+ return 0;
221
+ }
222
+
223
+ default:
224
+ return 0;
225
+ }
226
+ }
227
+
228
+ int
229
+ xnd_bitmap_init(xnd_bitmap_t *b, const ndt_t *t, ndt_context_t *ctx)
230
+ {
231
+ return bitmap_init(b, t, 1, ctx);
232
+ }
233
+
234
+ void
235
+ xnd_bitmap_clear(xnd_bitmap_t *b)
236
+ {
237
+ int64_t i;
238
+
239
+ ndt_free(b->data);
240
+ b->data = NULL;
241
+
242
+ if (b->next) {
243
+ for (i = 0; i < b->size; i++) {
244
+ xnd_bitmap_clear(b->next + i);
245
+ }
246
+
247
+ ndt_free(b->next);
248
+ b->next = NULL;
249
+ }
250
+ }
251
+
252
+ xnd_bitmap_t
253
+ xnd_bitmap_next(const xnd_t *x, int64_t i, ndt_context_t *ctx)
254
+ {
255
+ const ndt_t *t = x->type;
256
+ xnd_bitmap_t next = {.data=NULL, .size=0, .next=NULL};
257
+ int64_t shape;
258
+
259
+ if (!ndt_subtree_is_optional(t)) {
260
+ return next;
261
+ }
262
+
263
+ if (x->bitmap.next == NULL) {
264
+ ndt_err_format(ctx, NDT_RuntimeError, "missing bitmap");
265
+ return next;
266
+ }
267
+
268
+ switch (t->tag) {
269
+ case Tuple:
270
+ shape = t->Tuple.shape;
271
+ break;
272
+ case Record:
273
+ shape = t->Record.shape;
274
+ break;
275
+ case Ref: case Constr: case Nominal:
276
+ shape = 1;
277
+ break;
278
+ default:
279
+ ndt_err_format(ctx, NDT_RuntimeError, "type has no subtree bitmaps");
280
+ return next;
281
+ }
282
+
283
+ if (i < 0 || i >= shape) {
284
+ ndt_err_format(ctx, NDT_ValueError, "invalid index");
285
+ return next;
286
+ }
287
+
288
+ return x->bitmap.next[x->index * shape + i];
289
+ }
290
+
291
+ void
292
+ xnd_set_valid(xnd_t *x)
293
+ {
294
+ const ndt_t *t = x->type;
295
+ int64_t n = x->index;
296
+
297
+ assert(ndt_is_optional(t));
298
+ assert(0 <= n);
299
+
300
+ x->bitmap.data[n / 8] |= ((uint8_t)1 << (n % 8));
301
+ }
302
+
303
+ void
304
+ xnd_set_na(xnd_t *x)
305
+ {
306
+ const ndt_t *t = x->type;
307
+ int64_t n = x->index;
308
+
309
+ assert(ndt_is_optional(t));
310
+ assert(0 <= n);
311
+
312
+ x->bitmap.data[n / 8] &= ~((uint8_t)1 << (n % 8));
313
+ }
314
+
315
+ static int
316
+ _xnd_is_valid(const xnd_t *x)
317
+ {
318
+ const ndt_t *t = x->type;
319
+ int64_t n = x->index;
320
+
321
+ assert(ndt_is_optional(t));
322
+ assert(0 <= n);
323
+
324
+ return x->bitmap.data[n / 8] & ((uint8_t)1 << (n % 8));
325
+ }
326
+
327
+ int
328
+ xnd_is_valid(const xnd_t *x)
329
+ {
330
+ if (!ndt_is_optional(x->type)) {
331
+ return 1;
332
+ }
333
+
334
+ return _xnd_is_valid(x);
335
+ }
336
+
337
+ int
338
+ xnd_is_na(const xnd_t *x)
339
+ {
340
+ if (!ndt_is_optional(x->type)) {
341
+ return 0;
342
+ }
343
+
344
+ return !_xnd_is_valid(x);
345
+ }