ndtypes 0.2.0dev5 → 0.2.0dev6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +12 -0
  3. data/Rakefile +8 -0
  4. data/ext/ruby_ndtypes/GPATH +0 -0
  5. data/ext/ruby_ndtypes/GRTAGS +0 -0
  6. data/ext/ruby_ndtypes/GTAGS +0 -0
  7. data/ext/ruby_ndtypes/extconf.rb +1 -1
  8. data/ext/ruby_ndtypes/include/ndtypes.h +231 -122
  9. data/ext/ruby_ndtypes/include/ruby_ndtypes.h +1 -1
  10. data/ext/ruby_ndtypes/lib/libndtypes.a +0 -0
  11. data/ext/ruby_ndtypes/lib/libndtypes.so.0.2.0dev3 +0 -0
  12. data/ext/ruby_ndtypes/ndtypes/Makefile +87 -0
  13. data/ext/ruby_ndtypes/ndtypes/config.h +68 -0
  14. data/ext/ruby_ndtypes/ndtypes/config.log +477 -0
  15. data/ext/ruby_ndtypes/ndtypes/config.status +1027 -0
  16. data/ext/ruby_ndtypes/ndtypes/doc/_static/style.css +7 -0
  17. data/ext/ruby_ndtypes/ndtypes/doc/_templates/layout.html +2 -0
  18. data/ext/ruby_ndtypes/ndtypes/doc/conf.py +40 -4
  19. data/ext/ruby_ndtypes/ndtypes/doc/images/xndlogo.png +0 -0
  20. data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/types.rst +1 -1
  21. data/ext/ruby_ndtypes/ndtypes/doc/requirements.txt +2 -0
  22. data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile +287 -0
  23. data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.in +20 -4
  24. data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.vc +22 -3
  25. data/ext/ruby_ndtypes/ndtypes/libndtypes/alloc.c +1 -1
  26. data/ext/ruby_ndtypes/ndtypes/libndtypes/alloc.o +0 -0
  27. data/ext/ruby_ndtypes/ndtypes/libndtypes/attr.o +0 -0
  28. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/Makefile +73 -0
  29. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.c +246 -229
  30. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.h +15 -11
  31. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.o +0 -0
  32. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.y +38 -28
  33. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.c +91 -91
  34. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.h +1 -1
  35. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.l +4 -3
  36. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.o +0 -0
  37. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/export.c +8 -7
  38. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/export.o +0 -0
  39. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/import.c +2 -2
  40. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/import.o +0 -0
  41. data/ext/ruby_ndtypes/ndtypes/libndtypes/context.o +0 -0
  42. data/ext/ruby_ndtypes/ndtypes/libndtypes/copy.c +263 -182
  43. data/ext/ruby_ndtypes/ndtypes/libndtypes/copy.o +0 -0
  44. data/ext/ruby_ndtypes/ndtypes/libndtypes/encodings.o +0 -0
  45. data/ext/ruby_ndtypes/ndtypes/libndtypes/equal.c +67 -7
  46. data/ext/ruby_ndtypes/ndtypes/libndtypes/equal.o +0 -0
  47. data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.c +1112 -1000
  48. data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.h +69 -58
  49. data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.o +0 -0
  50. data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.y +150 -99
  51. data/ext/ruby_ndtypes/ndtypes/libndtypes/io.c +185 -15
  52. data/ext/ruby_ndtypes/ndtypes/libndtypes/io.o +0 -0
  53. data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.c +301 -276
  54. data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.h +1 -1
  55. data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.l +9 -4
  56. data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.o +0 -0
  57. data/ext/ruby_ndtypes/ndtypes/libndtypes/libndtypes.a +0 -0
  58. data/ext/ruby_ndtypes/ndtypes/libndtypes/libndtypes.so +1 -0
  59. data/ext/ruby_ndtypes/ndtypes/libndtypes/libndtypes.so.0 +1 -0
  60. data/ext/ruby_ndtypes/ndtypes/libndtypes/libndtypes.so.0.2.0dev3 +0 -0
  61. data/ext/ruby_ndtypes/ndtypes/libndtypes/match.c +729 -228
  62. data/ext/ruby_ndtypes/ndtypes/libndtypes/match.o +0 -0
  63. data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.c +768 -403
  64. data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.h +1002 -0
  65. data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.h.in +231 -122
  66. data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.o +0 -0
  67. data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.c +176 -84
  68. data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.h +26 -14
  69. data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.o +0 -0
  70. data/ext/ruby_ndtypes/ndtypes/libndtypes/parser.c +57 -35
  71. data/ext/ruby_ndtypes/ndtypes/libndtypes/parser.o +0 -0
  72. data/ext/ruby_ndtypes/ndtypes/libndtypes/primitive.c +420 -0
  73. data/ext/ruby_ndtypes/ndtypes/libndtypes/primitive.o +0 -0
  74. data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.c +8 -8
  75. data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.h +1 -1
  76. data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.o +0 -0
  77. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/Makefile +48 -0
  78. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/deserialize.c +200 -116
  79. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/deserialize.o +0 -0
  80. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/serialize.c +46 -4
  81. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/serialize.o +0 -0
  82. data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.c +58 -27
  83. data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.h +1 -1
  84. data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.o +0 -0
  85. data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.c +3 -5
  86. data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.h +12 -4
  87. data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.o +0 -0
  88. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile +55 -0
  89. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.in +8 -8
  90. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.vc +5 -5
  91. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/runtest.c +274 -172
  92. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test.h +24 -4
  93. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_array.c +2 -2
  94. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_buffer.c +14 -14
  95. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_match.c +32 -30
  96. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse.c +37 -0
  97. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_error.c +36 -0
  98. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_roundtrip.c +16 -0
  99. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_record.c +5 -5
  100. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_typecheck.c +706 -253
  101. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_unify.c +132 -0
  102. data/ext/ruby_ndtypes/ndtypes/libndtypes/unify.c +703 -0
  103. data/ext/ruby_ndtypes/ndtypes/libndtypes/unify.o +0 -0
  104. data/ext/ruby_ndtypes/ndtypes/libndtypes/util.c +335 -127
  105. data/ext/ruby_ndtypes/ndtypes/libndtypes/util.o +0 -0
  106. data/ext/ruby_ndtypes/ndtypes/libndtypes/values.c +2 -2
  107. data/ext/ruby_ndtypes/ndtypes/libndtypes/values.o +0 -0
  108. data/ext/ruby_ndtypes/ndtypes/python/ndt_randtype.py +88 -71
  109. data/ext/ruby_ndtypes/ndtypes/python/ndt_support.py +0 -1
  110. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/__init__.py +10 -13
  111. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/_ndtypes.c +395 -314
  112. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/libndtypes.a +0 -0
  113. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/libndtypes.so +1 -0
  114. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/libndtypes.so.0 +1 -0
  115. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/libndtypes.so.0.2.0dev3 +0 -0
  116. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/ndtypes.h +1002 -0
  117. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/pyndtypes.h +15 -33
  118. data/ext/ruby_ndtypes/ndtypes/python/test_ndtypes.py +340 -132
  119. data/ext/ruby_ndtypes/ndtypes/setup.py +11 -2
  120. data/ext/ruby_ndtypes/ruby_ndtypes.c +364 -241
  121. data/ext/ruby_ndtypes/ruby_ndtypes.h +1 -1
  122. data/ext/ruby_ndtypes/ruby_ndtypes_internal.h +0 -1
  123. data/lib/ndtypes.rb +11 -0
  124. data/lib/ndtypes/version.rb +2 -2
  125. data/lib/ruby_ndtypes.so +0 -0
  126. data/ndtypes.gemspec +3 -0
  127. data/spec/ndtypes_spec.rb +6 -0
  128. metadata +98 -4
  129. data/ext/ruby_ndtypes/gc_guard.c +0 -36
  130. data/ext/ruby_ndtypes/gc_guard.h +0 -12
