| 326 X: Space, |
326 X: Space, |
| 327 D: Decomposition<X>, |
327 D: Decomposition<X>, |
| 328 { |
328 { |
| 329 /// Decomposes self according to `decomposer`, and evaluate `f` on the result. |
329 /// Decomposes self according to `decomposer`, and evaluate `f` on the result. |
| 330 /// Consumes self. |
330 /// Consumes self. |
| |
331 #[inline] |
| 331 fn eval_decompose<'b, R>(self, f: impl FnOnce(D::Decomposition<'b>) -> R) -> R |
332 fn eval_decompose<'b, R>(self, f: impl FnOnce(D::Decomposition<'b>) -> R) -> R |
| 332 where |
333 where |
| 333 X: 'b, |
334 X: 'b, |
| 334 Self: 'b; |
335 Self: 'b, |
| |
336 { |
| |
337 f(self.decompose()) |
| |
338 } |
| 335 |
339 |
| 336 /// Does a light decomposition of self `decomposer`, and evaluates `f` on the result. |
340 /// Does a light decomposition of self `decomposer`, and evaluates `f` on the result. |
| 337 /// Does not consume self. |
341 /// Does not consume self. |
| 338 fn eval_ref_decompose<'b, R>(&'b self, f: impl FnOnce(D::Reference<'b>) -> R) -> R |
342 fn eval_ref<'b, R>(&'b self, f: impl FnOnce(D::Reference<'b>) -> R) -> R |
| 339 where |
343 where |
| 340 X: 'b, |
344 X: 'b, |
| 341 Self: 'b; |
345 Self: 'b; |
| 342 |
346 |
| 343 #[inline] |
347 #[inline] |
| 344 /// Evaluates `f` or `g` depending on whether a reference or owned value is available. |
348 /// Evaluates `f` or `g` depending on whether a reference or owned value is available. |
| 345 fn either<'b, R>( |
349 fn either<'b, R>( |
| 346 self, |
350 self, |
| 347 f: impl FnOnce(D::Decomposition<'b>) -> R, |
351 f: impl FnOnce(D::Decomposition<'b>) -> R, |
| 348 g: impl FnOnce(D::Reference<'b>) -> R, |
352 _g: impl FnOnce(D::Reference<'b>) -> R, |
| 349 ) -> R |
353 ) -> R |
| 350 where |
354 where |
| 351 X: 'b, |
355 X: 'b, |
| 352 Self: 'b, |
356 Self: 'b, |
| 353 { |
357 { |
| 354 self.eval_decompose(f) |
358 self.eval_decompose(f) |
| 355 } |
359 } |
| 356 |
360 |
| 357 /// Returns an owned instance of `X`, cloning or converting non-true instances when necessary. |
361 /// Returns an owned instance of `X`, cloning or converting non-true instances when necessary. |
| 358 fn own(self) -> X::Principal; |
362 fn own(self) -> X::Principal; |
| |
363 |
| |
364 fn decompose<'b>(self) -> D::Decomposition<'b> |
| |
365 where |
| |
366 Self: 'b; |
| 359 |
367 |
| 360 /// Returns an owned instance or reference to `X`, converting non-true instances when necessary. |
368 /// Returns an owned instance or reference to `X`, converting non-true instances when necessary. |
| 361 /// |
369 /// |
| 362 /// Default implementation uses [`Self::own`]. Consumes the input. |
370 /// Default implementation uses [`Self::own`]. Consumes the input. |
| 363 fn cow<'b>(self) -> MyCow<'b, X::Principal> |
371 fn cow<'b>(self) -> MyCow<'b, X::Principal> |
| 414 where |
413 where |
| 415 Self: 'b, |
414 Self: 'b, |
| 416 { |
415 { |
| 417 self.cow_owned() |
416 self.cow_owned() |
| 418 } |
417 } |
| |
418 |
| |
419 #[inline] |
| |
420 fn decompose<'b>(self) -> MyCow<'b, X> |
| |
421 where |
| |
422 Self: 'b, |
| |
423 { |
| |
424 MyCow::Owned(self) |
| |
425 } |
| 419 } |
426 } |
| 420 |
427 |
| 421 impl<'a, X: Space> Instance<X, BasicDecomposition> for &'a X { |
428 impl<'a, X: Space> Instance<X, BasicDecomposition> for &'a X { |
| 422 #[inline] |
429 #[inline] |
| 423 fn either<'b, R>(self, _f: impl FnOnce(MyCow<'b, X>) -> R, g: impl FnOnce(&'b X) -> R) -> R |
430 fn either<'b, R>(self, _f: impl FnOnce(MyCow<'b, X>) -> R, g: impl FnOnce(&'b X) -> R) -> R |
| 455 where |
453 where |
| 456 Self: 'b, |
454 Self: 'b, |
| 457 { |
455 { |
| 458 self.cow_owned() |
456 self.cow_owned() |
| 459 } |
457 } |
| |
458 |
| |
459 #[inline] |
| |
460 fn decompose<'b>(self) -> MyCow<'b, X> |
| |
461 where |
| |
462 Self: 'b, |
| |
463 { |
| |
464 MyCow::Borrowed(self) |
| |
465 } |
| 460 } |
466 } |
| 461 |
467 |
| 462 impl<'a, X: Space> Instance<X, BasicDecomposition> for &'a mut X { |
468 impl<'a, X: Space> Instance<X, BasicDecomposition> for &'a mut X { |
| 463 #[inline] |
469 #[inline] |
| 464 fn either<'b, R>(self, _f: impl FnOnce(MyCow<'b, X>) -> R, g: impl FnOnce(&'b X) -> R) -> R |
470 fn either<'b, R>(self, _f: impl FnOnce(MyCow<'b, X>) -> R, g: impl FnOnce(&'b X) -> R) -> R |
| 496 where |
493 where |
| 497 Self: 'b, |
494 Self: 'b, |
| 498 { |
495 { |
| 499 self.cow_owned() |
496 self.cow_owned() |
| 500 } |
497 } |
| |
498 |
| |
499 #[inline] |
| |
500 fn decompose<'b>(self) -> MyCow<'b, X> |
| |
501 where |
| |
502 Self: 'b, |
| |
503 { |
| |
504 MyCow::Borrowed(self) |
| |
505 } |
| 501 } |
506 } |
| 502 |
507 |
| 503 impl<'a, X: Space> Instance<X, BasicDecomposition> for MyCow<'a, X> { |
508 impl<'a, X: Space> Instance<X, BasicDecomposition> for MyCow<'a, X> { |
| 504 #[inline] |
509 #[inline] |
| 505 fn either<'b, R>(self, f: impl FnOnce(MyCow<'b, X>) -> R, _g: impl FnOnce(&'b X) -> R) -> R |
510 fn either<'b, R>(self, f: impl FnOnce(MyCow<'b, X>) -> R, _g: impl FnOnce(&'b X) -> R) -> R |