| 338 fn eval_ref_decompose<'b, R>(&'b self, f: impl FnOnce(D::Reference<'b>) -> R) -> R |
338 fn eval_ref_decompose<'b, R>(&'b self, f: impl FnOnce(D::Reference<'b>) -> R) -> R |
| 339 where |
339 where |
| 340 X: 'b, |
340 X: 'b, |
| 341 Self: 'b; |
341 Self: 'b; |
| 342 |
342 |
| |
343 #[inline] |
| |
344 /// Evaluates `f` or `g` depending on whether a reference or owned value is available. |
| |
345 fn either<'b, R>( |
| |
346 self, |
| |
347 f: impl FnOnce(D::Decomposition<'b>) -> R, |
| |
348 g: impl FnOnce(D::Reference<'b>) -> R, |
| |
349 ) -> R |
| |
350 where |
| |
351 X: 'b, |
| |
352 Self: 'b, |
| |
353 { |
| |
354 self.eval_decompose(f) |
| |
355 } |
| |
356 |
| 343 /// Returns an owned instance of `X`, cloning or converting non-true instances when necessary. |
357 /// Returns an owned instance of `X`, cloning or converting non-true instances when necessary. |
| 344 fn own(self) -> X::Principal; |
358 fn own(self) -> X::Principal; |
| 345 |
359 |
| 346 /// Returns an owned instance or reference to `X`, converting non-true instances when necessary. |
360 /// Returns an owned instance or reference to `X`, converting non-true instances when necessary. |
| 347 /// |
361 /// |
| 359 X: 'b, |
373 X: 'b, |
| 360 Self: 'b, |
374 Self: 'b, |
| 361 { |
375 { |
| 362 f(&*self.cow()) |
376 f(&*self.cow()) |
| 363 } |
377 } |
| 364 |
|
| 365 #[inline] |
|
| 366 /// Evaluates `f` or `g` depending on whether a reference or owned value is available. |
|
| 367 /// |
|
| 368 /// Default implementation uses [`Self::cow`]. Consumes the input. |
|
| 369 fn either<'b, R>( |
|
| 370 self, |
|
| 371 f: impl FnOnce(X::Principal) -> R, |
|
| 372 g: impl FnOnce(&X::Principal) -> R, |
|
| 373 ) -> R |
|
| 374 where |
|
| 375 Self: 'b, |
|
| 376 { |
|
| 377 match self.cow() { |
|
| 378 EitherDecomp::Owned(x) => f(x), |
|
| 379 EitherDecomp::Borrowed(x) => g(x), |
|
| 380 } |
|
| 381 } |
|
| 382 } |
378 } |
| 383 |
379 |
| 384 impl<X: Space> Instance<X, BasicDecomposition> for X { |
380 impl<X: Space> Instance<X, BasicDecomposition> for X { |
| |
381 #[inline] |
| |
382 fn either<'b, R>(self, f: impl FnOnce(MyCow<'b, X>) -> R, _g: impl FnOnce(&'b X) -> R) -> R |
| |
383 where |
| |
384 Self: 'b, |
| |
385 { |
| |
386 f(MyCow::Owned(self)) |
| |
387 } |
| |
388 |
| 385 #[inline] |
389 #[inline] |
| 386 fn eval_decompose<'b, R>(self, f: impl FnOnce(MyCow<'b, X>) -> R) -> R |
390 fn eval_decompose<'b, R>(self, f: impl FnOnce(MyCow<'b, X>) -> R) -> R |
| 387 where |
391 where |
| 388 X: 'b, |
392 X: 'b, |
| 389 Self: 'b, |
393 Self: 'b, |
| 414 } |
418 } |
| 415 } |
419 } |
| 416 |
420 |
| 417 impl<'a, X: Space> Instance<X, BasicDecomposition> for &'a X { |
421 impl<'a, X: Space> Instance<X, BasicDecomposition> for &'a X { |
| 418 #[inline] |
422 #[inline] |
| |
423 fn either<'b, R>(self, _f: impl FnOnce(MyCow<'b, X>) -> R, g: impl FnOnce(&'b X) -> R) -> R |
| |
424 where |
| |
425 Self: 'b, |
| |
426 { |
| |
427 g(self) |
| |
428 } |
| |
429 |
| |
430 #[inline] |
| 419 fn eval_decompose<'b, R>(self, f: impl FnOnce(MyCow<'b, X>) -> R) -> R |
431 fn eval_decompose<'b, R>(self, f: impl FnOnce(MyCow<'b, X>) -> R) -> R |
| 420 where |
432 where |
| 421 X: 'b, |
433 X: 'b, |
| 422 Self: 'b, |
434 Self: 'b, |
| 423 { |
435 { |
| 447 } |
459 } |
| 448 } |
460 } |
| 449 |
461 |
| 450 impl<'a, X: Space> Instance<X, BasicDecomposition> for &'a mut X { |
462 impl<'a, X: Space> Instance<X, BasicDecomposition> for &'a mut X { |
| 451 #[inline] |
463 #[inline] |
| |
464 fn either<'b, R>(self, _f: impl FnOnce(MyCow<'b, X>) -> R, g: impl FnOnce(&'b X) -> R) -> R |
| |
465 where |
| |
466 Self: 'b, |
| |
467 { |
| |
468 g(self) |
| |
469 } |
| |
470 |
| |
471 #[inline] |
| 452 fn eval_decompose<'b, R>(self, f: impl FnOnce(MyCow<'b, X>) -> R) -> R |
472 fn eval_decompose<'b, R>(self, f: impl FnOnce(MyCow<'b, X>) -> R) -> R |
| 453 where |
473 where |
| 454 X: 'b, |
474 X: 'b, |
| 455 Self: 'b, |
475 Self: 'b, |
| 456 { |
476 { |
| 479 self.cow_owned() |
499 self.cow_owned() |
| 480 } |
500 } |
| 481 } |
501 } |
| 482 |
502 |
| 483 impl<'a, X: Space> Instance<X, BasicDecomposition> for MyCow<'a, X> { |
503 impl<'a, X: Space> Instance<X, BasicDecomposition> for MyCow<'a, X> { |
| |
504 #[inline] |
| |
505 fn either<'b, R>(self, f: impl FnOnce(MyCow<'b, X>) -> R, _g: impl FnOnce(&'b X) -> R) -> R |
| |
506 where |
| |
507 Self: 'b, |
| |
508 { |
| |
509 f(self) |
| |
510 } |
| |
511 |
| 484 #[inline] |
512 #[inline] |
| 485 fn eval_decompose<'b, R>(self, f: impl FnOnce(MyCow<'b, X>) -> R) -> R |
513 fn eval_decompose<'b, R>(self, f: impl FnOnce(MyCow<'b, X>) -> R) -> R |
| 486 where |
514 where |
| 487 X: 'b, |
515 X: 'b, |
| 488 Self: 'b, |
516 Self: 'b, |