@@ -16,6 +16,8 @@ use vec;
16
16
17
17
#[ cfg( not( test) ) ] use cmp:: { Eq , Ord } ;
18
18
19
+ pub use self :: getters:: * ;
20
+
19
21
pub trait CopyableTuple < T , U > {
20
22
fn first ( & self ) -> T ;
21
23
fn second ( & self ) -> U ;
@@ -246,25 +248,181 @@ impl<A:Ord,B:Ord,C:Ord> Ord for (A, B, C) {
246
248
fn gt ( & self , other : & ( A , B , C ) ) -> bool { ( * other) . lt ( & ( * self ) ) }
247
249
}
248
250
251
+ // Tuple element getters
252
+
253
+ macro_rules! tuple_getters(
254
+ ( $(
255
+ $name: ident {
256
+ $( fn $method: ident -> $T: ident { $accessor: pat => $t: expr } ) +
257
+ }
258
+ ) +) => (
259
+ pub mod getters {
260
+ $( pub trait $name<$( $T) ,+> {
261
+ $( fn $method<' a>( & ' a self ) -> & ' a $T; ) +
262
+ } ) +
263
+
264
+ $( impl <$( $T) ,+> $name<$( $T) ,+> for ( $( $T) ,+) {
265
+ $(
266
+ #[ inline( always) ]
267
+ fn $method<' a>( & ' a self ) -> & ' a $T {
268
+ match * self {
269
+ $accessor => $t
270
+ }
271
+ }
272
+ ) +
273
+ } ) +
274
+ }
275
+ )
276
+ )
277
+
278
+ tuple_getters ! (
279
+ Tuple2 {
280
+ fn n0 -> A { ( ref a, _) => a }
281
+ fn n1 -> B { ( _, ref b) => b }
282
+ }
283
+
284
+ Tuple3 {
285
+ fn n0 -> A { ( ref a, _, _) => a }
286
+ fn n1 -> B { ( _, ref b, _) => b }
287
+ fn n2 -> C { ( _, _, ref c) => c }
288
+ }
289
+
290
+ Tuple4 {
291
+ fn n0 -> A { ( ref a, _, _, _) => a }
292
+ fn n1 -> B { ( _, ref b, _, _) => b }
293
+ fn n2 -> C { ( _, _, ref c, _) => c }
294
+ fn n3 -> D { ( _, _, _, ref d) => d }
295
+ }
296
+
297
+ Tuple5 {
298
+ fn n0 -> A { ( ref a, _, _, _, _) => a }
299
+ fn n1 -> B { ( _, ref b, _, _, _) => b }
300
+ fn n2 -> C { ( _, _, ref c, _, _) => c }
301
+ fn n3 -> D { ( _, _, _, ref d, _) => d }
302
+ fn n4 -> E { ( _, _, _, _, ref e) => e }
303
+ }
304
+
305
+ Tuple6 {
306
+ fn n0 -> A { ( ref a, _, _, _, _, _) => a }
307
+ fn n1 -> B { ( _, ref b, _, _, _, _) => b }
308
+ fn n2 -> C { ( _, _, ref c, _, _, _) => c }
309
+ fn n3 -> D { ( _, _, _, ref d, _, _) => d }
310
+ fn n4 -> E { ( _, _, _, _, ref e, _) => e }
311
+ fn n5 -> F { ( _, _, _, _, _, ref f) => f }
312
+ }
313
+
314
+ Tuple7 {
315
+ fn n0 -> A { ( ref a, _, _, _, _, _, _) => a }
316
+ fn n1 -> B { ( _, ref b, _, _, _, _, _) => b }
317
+ fn n2 -> C { ( _, _, ref c, _, _, _, _) => c }
318
+ fn n3 -> D { ( _, _, _, ref d, _, _, _) => d }
319
+ fn n4 -> E { ( _, _, _, _, ref e, _, _) => e }
320
+ fn n5 -> F { ( _, _, _, _, _, ref f, _) => f }
321
+ fn n6 -> G { ( _, _, _, _, _, _, ref g) => g }
322
+ }
323
+
324
+ Tuple8 {
325
+ fn n0 -> A { ( ref a, _, _, _, _, _, _, _) => a }
326
+ fn n1 -> B { ( _, ref b, _, _, _, _, _, _) => b }
327
+ fn n2 -> C { ( _, _, ref c, _, _, _, _, _) => c }
328
+ fn n3 -> D { ( _, _, _, ref d, _, _, _, _) => d }
329
+ fn n4 -> E { ( _, _, _, _, ref e, _, _, _) => e }
330
+ fn n5 -> F { ( _, _, _, _, _, ref f, _, _) => f }
331
+ fn n6 -> G { ( _, _, _, _, _, _, ref g, _) => g }
332
+ fn n7 -> H { ( _, _, _, _, _, _, _, ref h) => h }
333
+ }
334
+
335
+ Tuple9 {
336
+ fn n0 -> A { ( ref a, _, _, _, _, _, _, _, _) => a }
337
+ fn n1 -> B { ( _, ref b, _, _, _, _, _, _, _) => b }
338
+ fn n2 -> C { ( _, _, ref c, _, _, _, _, _, _) => c }
339
+ fn n3 -> D { ( _, _, _, ref d, _, _, _, _, _) => d }
340
+ fn n4 -> E { ( _, _, _, _, ref e, _, _, _, _) => e }
341
+ fn n5 -> F { ( _, _, _, _, _, ref f, _, _, _) => f }
342
+ fn n6 -> G { ( _, _, _, _, _, _, ref g, _, _) => g }
343
+ fn n7 -> H { ( _, _, _, _, _, _, _, ref h, _) => h }
344
+ fn n8 -> I { ( _, _, _, _, _, _, _, _, ref i) => i }
345
+ }
346
+
347
+ Tuple10 {
348
+ fn n0 -> A { ( ref a, _, _, _, _, _, _, _, _, _) => a }
349
+ fn n1 -> B { ( _, ref b, _, _, _, _, _, _, _, _) => b }
350
+ fn n2 -> C { ( _, _, ref c, _, _, _, _, _, _, _) => c }
351
+ fn n3 -> D { ( _, _, _, ref d, _, _, _, _, _, _) => d }
352
+ fn n4 -> E { ( _, _, _, _, ref e, _, _, _, _, _) => e }
353
+ fn n5 -> F { ( _, _, _, _, _, ref f, _, _, _, _) => f }
354
+ fn n6 -> G { ( _, _, _, _, _, _, ref g, _, _, _) => g }
355
+ fn n7 -> H { ( _, _, _, _, _, _, _, ref h, _, _) => h }
356
+ fn n8 -> I { ( _, _, _, _, _, _, _, _, ref i, _) => i }
357
+ fn n9 -> J { ( _, _, _, _, _, _, _, _, _, ref j) => j }
358
+ }
359
+
360
+ Tuple11 {
361
+ fn n0 -> A { ( ref a, _, _, _, _, _, _, _, _, _, _) => a }
362
+ fn n1 -> B { ( _, ref b, _, _, _, _, _, _, _, _, _) => b }
363
+ fn n2 -> C { ( _, _, ref c, _, _, _, _, _, _, _, _) => c }
364
+ fn n3 -> D { ( _, _, _, ref d, _, _, _, _, _, _, _) => d }
365
+ fn n4 -> E { ( _, _, _, _, ref e, _, _, _, _, _, _) => e }
366
+ fn n5 -> F { ( _, _, _, _, _, ref f, _, _, _, _, _) => f }
367
+ fn n6 -> G { ( _, _, _, _, _, _, ref g, _, _, _, _) => g }
368
+ fn n7 -> H { ( _, _, _, _, _, _, _, ref h, _, _, _) => h }
369
+ fn n8 -> I { ( _, _, _, _, _, _, _, _, ref i, _, _) => i }
370
+ fn n9 -> J { ( _, _, _, _, _, _, _, _, _, ref j, _) => j }
371
+ fn n10 -> K { ( _, _, _, _, _, _, _, _, _, _, ref k) => k }
372
+ }
373
+
374
+ Tuple12 {
375
+ fn n0 -> A { ( ref a, _, _, _, _, _, _, _, _, _, _, _) => a }
376
+ fn n1 -> B { ( _, ref b, _, _, _, _, _, _, _, _, _, _) => b }
377
+ fn n2 -> C { ( _, _, ref c, _, _, _, _, _, _, _, _, _) => c }
378
+ fn n3 -> D { ( _, _, _, ref d, _, _, _, _, _, _, _, _) => d }
379
+ fn n4 -> E { ( _, _, _, _, ref e, _, _, _, _, _, _, _) => e }
380
+ fn n5 -> F { ( _, _, _, _, _, ref f, _, _, _, _, _, _) => f }
381
+ fn n6 -> G { ( _, _, _, _, _, _, ref g, _, _, _, _, _) => g }
382
+ fn n7 -> H { ( _, _, _, _, _, _, _, ref h, _, _, _, _) => h }
383
+ fn n8 -> I { ( _, _, _, _, _, _, _, _, ref i, _, _, _) => i }
384
+ fn n9 -> J { ( _, _, _, _, _, _, _, _, _, ref j, _, _) => j }
385
+ fn n10 -> K { ( _, _, _, _, _, _, _, _, _, _, ref k, _) => k }
386
+ fn n11 -> L { ( _, _, _, _, _, _, _, _, _, _, _, ref l) => l }
387
+ }
388
+ )
389
+
249
390
#[ test]
250
391
fn test_tuple_ref ( ) {
251
392
let x = ( ~"foo", ~"bar") ;
252
- assert ! ( x. first_ref( ) == & ~"foo");
253
- assert !(x.second_ref() == &~" bar");
393
+ assert_eq ! ( x. first_ref( ) , & ~"foo");
394
+ assert_eq !(x.second_ref(), &~" bar");
254
395
}
255
396
256
397
#[test]
257
398
#[allow(non_implicitly_copyable_typarams)]
258
399
fn test_tuple() {
259
- assert !((948, 4039.48).first() == 948);
260
- assert !((34.5, ~" foo").second() == ~" foo");
261
- assert !(('a', 2).swap() == (2, 'a'));
400
+ assert_eq !((948, 4039.48).first(), 948);
401
+ assert_eq !((34.5, ~" foo").second(), ~" foo");
402
+ assert_eq !(('a', 2).swap(), (2, 'a'));
262
403
}
263
404
264
405
#[test]
265
406
fn test_clone() {
266
407
let a = (1, ~" 2 " ) ;
267
408
let b = a. clone ( ) ;
268
- assert ! ( a. first( ) == b. first( ) ) ;
269
- assert ! ( a. second( ) == b. second( ) ) ;
409
+ assert_eq ! ( a. first( ) , b. first( ) ) ;
410
+ assert_eq ! ( a. second( ) , b. second( ) ) ;
411
+ }
412
+
413
+ #[ test]
414
+ fn test_n_tuple ( ) {
415
+ let t = ( 0u8 , 1u16 , 2u32 , 3u64 , 4 u, 5i8 , 6i16 , 7i32 , 8i64 , 9 i, 10f32 , 11f64 ) ;
416
+ assert_eq ! ( * t. n0( ) , 0u8 ) ;
417
+ assert_eq ! ( * t. n1( ) , 1u16 ) ;
418
+ assert_eq ! ( * t. n2( ) , 2u32 ) ;
419
+ assert_eq ! ( * t. n3( ) , 3u64 ) ;
420
+ assert_eq ! ( * t. n4( ) , 4 u) ;
421
+ assert_eq ! ( * t. n5( ) , 5i8 ) ;
422
+ assert_eq ! ( * t. n6( ) , 6i16 ) ;
423
+ assert_eq ! ( * t. n7( ) , 7i32 ) ;
424
+ assert_eq ! ( * t. n8( ) , 8i64 ) ;
425
+ assert_eq ! ( * t. n9( ) , 9 i) ;
426
+ assert_eq ! ( * t. n10( ) , 10f32 ) ;
427
+ assert_eq ! ( * t. n11( ) , 11f64 ) ;
270
428
}
0 commit comments