Skip to content

Commit fe3365b

Browse files
authored
Generic mapping function for vectors (#547)
1 parent a4ee21a commit fe3365b

37 files changed

+362
-0
lines changed

codegen/templates/vec.rs.tera

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,20 @@ impl {{ self_t }} {
411411
{% endif %}
412412
}
413413

414+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
415+
#[inline]
416+
#[must_use]
417+
pub fn map<F>(self, f: F) -> Self
418+
where
419+
F: Fn({{ scalar_t }}) -> {{ scalar_t }},
420+
{
421+
Self::new(
422+
{% for c in components %}
423+
f(self.{{ c }}),
424+
{%- endfor %}
425+
)
426+
}
427+
414428
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
415429
/// for each element of `self`.
416430
///

src/f32/coresimd/vec3a.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,16 @@ impl Vec3A {
9090
Self(Simd::from_array([v; 4]))
9191
}
9292

93+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
94+
#[inline]
95+
#[must_use]
96+
pub fn map<F>(self, f: F) -> Self
97+
where
98+
F: Fn(f32) -> f32,
99+
{
100+
Self::new(f(self.x), f(self.y), f(self.z))
101+
}
102+
93103
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
94104
/// for each element of `self`.
95105
///

src/f32/coresimd/vec4.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,16 @@ impl Vec4 {
9292
Self(Simd::from_array([v; 4]))
9393
}
9494

95+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
96+
#[inline]
97+
#[must_use]
98+
pub fn map<F>(self, f: F) -> Self
99+
where
100+
F: Fn(f32) -> f32,
101+
{
102+
Self::new(f(self.x), f(self.y), f(self.z), f(self.w))
103+
}
104+
95105
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
96106
/// for each element of `self`.
97107
///

src/f32/neon/vec3a.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,16 @@ impl Vec3A {
9595
unsafe { UnionCast { a: [v; 4] }.v }
9696
}
9797

98+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
99+
#[inline]
100+
#[must_use]
101+
pub fn map<F>(self, f: F) -> Self
102+
where
103+
F: Fn(f32) -> f32,
104+
{
105+
Self::new(f(self.x), f(self.y), f(self.z))
106+
}
107+
98108
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
99109
/// for each element of `self`.
100110
///

src/f32/neon/vec4.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,16 @@ impl Vec4 {
9797
unsafe { UnionCast { a: [v; 4] }.v }
9898
}
9999

100+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
101+
#[inline]
102+
#[must_use]
103+
pub fn map<F>(self, f: F) -> Self
104+
where
105+
F: Fn(f32) -> f32,
106+
{
107+
Self::new(f(self.x), f(self.y), f(self.z), f(self.w))
108+
}
109+
100110
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
101111
/// for each element of `self`.
102112
///

src/f32/scalar/vec3a.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,16 @@ impl Vec3A {
9393
Self { x: v, y: v, z: v }
9494
}
9595

96+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
97+
#[inline]
98+
#[must_use]
99+
pub fn map<F>(self, f: F) -> Self
100+
where
101+
F: Fn(f32) -> f32,
102+
{
103+
Self::new(f(self.x), f(self.y), f(self.z))
104+
}
105+
96106
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
97107
/// for each element of `self`.
98108
///

src/f32/scalar/vec4.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,16 @@ impl Vec4 {
111111
}
112112
}
113113

114+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
115+
#[inline]
116+
#[must_use]
117+
pub fn map<F>(self, f: F) -> Self
118+
where
119+
F: Fn(f32) -> f32,
120+
{
121+
Self::new(f(self.x), f(self.y), f(self.z), f(self.w))
122+
}
123+
114124
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
115125
/// for each element of `self`.
116126
///

src/f32/sse2/vec3a.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,16 @@ impl Vec3A {
9898
unsafe { UnionCast { a: [v; 4] }.v }
9999
}
100100

101+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
102+
#[inline]
103+
#[must_use]
104+
pub fn map<F>(self, f: F) -> Self
105+
where
106+
F: Fn(f32) -> f32,
107+
{
108+
Self::new(f(self.x), f(self.y), f(self.z))
109+
}
110+
101111
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
102112
/// for each element of `self`.
103113
///

src/f32/sse2/vec4.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,16 @@ impl Vec4 {
100100
unsafe { UnionCast { a: [v; 4] }.v }
101101
}
102102

103+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
104+
#[inline]
105+
#[must_use]
106+
pub fn map<F>(self, f: F) -> Self
107+
where
108+
F: Fn(f32) -> f32,
109+
{
110+
Self::new(f(self.x), f(self.y), f(self.z), f(self.w))
111+
}
112+
103113
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
104114
/// for each element of `self`.
105115
///

src/f32/vec2.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,16 @@ impl Vec2 {
7878
Self { x: v, y: v }
7979
}
8080

81+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
82+
#[inline]
83+
#[must_use]
84+
pub fn map<F>(self, f: F) -> Self
85+
where
86+
F: Fn(f32) -> f32,
87+
{
88+
Self::new(f(self.x), f(self.y))
89+
}
90+
8191
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
8292
/// for each element of `self`.
8393
///

src/f32/vec3.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,16 @@ impl Vec3 {
8484
Self { x: v, y: v, z: v }
8585
}
8686

87+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
88+
#[inline]
89+
#[must_use]
90+
pub fn map<F>(self, f: F) -> Self
91+
where
92+
F: Fn(f32) -> f32,
93+
{
94+
Self::new(f(self.x), f(self.y), f(self.z))
95+
}
96+
8797
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
8898
/// for each element of `self`.
8999
///

