@@ -44,33 +44,91 @@ typedef cl_double double_;
4444#define BOOST_COMPUTE_MAKE_VECTOR_TYPE (scalar, size ) \
4545 BOOST_PP_CAT (BOOST_PP_CAT(::boost::compute::scalar, size), _)
4646
47+ namespace detail {
48+
49+ // specialized vector_type base classes that provide the
50+ // (x,y), (x,y,z,w), (s0..s7), (s0..sf) accessors
51+ template <class Scalar , size_t N> class vector_type_desc ;
52+
53+ template <class Scalar >
54+ class vector_type_desc <Scalar, 2 >
55+ {
56+ public:
57+ Scalar x, y;
58+
59+ Scalar& operator [](size_t i)
60+ {
61+ return (&x)[i];
62+ }
63+
64+ const Scalar operator [](size_t i) const
65+ {
66+ return (&x)[i];
67+ }
68+ };
69+
70+ template <class Scalar >
71+ class vector_type_desc <Scalar, 4 > : public vector_type_desc<Scalar, 2 >
72+ {
73+ public:
74+ Scalar z, w;
75+ };
76+
77+ template <class Scalar >
78+ class vector_type_desc <Scalar, 8 >
79+ {
80+ public:
81+ Scalar s0, s1, s2, s3, s4, s5, s6, s7;
82+
83+ Scalar& operator [](size_t i)
84+ {
85+ return (&s0)[i];
86+ }
87+
88+ const Scalar operator [](size_t i) const
89+ {
90+ return (&s0)[i];
91+ }
92+ };
93+
94+ template <class Scalar >
95+ class vector_type_desc <Scalar, 16 > : public vector_type_desc<Scalar, 8 >
96+ {
97+ public:
98+ Scalar s8, s9, sa, sb, sc, sd, se, sf;
99+ };
100+
101+ } // end detail namespace
102+
47103// vector data types
48104template <class Scalar , size_t N>
49- class vector_type
105+ class vector_type : public detail ::vector_type_desc<Scalar, N>
50106{
107+ typedef detail::vector_type_desc<Scalar, N> base_type;
51108public:
52109 typedef Scalar scalar_type;
53110
54111 vector_type ()
55- : m_value ()
112+ : base_type ()
56113 {
114+ BOOST_STATIC_ASSERT (sizeof (Scalar) * N == sizeof (vector_type<Scalar, N>));
57115 }
58116
59117 explicit vector_type (const Scalar scalar)
60118 {
61119 for (size_t i = 0 ; i < N; i++)
62- m_value [i] = scalar;
120+ (* this ) [i] = scalar;
63121 }
64122
65123 vector_type (const vector_type<Scalar, N> &other)
66124 {
67- std::memcpy (m_value, other. m_value , sizeof (m_value) );
125+ std::memcpy (this , & other, sizeof (Scalar) * N );
68126 }
69127
70128 vector_type<Scalar, N>&
71129 operator =(const vector_type<Scalar, N> &other)
72130 {
73- std::memcpy (m_value, other. m_value , sizeof (m_value) );
131+ std::memcpy (this , & other, sizeof (Scalar) * N );
74132 return *this ;
75133 }
76134
@@ -79,38 +137,25 @@ class vector_type
79137 return N;
80138 }
81139
82- Scalar& operator [](size_t i)
83- {
84- return m_value[i];
85- }
86-
87- Scalar operator [](size_t i) const
88- {
89- return m_value[i];
90- }
91-
92140 bool operator ==(const vector_type<Scalar, N> &other) const
93141 {
94- return std::memcmp (m_value, other. m_value , sizeof (m_value) ) == 0 ;
142+ return std::memcmp (this , & other, sizeof (Scalar) * N ) == 0 ;
95143 }
96144
97145 bool operator !=(const vector_type<Scalar, N> &other) const
98146 {
99147 return !(*this == other);
100148 }
101-
102- protected:
103- scalar_type m_value[N];
104149};
105150
106151#define BOOST_COMPUTE_VECTOR_TYPE_CTOR_ARG_FUNCTION (z, i, _ ) \
107152 BOOST_PP_COMMA_IF (i) scalar_type BOOST_PP_CAT (arg, i)
108153#define BOOST_COMPUTE_VECTOR_TYPE_DECLARE_CTOR_ARGS (scalar, size ) \
109154 BOOST_PP_REPEAT (size, BOOST_COMPUTE_VECTOR_TYPE_CTOR_ARG_FUNCTION, _)
110155#define BOOST_COMPUTE_VECTOR_TYPE_ASSIGN_CTOR_ARG (z, i, _ ) \
111- m_value [i] = BOOST_PP_CAT(arg, i);
156+ (* this ) [i] = BOOST_PP_CAT(arg, i);
112157#define BOOST_COMPUTE_VECTOR_TYPE_ASSIGN_CTOR_SINGLE_ARG (z, i, _ ) \
113- m_value [i] = arg;
158+ (* this ) [i] = arg;
114159
115160#define BOOST_COMPUTE_DECLARE_VECTOR_TYPE_CLASS (cl_scalar, size, class_name ) \
116161 class class_name : public vector_type <cl_scalar, size> \
0 commit comments