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