src/f32/wasm32/vec3a.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,16 @@ impl Vec3A {
8989
Self(f32x4(v, v, v, v))
9090
}
9191

92+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
93+
#[inline]
94+
#[must_use]
95+
pub fn map<F>(self, f: F) -> Self
96+
where
97+
F: Fn(f32) -> f32,
98+
{
99+
Self::new(f(self.x), f(self.y), f(self.z))
100+
}
101+
92102
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
93103
/// for each element of `self`.
94104
///

src/f32/wasm32/vec4.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,16 @@ impl Vec4 {
9191
Self(f32x4(v, v, v, v))
9292
}
9393

94+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
95+
#[inline]
96+
#[must_use]
97+
pub fn map<F>(self, f: F) -> Self
98+
where
99+
F: Fn(f32) -> f32,
100+
{
101+
Self::new(f(self.x), f(self.y), f(self.z), f(self.w))
102+
}
103+
94104
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
95105
/// for each element of `self`.
96106
///

src/f64/dvec2.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,16 @@ impl DVec2 {
7878
Self { x: v, y: v }
7979
}
8080

81+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
82+
#[inline]
83+
#[must_use]
84+
pub fn map<F>(self, f: F) -> Self
85+
where
86+
F: Fn(f64) -> f64,
87+
{
88+
Self::new(f(self.x), f(self.y))
89+
}
90+
8191
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
8292
/// for each element of `self`.
8393
///

src/f64/dvec3.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,16 @@ impl DVec3 {
8484
Self { x: v, y: v, z: v }
8585
}
8686

87+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
88+
#[inline]
89+
#[must_use]
90+
pub fn map<F>(self, f: F) -> Self
91+
where
92+
F: Fn(f64) -> f64,
93+
{
94+
Self::new(f(self.x), f(self.y), f(self.z))
95+
}
96+
8797
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
8898
/// for each element of `self`.
8999
///

src/f64/dvec4.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,16 @@ impl DVec4 {
102102
}
103103
}
104104

105+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
106+
#[inline]
107+
#[must_use]
108+
pub fn map<F>(self, f: F) -> Self
109+
where
110+
F: Fn(f64) -> f64,
111+
{
112+
Self::new(f(self.x), f(self.y), f(self.z), f(self.w))
113+
}
114+
105115
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
106116
/// for each element of `self`.
107117
///

src/i16/i16vec2.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,16 @@ impl I16Vec2 {
7070
Self { x: v, y: v }
7171
}
7272

73+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
74+
#[inline]
75+
#[must_use]
76+
pub fn map<F>(self, f: F) -> Self
77+
where
78+
F: Fn(i16) -> i16,
79+
{
80+
Self::new(f(self.x), f(self.y))
81+
}
82+
7383
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
7484
/// for each element of `self`.
7585
///

src/i16/i16vec3.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,16 @@ impl I16Vec3 {
7676
Self { x: v, y: v, z: v }
7777
}
7878

79+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
80+
#[inline]
81+
#[must_use]
82+
pub fn map<F>(self, f: F) -> Self
83+
where
84+
F: Fn(i16) -> i16,
85+
{
86+
Self::new(f(self.x), f(self.y), f(self.z))
87+
}
88+
7989
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
8090
/// for each element of `self`.
8191
///

src/i16/i16vec4.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,16 @@ impl I16Vec4 {
9494
}
9595
}
9696

97+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
98+
#[inline]
99+
#[must_use]
100+
pub fn map<F>(self, f: F) -> Self
101+
where
102+
F: Fn(i16) -> i16,
103+
{
104+
Self::new(f(self.x), f(self.y), f(self.z), f(self.w))
105+
}
106+
97107
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
98108
/// for each element of `self`.
99109
///

src/i32/ivec2.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,16 @@ impl IVec2 {
7070
Self { x: v, y: v }
7171
}
7272

73+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
74+
#[inline]
75+
#[must_use]
76+
pub fn map<F>(self, f: F) -> Self
77+
where
78+
F: Fn(i32) -> i32,
79+
{
80+
Self::new(f(self.x), f(self.y))
81+
}
82+
7383
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
7484
/// for each element of `self`.
7585
///

src/i32/ivec3.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,16 @@ impl IVec3 {
7676
Self { x: v, y: v, z: v }
7777
}
7878

79+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
80+
#[inline]
81+
#[must_use]
82+
pub fn map<F>(self, f: F) -> Self
83+
where
84+
F: Fn(i32) -> i32,
85+
{
86+
Self::new(f(self.x), f(self.y), f(self.z))
87+
}
88+
7989
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
8090
/// for each element of `self`.
8191
///

src/i32/ivec4.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,16 @@ impl IVec4 {
9494
}
9595
}
9696

97+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
98+
#[inline]
99+
#[must_use]
100+
pub fn map<F>(self, f: F) -> Self
101+
where
102+
F: Fn(i32) -> i32,
103+
{
104+
Self::new(f(self.x), f(self.y), f(self.z), f(self.w))
105+
}
106+
97107
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
98108
/// for each element of `self`.
99109
///

src/i64/i64vec2.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,16 @@ impl I64Vec2 {
7070
Self { x: v, y: v }
7171
}
7272

73+
/// Returns a vector containing each element of `self` modified by a mapping function `f`.
74+
#[inline]
75+
#[must_use]
76+
pub fn map<F>(self, f: F) -> Self
77+
where
78+
F: Fn(i64) -> i64,
79+
{
80+
Self::new(f(self.x), f(self.y))
81+
}
82+
7383
/// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use
7484
/// for each element of `self`.
7585
///

0 commit comments

Comments
 (0)