Skip to content

Commit f9ad119

Browse files
authored
Merge pull request #1454 from davidhewitt/tuples-of-12
tuples: support conversions up to length 12
2 parents 593be05 + 9acf242 commit f9ad119

File tree

2 files changed

+153
-39
lines changed

2 files changed

+153
-39
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
104104
- Add FFI definitions for `PyBuffer_SizeFromFormat`, `PyObject_LengthHint`, `PyObject_CallNoArgs`, `PyObject_CallOneArg`, `PyObject_CallMethodNoArgs`, `PyObject_CallMethodOneArg`, `PyObject_VectorcallDict`, and `PyObject_VectorcallMethod`. [#1287](https://github.com/PyO3/pyo3/pull/1287)
105105
- Add conversions between `u128`/`i128` and `PyLong` for PyPy. [#1310](https://github.com/PyO3/pyo3/pull/1310)
106106
- Add `Python::version()` and `Python::version_info()` to get the running interpreter version. [#1322](https://github.com/PyO3/pyo3/pull/1322)
107+
- Add conversions for tuples of length 10, 11, and 12. [#1454](https://github.com/PyO3/pyo3/pull/1454)
107108

108109
### Changed
109110
- Change return type of `PyType::name()` from `Cow<str>` to `PyResult<&str>`. [#1152](https://github.com/PyO3/pyo3/pull/1152)

src/types/tuple.rs

Lines changed: 152 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -186,59 +186,108 @@ macro_rules! tuple_conversion ({$length:expr,$(($refN:ident, $n:tt, $T:ident)),+
186186
}
187187
});
188188

189-
tuple_conversion!(1, (ref0, 0, A));
190-
tuple_conversion!(2, (ref0, 0, A), (ref1, 1, B));
191-
tuple_conversion!(3, (ref0, 0, A), (ref1, 1, B), (ref2, 2, C));
192-
tuple_conversion!(4, (ref0, 0, A), (ref1, 1, B), (ref2, 2, C), (ref3, 3, D));
189+
tuple_conversion!(1, (ref0, 0, T0));
190+
tuple_conversion!(2, (ref0, 0, T0), (ref1, 1, T1));
191+
tuple_conversion!(3, (ref0, 0, T0), (ref1, 1, T1), (ref2, 2, T2));
192+
tuple_conversion!(
193+
4,
194+
(ref0, 0, T0),
195+
(ref1, 1, T1),
196+
(ref2, 2, T2),
197+
(ref3, 3, T3)
198+
);
193199
tuple_conversion!(
194200
5,
195-
(ref0, 0, A),
196-
(ref1, 1, B),
197-
(ref2, 2, C),
198-
(ref3, 3, D),
199-
(ref4, 4, E)
201+
(ref0, 0, T0),
202+
(ref1, 1, T1),
203+
(ref2, 2, T2),
204+
(ref3, 3, T3),
205+
(ref4, 4, T4)
200206
);
201207
tuple_conversion!(
202208
6,
203-
(ref0, 0, A),
204-
(ref1, 1, B),
205-
(ref2, 2, C),
206-
(ref3, 3, D),
207-
(ref4, 4, E),
208-
(ref5, 5, F)
209+
(ref0, 0, T0),
210+
(ref1, 1, T1),
211+
(ref2, 2, T2),
212+
(ref3, 3, T3),
213+
(ref4, 4, T4),
214+
(ref5, 5, T5)
209215
);
210216
tuple_conversion!(
211217
7,
212-
(ref0, 0, A),
213-
(ref1, 1, B),
214-
(ref2, 2, C),
215-
(ref3, 3, D),
216-
(ref4, 4, E),
217-
(ref5, 5, F),
218-
(ref6, 6, G)
218+
(ref0, 0, T0),
219+
(ref1, 1, T1),
220+
(ref2, 2, T2),
221+
(ref3, 3, T3),
222+
(ref4, 4, T4),
223+
(ref5, 5, T5),
224+
(ref6, 6, T6)
219225
);
220226
tuple_conversion!(
221227
8,
222-
(ref0, 0, A),
223-
(ref1, 1, B),
224-
(ref2, 2, C),
225-
(ref3, 3, D),
226-
(ref4, 4, E),
227-
(ref5, 5, F),
228-
(ref6, 6, G),
229-
(ref7, 7, H)
228+
(ref0, 0, T0),
229+
(ref1, 1, T1),
230+
(ref2, 2, T2),
231+
(ref3, 3, T3),
232+
(ref4, 4, T4),
233+
(ref5, 5, T5),
234+
(ref6, 6, T6),
235+
(ref7, 7, T7)
230236
);
231237
tuple_conversion!(
232238
9,
233-
(ref0, 0, A),
234-
(ref1, 1, B),
235-
(ref2, 2, C),
236-
(ref3, 3, D),
237-
(ref4, 4, E),
238-
(ref5, 5, F),
239-
(ref6, 6, G),
240-
(ref7, 7, H),
241-
(ref8, 8, I)
239+
(ref0, 0, T0),
240+
(ref1, 1, T1),
241+
(ref2, 2, T2),
242+
(ref3, 3, T3),
243+
(ref4, 4, T4),
244+
(ref5, 5, T5),
245+
(ref6, 6, T6),
246+
(ref7, 7, T7),
247+
(ref8, 8, T8)
248+
);
249+
tuple_conversion!(
250+
10,
251+
(ref0, 0, T0),
252+
(ref1, 1, T1),
253+
(ref2, 2, T2),
254+
(ref3, 3, T3),
255+
(ref4, 4, T4),
256+
(ref5, 5, T5),
257+
(ref6, 6, T6),
258+
(ref7, 7, T7),
259+
(ref8, 8, T8),
260+
(ref9, 9, T9)
261+
);
262+
tuple_conversion!(
263+
11,
264+
(ref0, 0, T0),
265+
(ref1, 1, T1),
266+
(ref2, 2, T2),
267+
(ref3, 3, T3),
268+
(ref4, 4, T4),
269+
(ref5, 5, T5),
270+
(ref6, 6, T6),
271+
(ref7, 7, T7),
272+
(ref8, 8, T8),
273+
(ref9, 9, T9),
274+
(ref10, 10, T10)
275+
);
276+
277+
tuple_conversion!(
278+
12,
279+
(ref0, 0, T0),
280+
(ref1, 1, T1),
281+
(ref2, 2, T2),
282+
(ref3, 3, T3),
283+
(ref4, 4, T4),
284+
(ref5, 5, T5),
285+
(ref6, 6, T6),
286+
(ref7, 7, T7),
287+
(ref8, 8, T8),
288+
(ref9, 9, T9),
289+
(ref10, 10, T10),
290+
(ref11, 11, T11)
242291
);
243292

244293
#[cfg(test)]
@@ -313,4 +362,68 @@ mod test {
313362
assert_eq!(2, slice[1].extract().unwrap());
314363
assert_eq!(3, slice[2].extract().unwrap());
315364
}
365+
366+
#[test]
367+
fn test_tuple_lengths_up_to_12() {
368+
Python::with_gil(|py| {
369+
let t0 = (0,).to_object(py);
370+
let t1 = (0, 1).to_object(py);
371+
let t2 = (0, 1, 2).to_object(py);
372+
let t3 = (0, 1, 2, 3).to_object(py);
373+
let t4 = (0, 1, 2, 3, 4).to_object(py);
374+
let t5 = (0, 1, 2, 3, 4, 5).to_object(py);
375+
let t6 = (0, 1, 2, 3, 4, 5, 6).to_object(py);
376+
let t7 = (0, 1, 2, 3, 4, 5, 6, 7).to_object(py);
377+
let t8 = (0, 1, 2, 3, 4, 5, 6, 7, 8).to_object(py);
378+
let t9 = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9).to_object(py);
379+
let t10 = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10).to_object(py);
380+
let t11 = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11).to_object(py);
381+
382+
assert_eq!(t0.extract::<(i32,)>(py).unwrap(), (0,));
383+
assert_eq!(t1.extract::<(i32, i32)>(py).unwrap(), (0, 1,));
384+
assert_eq!(t2.extract::<(i32, i32, i32)>(py).unwrap(), (0, 1, 2,));
385+
assert_eq!(
386+
t3.extract::<(i32, i32, i32, i32,)>(py).unwrap(),
387+
(0, 1, 2, 3,)
388+
);
389+
assert_eq!(
390+
t4.extract::<(i32, i32, i32, i32, i32,)>(py).unwrap(),
391+
(0, 1, 2, 3, 4,)
392+
);
393+
assert_eq!(
394+
t5.extract::<(i32, i32, i32, i32, i32, i32,)>(py).unwrap(),
395+
(0, 1, 2, 3, 4, 5,)
396+
);
397+
assert_eq!(
398+
t6.extract::<(i32, i32, i32, i32, i32, i32, i32,)>(py)
399+
.unwrap(),
400+
(0, 1, 2, 3, 4, 5, 6,)
401+
);
402+
assert_eq!(
403+
t7.extract::<(i32, i32, i32, i32, i32, i32, i32, i32,)>(py)
404+
.unwrap(),
405+
(0, 1, 2, 3, 4, 5, 6, 7,)
406+
);
407+
assert_eq!(
408+
t8.extract::<(i32, i32, i32, i32, i32, i32, i32, i32, i32,)>(py)
409+
.unwrap(),
410+
(0, 1, 2, 3, 4, 5, 6, 7, 8,)
411+
);
412+
assert_eq!(
413+
t9.extract::<(i32, i32, i32, i32, i32, i32, i32, i32, i32, i32,)>(py)
414+
.unwrap(),
415+
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,)
416+
);
417+
assert_eq!(
418+
t10.extract::<(i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32,)>(py)
419+
.unwrap(),
420+
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,)
421+
);
422+
assert_eq!(
423+
t11.extract::<(i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32,)>(py)
424+
.unwrap(),
425+
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,)
426+
);
427+
})
428+
}
316429
}

0 commit comments

Comments
 (0)