@@ -44,33 +44,91 @@ typedef cl_double double_;
44
44
#define BOOST_COMPUTE_MAKE_VECTOR_TYPE (scalar, size ) \
45
45
BOOST_PP_CAT (BOOST_PP_CAT(::boost::compute::scalar, size), _)
46
46
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
+
47
103
// vector data types
48
104
template <class Scalar , size_t N>
49
- class vector_type
105
+ class vector_type : public detail ::vector_type_desc<Scalar, N>
50
106
{
107
+ typedef detail::vector_type_desc<Scalar, N> base_type;
51
108
public:
52
109
typedef Scalar scalar_type;
53
110
54
111
vector_type ()
55
- : m_value ()
112
+ : base_type ()
56
113
{
114
+ BOOST_STATIC_ASSERT (sizeof (Scalar) * N == sizeof (vector_type<Scalar, N>));
57
115
}
58
116
59
117
explicit vector_type (const Scalar scalar)
60
118
{
61
119
for (size_t i = 0 ; i < N; i++)
62
- m_value [i] = scalar;
120
+ (* this ) [i] = scalar;
63
121
}
64
122
65
123
vector_type (const vector_type<Scalar, N> &other)
66
124
{
67
- std::memcpy (m_value, other. m_value , sizeof (m_value) );
125
+ std::memcpy (this , & other, sizeof (Scalar) * N );
68
126
}
69
127
70
128
vector_type<Scalar, N>&
71
129
operator =(const vector_type<Scalar, N> &other)
72
130
{
73
- std::memcpy (m_value, other. m_value , sizeof (m_value) );
131
+ std::memcpy (this , & other, sizeof (Scalar) * N );
74
132
return *this ;
75
133
}
76
134
@@ -79,38 +137,25 @@ class vector_type
79
137
return N;
80
138
}
81
139
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
-
92
140
bool operator ==(const vector_type<Scalar, N> &other) const
93
141
{
94
- return std::memcmp (m_value, other. m_value , sizeof (m_value) ) == 0 ;
142
+ return std::memcmp (this , & other, sizeof (Scalar) * N ) == 0 ;
95
143
}
96
144
97
145
bool operator !=(const vector_type<Scalar, N> &other) const
98
146
{
99
147
return !(*this == other);
100
148
}
101
-
102
- protected:
103
- scalar_type m_value[N];
104
149
};
105
150
106
151
#define BOOST_COMPUTE_VECTOR_TYPE_CTOR_ARG_FUNCTION (z, i, _ ) \
107
152
BOOST_PP_COMMA_IF (i) scalar_type BOOST_PP_CAT (arg, i)
108
153
#define BOOST_COMPUTE_VECTOR_TYPE_DECLARE_CTOR_ARGS (scalar, size ) \
109
154
BOOST_PP_REPEAT (size, BOOST_COMPUTE_VECTOR_TYPE_CTOR_ARG_FUNCTION, _)
110
155
#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);
112
157
#define BOOST_COMPUTE_VECTOR_TYPE_ASSIGN_CTOR_SINGLE_ARG (z, i, _ ) \
113
- m_value [i] = arg;
158
+ (* this ) [i] = arg;
114
159
115
160
#define BOOST_COMPUTE_DECLARE_VECTOR_TYPE_CLASS (cl_scalar, size, class_name ) \
116
161
class class_name : public vector_type <cl_scalar, size> \
0 commit comments