Example showing problem with Bounds2 using Point2::Sub trait.

This commit is contained in:
Bill Thiede 2019-11-29 17:01:52 -08:00
commit 2b1b9590c0
4 changed files with 110 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/target
**/*.rs.bk

6
Cargo.lock generated Normal file
View File

@ -0,0 +1,6 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "nestedsubtraits"
version = "0.1.0"

9
Cargo.toml Normal file
View File

@ -0,0 +1,9 @@
[package]
name = "nestedsubtraits"
version = "0.1.0"
authors = ["Bill Thiede <git@xinu.tv>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

93
src/lib.rs Normal file
View File

@ -0,0 +1,93 @@
use std::fmt;
use std::ops::Mul;
use std::ops::Sub;
type Float = f32;
pub trait Number
where
Self: std::marker::Sized + Copy + fmt::Display + Mul + Sub,
{
// Real version has stuff here
}
impl Number for Float {}
impl Number for isize {}
/// Generic type for any 2D point.
#[derive(Copy, Clone, Debug, Default, PartialEq)]
pub struct Point2<T>
where
T: Number,
{
pub x: T,
pub y: T,
}
impl<T> From<[T; 2]> for Point2<T>
where
T: Number,
{
fn from(xy: [T; 2]) -> Self {
Point2 { x: xy[0], y: xy[1] }
}
}
/// 2D point type with `Float` members.
pub type Point2f = Point2<Float>;
/// 2D point type with `isize` members.
pub type Point2i = Point2<isize>;
impl<T> Sub for Point2<T>
where
T: Number + Sub<Output = T>,
{
type Output = Self;
/// Implement `-` for Point2<T>
///
/// # Examples
/// ```
/// use nestedsubtraits::Point2i;
///
/// let p1: Point2i = [2, 3].into();
/// let p2: Point2i = [4, 5].into();
/// assert_eq!(p2 - p1, [2, 2].into());
///
/// use nestedsubtraits::Point2f;
///
/// let p1: Point2f = [2., 3.].into();
/// let p2: Point2f = [4., 5.].into();
/// assert_eq!(p2 - p1, [2., 2.].into());
/// ```
fn sub(self, rhs: Self) -> Self::Output {
Point2 {
x: self.x - rhs.x,
y: self.y - rhs.y,
}
}
}
/// Generic type for 2D bounding boxes.
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct Bounds2<T>
where
T: Number,
{
pub p_min: Point2<T>,
pub p_max: Point2<T>,
}
impl<T> Bounds2<T>
where
T: Number,
{
pub fn area(&self) -> T {
// TODO(glenng) make this compile.
/*
let d = self.p_max - self.p_min;
d.x * d.y
*/
unimplemented!();
}
}