Things like foo.multiply(Sk4f(t,t,t,t)) can just be foo.multiply(t).
BUG=skia:
Review URL: https://codereview.chromium.org/
960773005
template <typename T> class Sk4x {
public:
- Sk4x(); // Uninitialized; use Sk4x(0,0,0,0) for zero.
+ Sk4x(); // Uninitialized; use Sk4x(0) for zero.
+ /*implicit*/ Sk4x(T); // Same as Sk4x(T,T,T,T);
Sk4x(T, T, T, T);
Sk4x(const Sk4x&);
#define M(...) template <typename T> __VA_ARGS__ Sk4x<T>::
M() Sk4x() {}
+M() Sk4x(T v) { fVec[0] = fVec[1] = fVec[2] = fVec[3] = v; }
M() Sk4x(T a, T b, T c, T d) { fVec[0] = a; fVec[1] = b; fVec[2] = c; fVec[3] = d; }
M() Sk4x(const Sk4x<T>& other) { this->set(other.fVec); }
// Now we'll write all Sk4f specific methods. This M() macro will remove some noise.
#define M(...) template <> inline __VA_ARGS__ Sk4f::
+M() Sk4x(float v) : fVec(_mm_set1_ps(v)) {}
M() Sk4x(float a, float b, float c, float d) : fVec(_mm_set_ps(d,c,b,a)) {}
M(Sk4f) Load (const float fs[4]) { return _mm_loadu_ps(fs); }
#undef M
#define M(...) template <> inline __VA_ARGS__ Sk4i::
+M() Sk4x(int32_t v) : fVec(_mm_set1_epi32(v)) {}
M() Sk4x(int32_t a, int32_t b, int32_t c, int32_t d) : fVec(_mm_set_epi32(d,c,b,a)) {}
M(Sk4i) Load (const int32_t is[4]) { return _mm_loadu_si128((const __m128i*)is); }
ASSERT_EQ(Sk4i(3,8,15,24), Sk4i(1,2,3,4).multiply(Sk4i(3,4,5,6)));
}
+DEF_TEST(Sk4x_ImplicitPromotion, r) {
+ ASSERT_EQ(Sk4f(2,4,6,8), Sk4f(1,2,3,4).multiply(2.0f));
+}
+
DEF_TEST(Sk4x_Comparison, r) {
ASSERT_EQ(Sk4f(1,2,3,4), Sk4f(1,2,3,4));
ASSERT_NE(Sk4f(4,3,2,1), Sk4f(1,2,3,4));