1 #include "vctrs.h"
2 #include "utils.h"
3
4 /**
5 * Type for symmetric binary dispatch.
6 *
7 * Permuting `x` and `y` does not change the typeof2.
8 *
9 * After adding entries in `vec_typeof2()`, adjust the list of types
10 * in helper-types.R. This will ensure the consistency of the new
11 * entries.
12 */
13
14 /**
15 * [[ include("utils.h") ]]
16 *
17 * @param left Output parameter. Set to 1 when the common type comes
18 * from the left, 0 when it comes from the right, and -1 when it
19 * comes from both sides. This means that "left" is the default
20 * when coerced to a boolean value.
21 */
vec_typeof2_impl(enum vctrs_type type_x,enum vctrs_type type_y,int * left)22 enum vctrs_type2 vec_typeof2_impl(enum vctrs_type type_x,
23 enum vctrs_type type_y,
24 int* left) {
25 switch (type_x) {
26 case vctrs_type_null: {
27 switch (type_y) {
28 case vctrs_type_null: *left = -1; return vctrs_type2_null_null;
29 case vctrs_type_unspecified: *left = 0; return vctrs_type2_null_unspecified;
30 case vctrs_type_logical: *left = 0; return vctrs_type2_null_logical;
31 case vctrs_type_integer: *left = 0; return vctrs_type2_null_integer;
32 case vctrs_type_double: *left = 0; return vctrs_type2_null_double;
33 case vctrs_type_complex: *left = 0; return vctrs_type2_null_complex;
34 case vctrs_type_character: *left = 0; return vctrs_type2_null_character;
35 case vctrs_type_raw: *left = 0; return vctrs_type2_null_raw;
36 case vctrs_type_list: *left = 0; return vctrs_type2_null_list;
37 case vctrs_type_dataframe: *left = 0; return vctrs_type2_null_dataframe;
38 case vctrs_type_s3: *left = 0; return vctrs_type2_null_s3;
39 case vctrs_type_scalar: *left = 0; return vctrs_type2_null_scalar;
40 }
41 }
42 case vctrs_type_unspecified: {
43 switch (type_y) {
44 case vctrs_type_null: *left = 1; return vctrs_type2_null_unspecified;
45 case vctrs_type_unspecified: *left = -1; return vctrs_type2_unspecified_unspecified;
46 case vctrs_type_logical: *left = 0; return vctrs_type2_unspecified_logical;
47 case vctrs_type_integer: *left = 0; return vctrs_type2_unspecified_integer;
48 case vctrs_type_double: *left = 0; return vctrs_type2_unspecified_double;
49 case vctrs_type_complex: *left = 0; return vctrs_type2_unspecified_complex;
50 case vctrs_type_character: *left = 0; return vctrs_type2_unspecified_character;
51 case vctrs_type_raw: *left = 0; return vctrs_type2_unspecified_raw;
52 case vctrs_type_list: *left = 0; return vctrs_type2_unspecified_list;
53 case vctrs_type_dataframe: *left = 0; return vctrs_type2_unspecified_dataframe;
54 case vctrs_type_s3: *left = 0; return vctrs_type2_unspecified_s3;
55 case vctrs_type_scalar: *left = 0; return vctrs_type2_unspecified_scalar;
56 }
57 }
58 case vctrs_type_logical: {
59 switch (type_y) {
60 case vctrs_type_null: *left = 1; return vctrs_type2_null_logical;
61 case vctrs_type_unspecified: *left = 1; return vctrs_type2_unspecified_logical;
62 case vctrs_type_logical: *left = -1; return vctrs_type2_logical_logical;
63 case vctrs_type_integer: *left = 0; return vctrs_type2_logical_integer;
64 case vctrs_type_double: *left = 0; return vctrs_type2_logical_double;
65 case vctrs_type_complex: *left = 0; return vctrs_type2_logical_complex;
66 case vctrs_type_character: *left = 0; return vctrs_type2_logical_character;
67 case vctrs_type_raw: *left = 0; return vctrs_type2_logical_raw;
68 case vctrs_type_list: *left = 0; return vctrs_type2_logical_list;
69 case vctrs_type_dataframe: *left = 0; return vctrs_type2_logical_dataframe;
70 case vctrs_type_s3: *left = 0; return vctrs_type2_logical_s3;
71 case vctrs_type_scalar: *left = 0; return vctrs_type2_logical_scalar;
72 }
73 }
74 case vctrs_type_integer: {
75 switch (type_y) {
76 case vctrs_type_null: *left = 1; return vctrs_type2_null_integer;
77 case vctrs_type_unspecified: *left = 1; return vctrs_type2_unspecified_integer;
78 case vctrs_type_logical: *left = 1; return vctrs_type2_logical_integer;
79 case vctrs_type_integer: *left = -1; return vctrs_type2_integer_integer;
80 case vctrs_type_double: *left = 0; return vctrs_type2_integer_double;
81 case vctrs_type_complex: *left = 0; return vctrs_type2_integer_complex;
82 case vctrs_type_character: *left = 0; return vctrs_type2_integer_character;
83 case vctrs_type_raw: *left = 0; return vctrs_type2_integer_raw;
84 case vctrs_type_list: *left = 0; return vctrs_type2_integer_list;
85 case vctrs_type_dataframe: *left = 0; return vctrs_type2_integer_dataframe;
86 case vctrs_type_s3: *left = 0; return vctrs_type2_integer_s3;
87 case vctrs_type_scalar: *left = 0; return vctrs_type2_integer_scalar;
88 }
89 }
90 case vctrs_type_double: {
91 switch (type_y) {
92 case vctrs_type_null: *left = 1; return vctrs_type2_null_double;
93 case vctrs_type_unspecified: *left = 1; return vctrs_type2_unspecified_double;
94 case vctrs_type_logical: *left = 1; return vctrs_type2_logical_double;
95 case vctrs_type_integer: *left = 1; return vctrs_type2_integer_double;
96 case vctrs_type_double: *left = -1; return vctrs_type2_double_double;
97 case vctrs_type_complex: *left = 0; return vctrs_type2_double_complex;
98 case vctrs_type_character: *left = 0; return vctrs_type2_double_character;
99 case vctrs_type_raw: *left = 0; return vctrs_type2_double_raw;
100 case vctrs_type_list: *left = 0; return vctrs_type2_double_list;
101 case vctrs_type_dataframe: *left = 0; return vctrs_type2_double_dataframe;
102 case vctrs_type_s3: *left = 0; return vctrs_type2_double_s3;
103 case vctrs_type_scalar: *left = 0; return vctrs_type2_double_scalar;
104 }
105 }
106 case vctrs_type_complex: {
107 switch (type_y) {
108 case vctrs_type_null: *left = 1; return vctrs_type2_null_complex;
109 case vctrs_type_unspecified: *left = 1; return vctrs_type2_unspecified_complex;
110 case vctrs_type_logical: *left = 1; return vctrs_type2_logical_complex;
111 case vctrs_type_integer: *left = 1; return vctrs_type2_integer_complex;
112 case vctrs_type_double: *left = 1; return vctrs_type2_double_complex;
113 case vctrs_type_complex: *left = -1; return vctrs_type2_complex_complex;
114 case vctrs_type_character: *left = 0; return vctrs_type2_complex_character;
115 case vctrs_type_raw: *left = 0; return vctrs_type2_complex_raw;
116 case vctrs_type_list: *left = 0; return vctrs_type2_complex_list;
117 case vctrs_type_dataframe: *left = 0; return vctrs_type2_complex_dataframe;
118 case vctrs_type_s3: *left = 0; return vctrs_type2_complex_s3;
119 case vctrs_type_scalar: *left = 0; return vctrs_type2_complex_scalar;
120 }
121 }
122 case vctrs_type_character: {
123 switch (type_y) {
124 case vctrs_type_null: *left = 1; return vctrs_type2_null_character;
125 case vctrs_type_unspecified: *left = 1; return vctrs_type2_unspecified_character;
126 case vctrs_type_logical: *left = 1; return vctrs_type2_logical_character;
127 case vctrs_type_integer: *left = 1; return vctrs_type2_integer_character;
128 case vctrs_type_double: *left = 1; return vctrs_type2_double_character;
129 case vctrs_type_complex: *left = 1; return vctrs_type2_complex_character;
130 case vctrs_type_character: *left = -1; return vctrs_type2_character_character;
131 case vctrs_type_raw: *left = 0; return vctrs_type2_character_raw;
132 case vctrs_type_list: *left = 0; return vctrs_type2_character_list;
133 case vctrs_type_dataframe: *left = 0; return vctrs_type2_character_dataframe;
134 case vctrs_type_s3: *left = 0; return vctrs_type2_character_s3;
135 case vctrs_type_scalar: *left = 0; return vctrs_type2_character_scalar;
136 }
137 }
138 case vctrs_type_raw: {
139 switch (type_y) {
140 case vctrs_type_null: *left = 1; return vctrs_type2_null_raw;
141 case vctrs_type_unspecified: *left = 1; return vctrs_type2_unspecified_raw;
142 case vctrs_type_logical: *left = 1; return vctrs_type2_logical_raw;
143 case vctrs_type_integer: *left = 1; return vctrs_type2_integer_raw;
144 case vctrs_type_double: *left = 1; return vctrs_type2_double_raw;
145 case vctrs_type_complex: *left = 1; return vctrs_type2_complex_raw;
146 case vctrs_type_character: *left = 1; return vctrs_type2_character_raw;
147 case vctrs_type_raw: *left = -1; return vctrs_type2_raw_raw;
148 case vctrs_type_list: *left = 0; return vctrs_type2_raw_list;
149 case vctrs_type_dataframe: *left = 0; return vctrs_type2_raw_dataframe;
150 case vctrs_type_s3: *left = 0; return vctrs_type2_raw_s3;
151 case vctrs_type_scalar: *left = 0; return vctrs_type2_raw_scalar;
152 }
153 }
154 case vctrs_type_list: {
155 switch (type_y) {
156 case vctrs_type_null: *left = 1; return vctrs_type2_null_list;
157 case vctrs_type_unspecified: *left = 1; return vctrs_type2_unspecified_list;
158 case vctrs_type_logical: *left = 1; return vctrs_type2_logical_list;
159 case vctrs_type_integer: *left = 1; return vctrs_type2_integer_list;
160 case vctrs_type_double: *left = 1; return vctrs_type2_double_list;
161 case vctrs_type_complex: *left = 1; return vctrs_type2_complex_list;
162 case vctrs_type_character: *left = 1; return vctrs_type2_character_list;
163 case vctrs_type_raw: *left = 1; return vctrs_type2_raw_list;
164 case vctrs_type_list: *left = -1; return vctrs_type2_list_list;
165 case vctrs_type_dataframe: *left = 0; return vctrs_type2_list_dataframe;
166 case vctrs_type_s3: *left = 0; return vctrs_type2_list_s3;
167 case vctrs_type_scalar: *left = 0; return vctrs_type2_list_scalar;
168 }
169 }
170 case vctrs_type_dataframe: {
171 switch (type_y) {
172 case vctrs_type_null: *left = 1; return vctrs_type2_null_dataframe;
173 case vctrs_type_unspecified: *left = 1; return vctrs_type2_unspecified_dataframe;
174 case vctrs_type_logical: *left = 1; return vctrs_type2_logical_dataframe;
175 case vctrs_type_integer: *left = 1; return vctrs_type2_integer_dataframe;
176 case vctrs_type_double: *left = 1; return vctrs_type2_double_dataframe;
177 case vctrs_type_complex: *left = 1; return vctrs_type2_complex_dataframe;
178 case vctrs_type_character: *left = 1; return vctrs_type2_character_dataframe;
179 case vctrs_type_raw: *left = 1; return vctrs_type2_raw_dataframe;
180 case vctrs_type_list: *left = 1; return vctrs_type2_list_dataframe;
181 case vctrs_type_dataframe: *left = -1; return vctrs_type2_dataframe_dataframe;
182 case vctrs_type_s3: *left = 0; return vctrs_type2_dataframe_s3;
183 case vctrs_type_scalar: *left = 0; return vctrs_type2_dataframe_scalar;
184 }
185 }
186 case vctrs_type_s3: {
187 switch (type_y) {
188 case vctrs_type_null: *left = 1; return vctrs_type2_null_s3;
189 case vctrs_type_unspecified: *left = 1; return vctrs_type2_unspecified_s3;
190 case vctrs_type_logical: *left = 1; return vctrs_type2_logical_s3;
191 case vctrs_type_integer: *left = 1; return vctrs_type2_integer_s3;
192 case vctrs_type_double: *left = 1; return vctrs_type2_double_s3;
193 case vctrs_type_complex: *left = 1; return vctrs_type2_complex_s3;
194 case vctrs_type_character: *left = 1; return vctrs_type2_character_s3;
195 case vctrs_type_raw: *left = 1; return vctrs_type2_raw_s3;
196 case vctrs_type_list: *left = 1; return vctrs_type2_list_s3;
197 case vctrs_type_dataframe: *left = 1; return vctrs_type2_dataframe_s3;
198 case vctrs_type_s3: *left = -1; return vctrs_type2_s3_s3;
199 case vctrs_type_scalar: *left = 0; return vctrs_type2_s3_scalar;
200 }
201 }
202 case vctrs_type_scalar: {
203 switch (type_y) {
204 case vctrs_type_null: *left = 1; return vctrs_type2_null_scalar;
205 case vctrs_type_unspecified: *left = 1; return vctrs_type2_unspecified_scalar;
206 case vctrs_type_logical: *left = 1; return vctrs_type2_logical_scalar;
207 case vctrs_type_integer: *left = 1; return vctrs_type2_integer_scalar;
208 case vctrs_type_double: *left = 1; return vctrs_type2_double_scalar;
209 case vctrs_type_complex: *left = 1; return vctrs_type2_complex_scalar;
210 case vctrs_type_character: *left = 1; return vctrs_type2_character_scalar;
211 case vctrs_type_raw: *left = 1; return vctrs_type2_raw_scalar;
212 case vctrs_type_list: *left = 1; return vctrs_type2_list_scalar;
213 case vctrs_type_dataframe: *left = 1; return vctrs_type2_dataframe_scalar;
214 case vctrs_type_s3: *left = 1; return vctrs_type2_s3_scalar;
215 case vctrs_type_scalar: *left = -1; return vctrs_type2_scalar_scalar;
216 }
217 }}
218
219 never_reached("vec_typeof2_impl()");
220 }
221
222 // [[ include("vctrs.h") ]]
vec_typeof2(SEXP x,SEXP y)223 enum vctrs_type2 vec_typeof2(SEXP x, SEXP y) {
224 int _;
225 return vec_typeof2_impl(vec_typeof(x), vec_typeof(y), &_);
226 }
227
vctrs_type2_as_str(enum vctrs_type2 type)228 const char* vctrs_type2_as_str(enum vctrs_type2 type) {
229 switch (type) {
230 case vctrs_type2_null_null: return "vctrs_type2_null_null";
231 case vctrs_type2_null_logical: return "vctrs_type2_null_logical";
232 case vctrs_type2_null_integer: return "vctrs_type2_null_integer";
233 case vctrs_type2_null_double: return "vctrs_type2_null_double";
234 case vctrs_type2_null_complex: return "vctrs_type2_null_complex";
235 case vctrs_type2_null_character: return "vctrs_type2_null_character";
236 case vctrs_type2_null_raw: return "vctrs_type2_null_raw";
237 case vctrs_type2_null_list: return "vctrs_type2_null_list";
238 case vctrs_type2_null_dataframe: return "vctrs_type2_null_dataframe";
239 case vctrs_type2_null_s3: return "vctrs_type2_null_s3";
240 case vctrs_type2_null_unspecified: return "vctrs_type2_null_unspecified";
241 case vctrs_type2_null_scalar: return "vctrs_type2_null_scalar";
242
243 case vctrs_type2_unspecified_logical: return "vctrs_type2_unspecified_logical";
244 case vctrs_type2_unspecified_integer: return "vctrs_type2_unspecified_integer";
245 case vctrs_type2_unspecified_double: return "vctrs_type2_unspecified_double";
246 case vctrs_type2_unspecified_complex: return "vctrs_type2_unspecified_complex";
247 case vctrs_type2_unspecified_character: return "vctrs_type2_unspecified_character";
248 case vctrs_type2_unspecified_raw: return "vctrs_type2_unspecified_raw";
249 case vctrs_type2_unspecified_list: return "vctrs_type2_unspecified_list";
250 case vctrs_type2_unspecified_dataframe: return "vctrs_type2_unspecified_dataframe";
251 case vctrs_type2_unspecified_s3: return "vctrs_type2_unspecified_s3";
252 case vctrs_type2_unspecified_unspecified: return "vctrs_type2_unspecified_unspecified";
253 case vctrs_type2_unspecified_scalar: return "vctrs_type2_unspecified_scalar";
254
255 case vctrs_type2_logical_logical: return "vctrs_type2_logical_logical";
256 case vctrs_type2_logical_integer: return "vctrs_type2_logical_integer";
257 case vctrs_type2_logical_double: return "vctrs_type2_logical_double";
258 case vctrs_type2_logical_complex: return "vctrs_type2_logical_complex";
259 case vctrs_type2_logical_character: return "vctrs_type2_logical_character";
260 case vctrs_type2_logical_raw: return "vctrs_type2_logical_raw";
261 case vctrs_type2_logical_list: return "vctrs_type2_logical_list";
262 case vctrs_type2_logical_dataframe: return "vctrs_type2_logical_dataframe";
263 case vctrs_type2_logical_s3: return "vctrs_type2_logical_s3";
264 case vctrs_type2_logical_scalar: return "vctrs_type2_logical_scalar";
265
266 case vctrs_type2_integer_integer: return "vctrs_type2_integer_integer";
267 case vctrs_type2_integer_double: return "vctrs_type2_integer_double";
268 case vctrs_type2_integer_complex: return "vctrs_type2_integer_complex";
269 case vctrs_type2_integer_character: return "vctrs_type2_integer_character";
270 case vctrs_type2_integer_raw: return "vctrs_type2_integer_raw";
271 case vctrs_type2_integer_list: return "vctrs_type2_integer_list";
272 case vctrs_type2_integer_dataframe: return "vctrs_type2_integer_dataframe";
273 case vctrs_type2_integer_s3: return "vctrs_type2_integer_s3";
274 case vctrs_type2_integer_scalar: return "vctrs_type2_integer_scalar";
275
276 case vctrs_type2_double_double: return "vctrs_type2_double_double";
277 case vctrs_type2_double_complex: return "vctrs_type2_double_complex";
278 case vctrs_type2_double_character: return "vctrs_type2_double_character";
279 case vctrs_type2_double_raw: return "vctrs_type2_double_raw";
280 case vctrs_type2_double_list: return "vctrs_type2_double_list";
281 case vctrs_type2_double_dataframe: return "vctrs_type2_double_dataframe";
282 case vctrs_type2_double_s3: return "vctrs_type2_double_s3";
283 case vctrs_type2_double_scalar: return "vctrs_type2_double_scalar";
284
285 case vctrs_type2_complex_complex: return "vctrs_type2_complex_complex";
286 case vctrs_type2_complex_character: return "vctrs_type2_complex_character";
287 case vctrs_type2_complex_raw: return "vctrs_type2_complex_raw";
288 case vctrs_type2_complex_list: return "vctrs_type2_complex_list";
289 case vctrs_type2_complex_dataframe: return "vctrs_type2_complex_dataframe";
290 case vctrs_type2_complex_s3: return "vctrs_type2_complex_s3";
291 case vctrs_type2_complex_scalar: return "vctrs_type2_complex_scalar";
292
293 case vctrs_type2_character_character: return "vctrs_type2_character_character";
294 case vctrs_type2_character_raw: return "vctrs_type2_character_raw";
295 case vctrs_type2_character_list: return "vctrs_type2_character_list";
296 case vctrs_type2_character_dataframe: return "vctrs_type2_character_dataframe";
297 case vctrs_type2_character_s3: return "vctrs_type2_character_s3";
298 case vctrs_type2_character_scalar: return "vctrs_type2_character_scalar";
299
300 case vctrs_type2_raw_raw: return "vctrs_type2_raw_raw";
301 case vctrs_type2_raw_list: return "vctrs_type2_raw_list";
302 case vctrs_type2_raw_dataframe: return "vctrs_type2_raw_dataframe";
303 case vctrs_type2_raw_s3: return "vctrs_type2_raw_s3";
304 case vctrs_type2_raw_scalar: return "vctrs_type2_raw_scalar";
305
306 case vctrs_type2_list_list: return "vctrs_type2_list_list";
307 case vctrs_type2_list_dataframe: return "vctrs_type2_list_dataframe";
308 case vctrs_type2_list_s3: return "vctrs_type2_list_s3";
309 case vctrs_type2_list_scalar: return "vctrs_type2_list_scalar";
310
311 case vctrs_type2_dataframe_dataframe: return "vctrs_type2_dataframe_dataframe";
312 case vctrs_type2_dataframe_s3: return "vctrs_type2_dataframe_s3";
313 case vctrs_type2_dataframe_scalar: return "vctrs_type2_dataframe_scalar";
314
315 case vctrs_type2_s3_s3: return "vctrs_type2_s3_s3";
316 case vctrs_type2_s3_scalar: return "vctrs_type2_s3_scalar";
317
318 case vctrs_type2_scalar_scalar: return "vctrs_type2_scalar_scalar";
319 }
320
321 never_reached("vctrs_type2_as_str");
322 }
323
vctrs_typeof2(SEXP x,SEXP y)324 SEXP vctrs_typeof2(SEXP x, SEXP y) {
325 enum vctrs_type2 type = vec_typeof2(x, y);
326 return Rf_mkString(vctrs_type2_as_str(type));
327 }
328