@@ -64,25 +64,37 @@ ndt_attr_t *mk_attr_from_seq(char *name, ndt_string_seq_t *seq, ndt_context_t *c
64
64
  /* Parser functions for creating types */
65
65
  /*****************************************************************************/
66
66
 
67
- ndt_t *mk_function(ndt_type_seq_t *in, ndt_type_seq_t *out, ndt_context_t *ctx);
67
+ const ndt_t *mk_module(char *name, const ndt_t *type, ndt_context_t *ctx);
68
+ const ndt_t *mk_function(ndt_type_seq_t *in, ndt_type_seq_t *out, ndt_context_t *ctx);
68
69
 
69
- ndt_t *mk_fortran(ndt_t *type, ndt_context_t *ctx);
70
- ndt_t *mk_contig(char *name, ndt_t *type, ndt_context_t *ctx);
71
- ndt_t *mk_fixed_dim_from_shape(char *v, ndt_t *type, ndt_context_t *ctx);
72
- ndt_t *mk_fixed_dim_from_attrs(ndt_attr_seq_t *attrs, ndt_t *type, ndt_context_t *ctx);
70
+ const ndt_t *mk_fortran(const ndt_t *type, ndt_context_t *ctx);
71
+ const ndt_t *mk_contig(char *name, ndt_t *type, ndt_context_t *ctx);
72
+ const ndt_t *mk_fixed_dim_from_shape(char *v, const ndt_t *type, ndt_context_t *ctx);
73
+ const ndt_t *mk_fixed_dim_from_attrs(ndt_attr_seq_t *attrs, const ndt_t *type, ndt_context_t *ctx);
73
74
 
74
- ndt_t *mk_var_dim(ndt_meta_t *m, ndt_attr_seq_t *seq, ndt_t *type, ndt_context_t *ctx);
75
- ndt_t *mk_var_ellipsis(ndt_t *type, ndt_context_t *ctx);
75
+ const ndt_t *mk_var_dim(ndt_attr_seq_t *seq, const ndt_t *type, bool opt, ndt_context_t *ctx);
76
+ const ndt_t *mk_var_ellipsis(const ndt_t *type, ndt_context_t *ctx);
76
77
 
77
- ndt_field_t *mk_field(char *name, ndt_t *type, ndt_attr_seq_t *seq, ndt_context_t *ctx);
78
- ndt_t *mk_tuple(enum ndt_variadic flag, ndt_field_seq_t *fields, ndt_attr_seq_t *attrs, ndt_context_t *ctx);
79
- ndt_t *mk_record(enum ndt_variadic flag, ndt_field_seq_t *fields, ndt_attr_seq_t *attrs, ndt_context_t *ctx);
78
+ const ndt_t *mk_ellipsis_dim(char *name, const ndt_t *type, ndt_context_t *ctx);
79
+ const ndt_t *mk_symbolic_dim(char *name, const ndt_t *type, ndt_context_t *ctx);
80
80
 
81
- ndt_t *mk_categorical(ndt_value_seq_t *seq, ndt_context_t *ctx);
81
+ const ndt_t *mk_array(const ndt_t *type, bool opt, ndt_context_t *ctx);
82
+ const ndt_t *mk_array_ellipsis(const ndt_t *type, ndt_context_t *ctx);
83
+
84
+ ndt_field_t *mk_field(char *name, const ndt_t *type, ndt_attr_seq_t *seq, ndt_context_t *ctx);
85
+ const ndt_t *mk_tuple(enum ndt_variadic flag, ndt_field_seq_t *fields, ndt_attr_seq_t *attrs, bool opt, ndt_context_t *ctx);
86
+ const ndt_t *mk_record(enum ndt_variadic flag, ndt_field_seq_t *fields, ndt_attr_seq_t *attrs, bool opt, ndt_context_t *ctx);
87
+ const ndt_t * mk_union(ndt_field_seq_t *fields, bool opt, ndt_context_t *ctx);
88
+
89
+ const ndt_t *mk_constr(char *name, const ndt_t *type, bool opt, ndt_context_t *ctx);
90
+ const ndt_t *mk_ref(const ndt_t *type, bool opt, ndt_context_t *ctx);
91
+
92
+ const ndt_t *mk_categorical(ndt_value_seq_t *seq, bool opt, ndt_context_t *ctx);
93
+
94
+ const ndt_t *mk_fixed_string(char *v, enum ndt_encoding encoding, bool opt, ndt_context_t *ctx);
95
+ const ndt_t *mk_bytes(ndt_attr_seq_t *seq, bool opt, ndt_context_t *ctx);
96
+ const ndt_t *mk_fixed_bytes(ndt_attr_seq_t *seq, bool opt, ndt_context_t *ctx);
82
97
 
83
- ndt_t *mk_fixed_string(char *v, enum ndt_encoding encoding, ndt_context_t *ctx);
84
- ndt_t *mk_bytes(ndt_attr_seq_t *seq, ndt_context_t *ctx);
85
- ndt_t *mk_fixed_bytes(ndt_attr_seq_t *seq, ndt_context_t *ctx);
86
98
 
87
99
 
88
100
  /* END LOCAL SCOPE */
@@ -63,11 +63,11 @@ ndt_fopen(const char *name, const char *mode)
63
63
  jmp_buf ndt_lexerror;
64
64
 
65
65
 
66
- static ndt_t *
67
- _ndt_from_fp(ndt_meta_t *m, FILE *fp, ndt_context_t *ctx)
66
+ static const ndt_t *
67
+ _ndt_from_fp(FILE *fp, ndt_context_t *ctx)
68
68
  {
69
69
  volatile yyscan_t scanner = NULL;
70
- ndt_t *ast = NULL;
70
+ const ndt_t *ast = NULL;
71
71
  int ret;
72
72
 
73
73
  if (setjmp(ndt_lexerror) == 0) {
@@ -80,7 +80,7 @@ _ndt_from_fp(ndt_meta_t *m, FILE *fp, ndt_context_t *ctx)
80
80
  ndt_yyset_in(fp, scanner);
81
81
  }
82
82
 
83
- ret = ndt_yyparse(scanner, &ast, m, ctx);
83
+ ret = ndt_yyparse(scanner, &ast, ctx);
84
84
  ndt_yylex_destroy(scanner);
85
85
 
86
86
  if (ret == 2) {
@@ -99,11 +99,11 @@ _ndt_from_fp(ndt_meta_t *m, FILE *fp, ndt_context_t *ctx)
99
99
  }
100
100
  }
101
101
 
102
- static ndt_t *
103
- _ndt_from_file(ndt_meta_t *m, const char *name, ndt_context_t *ctx)
102
+ static const ndt_t *
103
+ _ndt_from_file(const char *name, ndt_context_t *ctx)
104
104
  {
105
105
  FILE *fp;
106
- ndt_t *t;
106
+ const ndt_t *t;
107
107
 
108
108
  if (strcmp(name, "-") == 0) {
109
109
  fp = stdin;
@@ -116,32 +116,26 @@ _ndt_from_file(ndt_meta_t *m, const char *name, ndt_context_t *ctx)
116
116
  }
117
117
  }
118
118
 
119
- t = _ndt_from_fp(m, fp, ctx);
119
+ t = _ndt_from_fp(fp, ctx);
120
120
  fclose(fp);
121
121
 
122
122
  return t;
123
123
  }
