src/instance.rs

branch
dev
changeset 170
221728aeeb7e
parent 168
93daa824c04a
child 171
fa8df5a14486
equal deleted inserted replaced
169:114ecdf63ce5 170:221728aeeb7e
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,

mercurial