From 5262c7b896d40629c9ab9a3cc510c452fdbfba25 Mon Sep 17 00:00:00 2001 From: shenjack <3695888@qq.com> Date: Sun, 26 Mar 2023 10:30:38 +0800 Subject: [PATCH] impl std trait insted custom trait --- libs/pyglet_rs/src/Cargo.lock | 47 ++++++- libs/pyglet_rs/src/Cargo.toml | 2 +- libs/pyglet_rs/src/src/lib.rs | 1 + libs/pyglet_rs/src/src/math.rs | 226 +++++++++++++------------------ libs/pyglet_rs/src/src/pymath.rs | 77 +++++++++++ 5 files changed, 221 insertions(+), 132 deletions(-) create mode 100644 libs/pyglet_rs/src/src/pymath.rs diff --git a/libs/pyglet_rs/src/Cargo.lock b/libs/pyglet_rs/src/Cargo.lock index f37c2b8..34a267f 100644 --- a/libs/pyglet_rs/src/Cargo.lock +++ b/libs/pyglet_rs/src/Cargo.lock @@ -20,12 +20,43 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "ctor" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ghost" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e77ac7b51b8e6313251737fcef4b1c01a2ea102bde68415b62c0ee9268fec357" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.5", +] + [[package]] name = "indoc" version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306" +[[package]] +name = "inventory" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498ae1c9c329c7972b917506239b557a60386839192f1cf0ca034f345b65db99" +dependencies = [ + "ctor", + "ghost", +] + [[package]] name = "libc" version = "0.2.140" @@ -104,6 +135,7 @@ checksum = "06a3d8e8a46ab2738109347433cb7b96dffda2e4a218b03ef27090238886b147" dependencies = [ "cfg-if", "indoc", + "inventory", "libc", "memoffset", "parking_lot", @@ -142,7 +174,7 @@ dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -153,7 +185,7 @@ checksum = "dc1f43d8e30460f36350d18631ccf85ded64c059829208fe680904c65bcd0a4c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -197,6 +229,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89c2d1c76a26822187a1fbb5964e3fff108bc208f02e820ab9dac1234f6b388a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "target-lexicon" version = "0.12.6" diff --git a/libs/pyglet_rs/src/Cargo.toml b/libs/pyglet_rs/src/Cargo.toml index b1b448b..07dcb65 100644 --- a/libs/pyglet_rs/src/Cargo.toml +++ b/libs/pyglet_rs/src/Cargo.toml @@ -14,4 +14,4 @@ codegen-units = 1 [dependencies.pyo3] version = "0.18.1" -features = ["extension-module"] +features = ["extension-module", "multiple-pymethods"] diff --git a/libs/pyglet_rs/src/src/lib.rs b/libs/pyglet_rs/src/src/lib.rs index 8d7d1a9..9776d49 100644 --- a/libs/pyglet_rs/src/src/lib.rs +++ b/libs/pyglet_rs/src/src/lib.rs @@ -8,6 +8,7 @@ mod math; mod sprite; +mod pymath; use pyo3::prelude::*; diff --git a/libs/pyglet_rs/src/src/math.rs b/libs/pyglet_rs/src/src/math.rs index 02aeb8b..a578a64 100644 --- a/libs/pyglet_rs/src/src/math.rs +++ b/libs/pyglet_rs/src/src/math.rs @@ -9,6 +9,7 @@ pub mod macros {} pub mod vector { + use std::ops::{Add, Div, Mul, Sub}; #[derive(Debug, Clone, Copy, PartialEq, PartialOrd)] pub struct Vector2 { @@ -33,10 +34,6 @@ pub mod vector { pub trait VectorTrait { fn len(&self) -> i8; // use short int to save memory (even if its not going to save a lot) - fn add(&self, other: &Self) -> Self; - fn sub(&self, other: &Self) -> Self; - fn mul(&self, other: &Self) -> Self; - fn truediv(&self, other: &Self) -> Self; fn floordiv(&self, other: &Self) -> Self; fn abs(&self) -> f64; fn neg(&self) -> Self; @@ -44,27 +41,42 @@ pub mod vector { fn radd(&self, other: &Self) -> Self; } + impl Add for Vector2 { + type Output = Self; + + fn add(self, rhs: Self) -> Self::Output { + Self::new(self.x + other.x, self.y + other.y) + } + } + + impl Sub for Vector2 { + type Output = Self; + + fn sub(self, rhs: Self) -> Self::Output { + Self::new(self.x - other.x, self.y - other.y) + } + } + + impl Mul for Vector2 { + type Output = Self; + + fn mul(self, rhs: Self) -> Self::Output { + Self::new(self.x * other.x, self.y * other.y) + } + } + + impl Div for Vector2 { + type Output = Self; + + fn div(self, rhs: Self) -> Self::Output { + Self::new(self.x / other.x, self.y / other.y) + } + } + impl VectorTrait for Vector2 { fn len(&self) -> i8 { return 2; } - - fn add(&self, other: &Self) -> Self { - Self::new(self.x + other.x, self.y + other.y) - } - - fn sub(&self, other: &Self) -> Self { - Self::new(self.x - other.x, self.y - other.y) - } - - fn mul(&self, other: &Self) -> Self { - Self::new(self.x * other.x, self.y * other.y) - } - - fn truediv(&self, other: &Self) -> Self { - Self::new(self.x / other.x, self.y / other.y) - } - fn floordiv(&self, other: &Self) -> Self { // 手动模拟python的//运算符 Self::new((self.x / other.x).floor(), (self.y / other.y).floor()) @@ -96,27 +108,43 @@ pub mod vector { } } + impl Add for Vector3 { + type Output = Self; + + fn add(self, rhs: Self) -> Self::Output { + Self::new(self.x + rhs.x, self.y + rhs.y, self.z + rhs.z) + } + } + + impl Sub for Vector3 { + type Output = Self; + + fn sub(self, rhs: Self) -> Self::Output { + Self::new(self.x - rhs.x, self.y - rhs.y, self.z - rhs.z) + } + } + + impl Mul for Vector3 { + type Output = Self; + + fn mul(self, rhs: Self) -> Self::Output { + Self::new(self.x * rhs.x, self.y * rhs.y, self.z * rhs.z) + } + } + + impl Div for Vector3 { + type Output = Self; + + fn div(self, rhs: Self) -> Self::Output { + Self::new(self.x / rhs.x, self.y / rhs.y, self.z / rhs.z) + } + } + impl VectorTrait for Vector3 { fn len(&self) -> i8 { return 3; } - fn add(&self, other: &Self) -> Self { - Self::new(self.x + other.x, self.y + other.y, self.z + other.z) - } - - fn sub(&self, other: &Self) -> Self { - Self::new(self.x - other.x, self.y - other.y, self.z - other.z) - } - - fn mul(&self, other: &Self) -> Self { - Self::new(self.x * other.x, self.y * other.y, self.z * other.z) - } - - fn truediv(&self, other: &Self) -> Self { - Self::new(self.x / other.x, self.y / other.y, self.z / other.z) - } - fn floordiv(&self, other: &Self) -> Self { // 手动模拟python的//运算符 Self::new( @@ -158,42 +186,6 @@ pub mod vector { return 4; } - fn add(&self, other: &Self) -> Self { - Self::new( - self.x + other.x, - self.y + other.y, - self.z + other.z, - self.w + other.w, - ) - } - - fn sub(&self, other: &Self) -> Self { - Self::new( - self.x - other.x, - self.y - other.y, - self.z - other.z, - self.w - other.w, - ) - } - - fn mul(&self, other: &Self) -> Self { - Self::new( - self.x * other.x, - self.y * other.y, - self.z * other.z, - self.w * other.w, - ) - } - - fn truediv(&self, other: &Self) -> Self { - Self::new( - self.x / other.x, - self.y / other.y, - self.z / other.z, - self.w / other.w, - ) - } - fn floordiv(&self, other: &Self) -> Self { // 手动模拟python的//运算符 Self::new( @@ -242,6 +234,38 @@ pub mod vector { } } + impl Add for Vector4 { + type Output = Self; + + fn add(self, rhs: Self) -> Self::Output { + Self::new(self.x + rhs.x, self.y + rhs.y, self.z + rhs.z, self.w + rhs.w) + } + } + + impl Sub for Vector4 { + type Output = Self; + + fn sub(self, rhs: Self) -> Self::Output { + Self::new(self.x - rhs.x, self.y - rhs.y, self.z - rhs.z, self.w - rhs.w) + } + } + + impl Mul for Vector4 { + type Output = Self; + + fn mul(self, rhs: Self) -> Self::Output { + Self::new(self.x * rhs.x, self.y * rhs.y, self.z * rhs.z, self.w * rhs.w) + } + } + + impl Div for Vector4 { + type Output = Self; + + fn div(self, rhs: Self) -> Self::Output { + Self::new(self.x / rhs.x, self.y / rhs.y, self.z / rhs.z, self.w / rhs.w) + } + } + impl Vector2 { pub fn new(x: f64, y: f64) -> Self { Self { x, y } @@ -279,59 +303,3 @@ pub mod matrix { pub line4: Vector4, } } - -pub mod python_class { - use pyo3::prelude::*; - - use super::matrix::{Matrix3, Matrix4}; - use super::vector::{Vector2, Vector3, Vector4}; - - #[pyclass(name = "Vector2")] - pub struct PyVector2 { - pub data: Vector2, - } - - #[pyclass(name = "Vector3")] - pub struct PyVector3 { - pub data: Vector3, - } - - #[pyclass(name = "Vector4")] - pub struct PyVector4 { - pub data: Vector4, - } - - #[pyclass(name = "Matrix3")] - pub struct PyMatrix3 { - pub data: Matrix3, - } - - #[pyclass(name = "Matrix4")] - pub struct PyMatrix4 { - pub data: Matrix4, - } - - pub trait PyCalc { - fn __add__(&self, other: &Self) -> Self; - fn __sub__(&self, other: &Self) -> Self; - fn __mul__(&self, other: &Self) -> Self; - fn __truediv__(&self, other: &Self) -> Self; - fn __floordiv__(&self, other: &Self) -> Self; - fn __abs__(&self) -> f64; - fn __neg__(&self) -> Self; - fn __round__(&self, ndigits: Option) -> Self; - fn __radd__(&self, other: &PyAny) -> Self; - fn __eq__(&self, other: &Self) -> bool; - fn __ne__(&self, other: &Self) -> bool; - } - - #[pymethods] - impl PyVector2 { - #[new] - fn py_new(x: f64, y: f64) -> Self { - return PyVector2 { - data: Vector2::new(x, y), - }; - } - } -} diff --git a/libs/pyglet_rs/src/src/pymath.rs b/libs/pyglet_rs/src/src/pymath.rs new file mode 100644 index 0000000..507f7f6 --- /dev/null +++ b/libs/pyglet_rs/src/src/pymath.rs @@ -0,0 +1,77 @@ +/* + * ------------------------------- + * Difficult Rocket + * Copyright © 2020-2023 by shenjackyuanjie 3695888@qq.com + * All rights reserved + * ------------------------------- + */ + + +pub mod python_class { + use pyo3::prelude::*; + + use crate::math::matrix::{Matrix3, Matrix4}; + use crate::math::vector::{Vector2, Vector3, Vector4}; + + #[pyclass(name = "Vector2")] + pub struct PyVector2 { + pub data: Vector2, + } + + #[pyclass(name = "Vector3")] + pub struct PyVector3 { + pub data: Vector3, + } + + #[pyclass(name = "Vector4")] + pub struct PyVector4 { + pub data: Vector4, + } + + #[pyclass(name = "Matrix3")] + pub struct PyMatrix3 { + pub data: Matrix3, + } + + #[pyclass(name = "Matrix4")] + pub struct PyMatrix4 { + pub data: Matrix4, + } + + #[allow(unused)] + pub trait PyCalc { + fn __add__(&self, other: &Self) -> Self; + fn __sub__(&self, other: &Self) -> Self; + fn __mul__(&self, other: &Self) -> Self; + fn __truediv__(&self, other: &Self) -> Self; + fn __floordiv__(&self, other: &Self) -> Self; + fn __abs__(&self) -> f64; + fn __neg__(&self) -> Self; + fn __round__(&self, ndigits: Option) -> Self; + fn __radd__(&self, other: &PyAny) -> Self; + fn __eq__(&self, other: &Self) -> bool; + fn __ne__(&self, other: &Self) -> bool; + } + + /// 这是一个用来自动给 impl xxx for xxx 的块去掉 trait 部分的宏 + /// 用于在为 pyclass 实现 + + #[pymethods] + impl PyVector2 { + #[new] + fn py_new(x: f64, y: f64) -> Self { + return Self { + data: Vector2::new(x, y), + }; + } + } + + #[pymethods] + impl PyVector2 { + fn __add__(&self, other: &Self) -> Self { + return Self { + data: self.data + other.data, + }; + } + } +}