124
124
 
125
- ndt_t *
125
+ const ndt_t *
126
126
  ndt_from_file(const char *name, ndt_context_t *ctx)
127
127
  {
128
- return _ndt_from_file(NULL, name, ctx);
128
+ return _ndt_from_file(name, ctx);
129
129
  }
130
130
 
131
- ndt_t *
132
- ndt_from_file_fill_meta(ndt_meta_t *m, const char *name, ndt_context_t *ctx)
133
- {
134
- return _ndt_from_file(m, name, ctx);
135
- }
136
-
137
- static ndt_t *
138
- _ndt_from_string(ndt_meta_t *m, const char *input, ndt_context_t *ctx)
131
+ static const ndt_t *
132
+ _ndt_from_string(const char *input, ndt_context_t *ctx)
139
133
  {
140
134
  volatile yyscan_t scanner = NULL;
141
135
  volatile YY_BUFFER_STATE state = NULL;
142
136
  char *buffer;
143
137
  size_t size;
144
- ndt_t *ast = NULL;
138
+ const ndt_t *ast = NULL;
145
139
  int ret;
146
140
 
147
141
  size = strlen(input);
@@ -170,7 +164,7 @@ _ndt_from_string(ndt_meta_t *m, const char *input, ndt_context_t *ctx)
170
164
  state->yy_bs_lineno = 1;
171
165
  state->yy_bs_column = 1;
172
166
 
173
- ret = ndt_yyparse(scanner, &ast, m, ctx);
167
+ ret = ndt_yyparse(scanner, &ast, ctx);
174
168
  ndt_yy_delete_buffer(state, scanner);
175
169
  ndt_yylex_destroy(scanner);
176
170
  ndt_free(buffer);
@@ -194,32 +188,27 @@ _ndt_from_string(ndt_meta_t *m, const char *input, ndt_context_t *ctx)
194
188
  }
