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