195
189
  }
196
190
 
197
- ndt_t *
191
+ const ndt_t *
198
192
  ndt_from_string(const char *input, ndt_context_t *ctx)
199
193
  {
200
- return _ndt_from_string(NULL, input, ctx);
194
+ return _ndt_from_string(input, ctx);
201
195
  }
202
196
 
203
- ndt_t *
197
+ const ndt_t *
204
198
  ndt_from_string_v(const char *input, ndt_context_t *ctx)
205
199
  {
206
- ndt_t *t = _ndt_from_string(NULL, input, ctx);
200
+ const ndt_t *t = _ndt_from_string(input, ctx);
207
201
  if (t == NULL) {
208
202
  ndt_err_append(ctx, input);
209
203
  }
210
204
  return t;
211
205
  }
212
206
 
213
- ndt_t *
214
- ndt_from_string_fill_meta(ndt_meta_t *m, const char *input, ndt_context_t *ctx)
215
- {
216
- return _ndt_from_string(m, input, ctx);
217
- }
218
-
219
- ndt_t *
207
+ const ndt_t *
220
208
  ndt_from_metadata_and_dtype(const ndt_meta_t *m, const char *dtype, ndt_context_t *ctx)
221
209
  {
222
- ndt_t *t, *type;
210
+ const ndt_t *t;
211
+ const ndt_t *type;
223
212
  int i;
224
213
 
225
214
  type = ndt_from_string(dtype, ctx);
@@ -230,17 +219,50 @@ ndt_from_metadata_and_dtype(const ndt_meta_t *m, const char *dtype, ndt_context_
230
219
  if (ndt_is_abstract(type)) {
231
220
  ndt_err_format(ctx, NDT_InvalidArgumentError,
232
221
  "cannot create abstract type with offsets");
233
- ndt_del(type);
222
+ ndt_decref(type);
223
+ return NULL;
224
+ }
225
+
226
+ for (i=0, t=type; i < m->ndims; i++, type=t) {
227
+ t = ndt_var_dim(type, m->offsets[i], 0, NULL, false,
228
+ ctx);
229
+ ndt_decref(type);
230
+ if (t == NULL) {
231
+ return NULL;
232
+ }
233
+ }
234
+
235
+ return t;
236
+ }
237
+
238
+ const ndt_t *
239
+ ndt_from_metadata_opt_and_dtype(const ndt_meta_t *m, bool *opt, const ndt_t *dtype,
240
+ ndt_context_t *ctx)
241
+ {
242
+ const ndt_t *t;
243
+ const ndt_t *type;
244
+ int i;
245
+
246
+ if (ndt_is_abstract(dtype)) {
247
+ ndt_err_format(ctx, NDT_InvalidArgumentError,
248
+ "cannot create abstract type with offsets");
249
+ ndt_free(opt);
234
250
  return NULL;
235
251
  }
236
252
 
253
+ type = dtype;
254
+ ndt_incref(type);
255
+
237
256
  for (i=0, t=type; i < m->ndims; i++, type=t) {
238
- t = ndt_var_dim(type, ExternalOffsets, m->noffsets[i], m->offsets[i],
239
- 0, NULL, ctx);
257
+ t = ndt_var_dim(type, m->offsets[i], 0, NULL, opt[i],
258
+ ctx);
259
+ ndt_decref(type);
240
260
  if (t == NULL) {
261
+ ndt_free(opt);
241
262
  return NULL;
242
263
  }
243
264
  }
244
265
 
266
+ ndt_free(opt);
245
267
  return t;
246
268
  }
@@ -0,0 +1,420 @@
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
+ #ifdef _MSC_VER
35
+ #include <windows.h>
36
+ #endif
37
+
38
+ #include <stdlib.h>
39
+ #include <string.h>
40
+ #include <stdint.h>
41
+ #include <inttypes.h>
42
+ #include <stdbool.h>
43
+ #include <complex.h>
44
+ #include <assert.h>
45
+ #include "ndtypes.h"
46
+
47
+
48
+ /******************************************************************************/
49
+ /* Primitive types */
50
+ /******************************************************************************/
51
+
52
+ typedef bool bool_t;
53
+ #undef bool
54
+
55
+ #define NDT_PRIMITIVE(name, _tag, _access, _flags, _size, _align) \
56
+ static const ndt_t ndt_##name = { \
57
+ .tag = _tag, \
58
+ .access = _access, \
59
+ .flags = _flags, \
60
+ .ndim = 0, \
61
+ .datasize = _size, \
62
+ .align = _align, \
63
+ .refcnt = 1 \
64
+ };
65
+
66
+ #define NDT_PRIMITIVE_LE(name, _tag, _access, _flags, _size, _align) \
67
+ static const ndt_t ndt_##name##_le = { \
68
+ .tag = _tag, \
69
+ .access = _access, \
70
+ .flags = _flags|NDT_LITTLE_ENDIAN, \
71
+ .ndim = 0, \
72
+ .datasize = _size, \
73
+ .align = _align, \
74
+ .refcnt = 1 \
75
+ };
76
+
77
+ #define NDT_PRIMITIVE_BE(name, _tag, _access, _flags, _size, _align) \
78
+ static const ndt_t ndt_##name##_be = { \
79
+ .tag = _tag, \
80
+ .access = _access, \
81
+ .flags = _flags|NDT_BIG_ENDIAN, \
82
+ .ndim = 0, \
83
+ .datasize = _size, \
84
+ .align = _align, \
85
+ .refcnt = 1 \
86
+ };
87
+
88
+ #define NDT_PRIMITIVE_OPT(name, _tag, _access, _flags, _size, _align) \
89
+ static const ndt_t ndt_##name##_opt = { \
90
+ .tag = _tag, \
91
+ .access = _access, \
92
+ .flags = _flags|NDT_OPTION, \
93
+ .ndim = 0, \
94
+ .datasize = _size, \
95
+ .align = _align, \
96
+ .refcnt = 1 \
97
+ };
98
+
99
+ #define NDT_PRIMITIVE_OPT_LE(name, _tag, _access, _flags, _size, _align) \
100
+ static const ndt_t ndt_##name##_opt_le = { \
101
+ .tag = _tag, \
102
+ .access = _access, \
103
+ .flags = _flags|NDT_OPTION|NDT_LITTLE_ENDIAN, \
104
+ .ndim = 0, \
105
+ .datasize = _size, \
106
+ .align = _align, \
107
+ .refcnt = 1 \
108
+ };
109
+
110
+ #define NDT_PRIMITIVE_OPT_BE(name, _tag, _access, _flags, _size, _align) \
111
+ static const ndt_t ndt_##name##_opt_be = { \
112
+ .tag = _tag, \
113
+ .access = _access, \
114
+ .flags = _flags|NDT_OPTION|NDT_BIG_ENDIAN, \
115
+ .ndim = 0, \
116
+ .datasize = _size, \
117
+ .align = _align, \
118
+ .refcnt = 1 \
119
+ };
120
+
121
+ #define NDT_PRIMITIVE_ALL(name, _tag, _size, _align) \
122
+ NDT_PRIMITIVE(name, _tag, Concrete, 0, _size, _align) \
123
+ NDT_PRIMITIVE_LE(name, _tag, Concrete, 0, _size, _align) \
124
+ NDT_PRIMITIVE_BE(name, _tag, Concrete, 0, _size, _align) \
125
+ NDT_PRIMITIVE_OPT(name, _tag, Concrete, 0, _size, _align) \
126
+ NDT_PRIMITIVE_OPT_LE(name, _tag, Concrete, 0, _size, _align) \
127
+ NDT_PRIMITIVE_OPT_BE(name, _tag, Concrete, 0, _size, _align)
128
+
129
+ #define NDT_PRIMITIVE_KIND_ALL(name, _tag) \
130
+ NDT_PRIMITIVE(name, _tag, Abstract, 0, 0, UINT16_MAX) \
131
+ NDT_PRIMITIVE_LE(name, _tag, Abstract, 0, 0, UINT16_MAX) \
132
+ NDT_PRIMITIVE_BE(name, _tag, Abstract, 0, 0, UINT16_MAX) \
133
+ NDT_PRIMITIVE_OPT(name, _tag, Abstract, 0, 0, UINT16_MAX) \
134
+ NDT_PRIMITIVE_OPT_LE(name, _tag, Abstract, 0, 0, UINT16_MAX) \
135
+ NDT_PRIMITIVE_OPT_BE(name, _tag, Abstract, 0, 0, UINT16_MAX)
136
+
137
+
138
+ NDT_PRIMITIVE_ALL(bool, Bool, sizeof(bool_t), alignof(bool_t))
139
+
140
+ NDT_PRIMITIVE_KIND_ALL(signed_set, SignedKind)
141
+ NDT_PRIMITIVE_ALL(int8, Int8, sizeof(int8_t), alignof(int8_t))
142
+ NDT_PRIMITIVE_ALL(int16, Int16, sizeof(int16_t), alignof(int16_t))
143
+ NDT_PRIMITIVE_ALL(int32, Int32, sizeof(int32_t), alignof(int32_t))
144
+ NDT_PRIMITIVE_ALL(int64, Int64, sizeof(int64_t), alignof(int64_t))
145
+
146
+ NDT_PRIMITIVE_KIND_ALL(unsigned_set, UnsignedKind)
147
+ NDT_PRIMITIVE_ALL(uint8, Uint8, sizeof(uint8_t), alignof(uint8_t))
148
+ NDT_PRIMITIVE_ALL(uint16, Uint16, sizeof(uint16_t), alignof(uint16_t))
149
+ NDT_PRIMITIVE_ALL(uint32, Uint32, sizeof(uint32_t), alignof(uint32_t))
150
+ NDT_PRIMITIVE_ALL(uint64, Uint64, sizeof(uint64_t), alignof(uint64_t))
151
+
152
+ NDT_PRIMITIVE_KIND_ALL(float_set, FloatKind)
153
+ NDT_PRIMITIVE_ALL(bfloat16, BFloat16, 2, 2)
154
+ NDT_PRIMITIVE_ALL(float16, Float16, 2, 2)
155
+ NDT_PRIMITIVE_ALL(float32, Float32, sizeof(float), alignof(float))
156
+ NDT_PRIMITIVE_ALL(float64, Float64, sizeof(double), alignof(double))
157
+
158
+ NDT_PRIMITIVE_KIND_ALL(complex_set, ComplexKind)
159
+ NDT_PRIMITIVE_ALL(bcomplex32, BComplex32, 4, 2)
160
+ NDT_PRIMITIVE_ALL(complex32, Complex32, 4, 2)
161
+ NDT_PRIMITIVE_ALL(complex64, Complex64, sizeof(ndt_complex64_t), alignof(ndt_complex64_t))
162
+ NDT_PRIMITIVE_ALL(complex128, Complex128, sizeof(ndt_complex128_t), alignof(ndt_complex128_t))
163
+
164
+ NDT_PRIMITIVE(str, String, Concrete, NDT_POINTER, sizeof(char *), alignof(char *))
165
+ NDT_PRIMITIVE_OPT(str, String, Concrete, NDT_POINTER, sizeof(char *), alignof(char *))
166
+
167
+
168
+ const ndt_t *
169
+ ndt_string(bool_t opt, ndt_context_t *ctx)
170
+ {
171
+ (void)ctx;
172
+
173
+ return opt ? &ndt_str_opt : &ndt_str;
174
+ }
175
+
176
+ const ndt_t *
177
+ ndt_signed_kind(uint32_t flags, ndt_context_t *ctx)
178
+ {
179
+ return ndt_primitive(SignedKind, flags, ctx);
180
+ }
181
+
182
+ const ndt_t *
183
+ ndt_unsigned_kind(uint32_t flags, ndt_context_t *ctx)
184
+ {
185
+ return ndt_primitive(UnsignedKind, flags, ctx);
186
+ }
187
+
188
+ const ndt_t *
189
+ ndt_float_kind(uint32_t flags, ndt_context_t *ctx)
190
+ {
191
+ return ndt_primitive(FloatKind, flags, ctx);
192
+ }
193
+
194
+ const ndt_t *
195
+ ndt_complex_kind(uint32_t flags, ndt_context_t *ctx)
196
+ {
197
+ return ndt_primitive(ComplexKind, flags, ctx);
198
+ }
199
+
200
+ const ndt_t *
201
+ ndt_primitive(enum ndt tag, uint32_t flags, ndt_context_t *ctx)
202
+ {
203
+ switch(flags) {
204
+ case 0: {
205
+ switch(tag) {
206
+ case Bool: return &ndt_bool;
207
+
208
+ case SignedKind: return &ndt_signed_set;
209
+ case Int8: return &ndt_int8;
210
+ case Int16: return &ndt_int16;
211
+ case Int32: return &ndt_int32;
212
+ case Int64: return &ndt_int64;
213
+
214
+ case UnsignedKind: return &ndt_unsigned_set;
215
+ case Uint8: return &ndt_uint8;
216
+ case Uint16: return &ndt_uint16;
217
+ case Uint32: return &ndt_uint32;
218
+ case Uint64: return &ndt_uint64;
219
+
220
+ case FloatKind: return &ndt_float_set;
221
+ case BFloat16: return &ndt_bfloat16;
222
+ case Float16: return &ndt_float16;
223
+ case Float32: return &ndt_float32;
224
+ case Float64: return &ndt_float64;
225
+
226
+ case ComplexKind: return &ndt_complex_set;
227
+ case BComplex32: return &ndt_bcomplex32;
228
+ case Complex32: return &ndt_complex32;
229
+ case Complex64: return &ndt_complex64;
230
+ case Complex128: return &ndt_complex128;
231
+
232
+ default: goto value_error_tag;
233
+ }
234
+ }
235
+
236
+ case NDT_LITTLE_ENDIAN: {
237
+ switch(tag) {
238
+ case Bool: return &ndt_bool_le;
239
+
240
+ case SignedKind: return &ndt_signed_set_le;
241
+ case Int8: return &ndt_int8_le;
242
+ case Int16: return &ndt_int16_le;
243
+ case Int32: return &ndt_int32_le;
244
+ case Int64: return &ndt_int64_le;
245
+
246
+ case UnsignedKind: return &ndt_unsigned_set_le;
247
+ case Uint8: return &ndt_uint8_le;
248
+ case Uint16: return &ndt_uint16_le;
249
+ case Uint32: return &ndt_uint32_le;
250
+ case Uint64: return &ndt_uint64_le;
251
+
252
+ case FloatKind: return &ndt_float_set_le;
253
+ case BFloat16: return &ndt_bfloat16_le;
254
+ case Float16: return &ndt_float16_le;
255
+ case Float32: return &ndt_float32_le;
256
+ case Float64: return &ndt_float64_le;
257
+
258
+ case ComplexKind: return &ndt_complex_set_le;
259
+ case BComplex32: return &ndt_bcomplex32_le;
260
+ case Complex32: return &ndt_complex32_le;
261
+ case Complex64: return &ndt_complex64_le;
262
+ case Complex128: return &ndt_complex128_le;
263
+
264
+ default: goto value_error_tag;
265
+ }
266
+ }
267
+
268
+ case NDT_BIG_ENDIAN: {
269
+ switch(tag) {
270
+ case Bool: return &ndt_bool_be;
271
+
272
+ case SignedKind: return &ndt_signed_set_be;
273
+ case Int8: return &ndt_int8_be;
274
+ case Int16: return &ndt_int16_be;
275
+ case Int32: return &ndt_int32_be;
276
+ case Int64: return &ndt_int64_be;
277
+
278
+ case UnsignedKind: return &ndt_unsigned_set_be;
279
+ case Uint8: return &ndt_uint8_be;
280
+ case Uint16: return &ndt_uint16_be;
281
+ case Uint32: return &ndt_uint32_be;
282
+ case Uint64: return &ndt_uint64_be;
283
+
284
+ case FloatKind: return &ndt_float_set_be;
285
+ case BFloat16: return &ndt_bfloat16_be;
286
+ case Float16: return &ndt_float16_be;
287
+ case Float32: return &ndt_float32_be;
288
+ case Float64: return &ndt_float64_be;
289
+
290
+ case ComplexKind: return &ndt_complex_set_be;
291
+ case BComplex32: return &ndt_bcomplex32_be;
292
+ case Complex32: return &ndt_complex32_be;
293
+ case Complex64: return &ndt_complex64_be;
294
+ case Complex128: return &ndt_complex128_be;
295
+
296
+ default: goto value_error_tag;
297
+ }
298
+ }
299
+
300
+ case NDT_OPTION: {
301
+ switch(tag) {
302
+ case Bool: return &ndt_bool_opt;
303
+
304
+ case SignedKind: return &ndt_signed_set_opt;
305
+ case Int8: return &ndt_int8_opt;
306
+ case Int16: return &ndt_int16_opt;
307
+ case Int32: return &ndt_int32_opt;
308
+ case Int64: return &ndt_int64_opt;
309
+
310
+ case UnsignedKind: return &ndt_unsigned_set_opt;
311
+ case Uint8: return &ndt_uint8_opt;
312
+ case Uint16: return &ndt_uint16_opt;
313
+ case Uint32: return &ndt_uint32_opt;
314
+ case Uint64: return &ndt_uint64_opt;
315
+
316
+ case FloatKind: return &ndt_float_set_opt;
317
+ case BFloat16: return &ndt_bfloat16_opt;
318
+ case Float16: return &ndt_float16_opt;
319
+ case Float32: return &ndt_float32_opt;
320
+ case Float64: return &ndt_float64_opt;
321
+
322
+ case ComplexKind: return &ndt_complex_set_opt;
323
+ case BComplex32: return &ndt_bcomplex32_opt;
324
+ case Complex32: return &ndt_complex32_opt;
325
+ case Complex64: return &ndt_complex64_opt;
326
+ case Complex128: return &ndt_complex128_opt;
327
+
328
+ default: goto value_error_tag;
329
+ }
330
+ }
331
+
332
+ case NDT_OPTION|NDT_LITTLE_ENDIAN: {
333
+ switch(tag) {
334
+ case Bool: return &ndt_bool_opt_le;
335
+
336
+ case SignedKind: return &ndt_signed_set_opt_le;
337
+ case Int8: return &ndt_int8_opt_le;
338
+ case Int16: return &ndt_int16_opt_le;
339
+ case Int32: return &ndt_int32_opt_le;
340
+ case Int64: return &ndt_int64_opt_le;
341
+
342
+ case UnsignedKind: return &ndt_unsigned_set_opt_le;
343
+ case Uint8: return &ndt_uint8_opt_le;
344
+ case Uint16: return &ndt_uint16_opt_le;
345
+ case Uint32: return &ndt_uint32_opt_le;
346
+ case Uint64: return &ndt_uint64_opt_le;
347
+
348
+ case FloatKind: return &ndt_float_set_opt_le;
349
+ case BFloat16: return &ndt_bfloat16_opt_le;
350
+ case Float16: return &ndt_float16_opt_le;
351
+ case Float32: return &ndt_float32_opt_le;
352
+ case Float64: return &ndt_float64_opt_le;
353
+
354
+ case ComplexKind: return &ndt_complex_set_opt_le;
355
+ case BComplex32: return &ndt_bcomplex32_opt_le;
356
+ case Complex32: return &ndt_complex32_opt_le;
357
+ case Complex64: return &ndt_complex64_opt_le;
358
+ case Complex128: return &ndt_complex128_opt_le;
359
+ default: goto value_error_tag;
360
+ }
361
+ }
362
+
363
+ case NDT_OPTION|NDT_BIG_ENDIAN: {
364
+ switch(tag) {
365
+ case Bool: return &ndt_bool_opt_be;
366
+
367
+ case SignedKind: return &ndt_signed_set_opt_be;
368
+ case Int8: return &ndt_int8_opt_be;
369
+ case Int16: return &ndt_int16_opt_be;
370
+ case Int32: return &ndt_int32_opt_be;
371
+ case Int64: return &ndt_int64_opt_be;
372
+
373
+ case UnsignedKind: return &ndt_unsigned_set_opt_be;
374
+ case Uint8: return &ndt_uint8_opt_be;
375
+ case Uint16: return &ndt_uint16_opt_be;
376
+ case Uint32: return &ndt_uint32_opt_be;
377
+ case Uint64: return &ndt_uint64_opt_be;
378
+
379
+ case FloatKind: return &ndt_float_set_opt_be;
380
+ case BFloat16: return &ndt_bfloat16_opt_be;
381
+ case Float16: return &ndt_float16_opt_be;
382
+ case Float32: return &ndt_float32_opt_be;
383
+ case Float64: return &ndt_float64_opt_be;
384
+
385
+ case ComplexKind: return &ndt_complex_set_opt_be;
386
+ case BComplex32: return &ndt_bcomplex32_opt_be;
387
+ case Complex32: return &ndt_complex32_opt_be;
388
+ case Complex64: return &ndt_complex64_opt_be;
389
+ case Complex128: return &ndt_complex128_opt_be;
390
+
391
+ default: goto value_error_tag;
392
+ }
393
+ }
394
+
395
+ case NDT_POINTER: {
396
+ switch(tag) {
397
+ case String: return &ndt_str;
398
+ default: goto value_error_tag;
399
+ }
400
+ }
401
+
402
+ case NDT_POINTER|NDT_OPTION: {
403
+ switch(tag) {
404
+ case String: return &ndt_str_opt;
405
+ default: goto value_error_tag;
406
+ }
407
+ }
408
+
409
+ default:
410
+ goto value_error_flags;
411
+ }
412
+
413
+ value_error_tag:
414
+ ndt_err_format(ctx, NDT_ValueError, "not a primitive type");
415
+ return NULL;
416
+
417
+ value_error_flags:
418
+ ndt_err_format(ctx, NDT_ValueError, "invalid type flags");
419
+ return NULL;
420
+ }