Skip to content

Commit a47ff93

Browse files
authored
Merge pull request #823 from jszuppe/accessors-reupload
Accessors reupload
2 parents c4d1a88 + 3eb11f1 commit a47ff93

File tree

2 files changed

+119
-21
lines changed

2 files changed

+119
-21
lines changed

include/boost/compute/types/fundamental.hpp

+66-21
Original file line numberDiff line numberDiff line change
@@ -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
48104
template<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;
51108
public:
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> \

test/test_types.cpp

+53
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,56 @@ BOOST_AUTO_TEST_CASE(vector_string)
4242
stream << boost::compute::int2_(1, 2);
4343
BOOST_CHECK_EQUAL(stream.str(), std::string("int2(1, 2)"));
4444
}
45+
46+
BOOST_AUTO_TEST_CASE(vector_accessors_basic)
47+
{
48+
boost::compute::float4_ v;
49+
v.x = 1;
50+
v.y = 2;
51+
v.z = 3;
52+
v.w = 4;
53+
BOOST_CHECK(v == boost::compute::float4_(1, 2, 3, 4));
54+
}
55+
56+
BOOST_AUTO_TEST_CASE(vector_accessors_all)
57+
{
58+
boost::compute::int2_ i2(1, 2);
59+
BOOST_CHECK_EQUAL(i2.x, 1);
60+
BOOST_CHECK_EQUAL(i2.y, 2);
61+
62+
boost::compute::int4_ i4(1, 2, 3, 4);
63+
BOOST_CHECK_EQUAL(i4.x, 1);
64+
BOOST_CHECK_EQUAL(i4.y, 2);
65+
BOOST_CHECK_EQUAL(i4.z, 3);
66+
BOOST_CHECK_EQUAL(i4.w, 4);
67+
68+
boost::compute::int8_ i8(1, 2, 3, 4, 5, 6, 7, 8);
69+
BOOST_CHECK_EQUAL(i8.s0, 1);
70+
BOOST_CHECK_EQUAL(i8.s1, 2);
71+
BOOST_CHECK_EQUAL(i8.s2, 3);
72+
BOOST_CHECK_EQUAL(i8.s3, 4);
73+
BOOST_CHECK_EQUAL(i8.s4, 5);
74+
BOOST_CHECK_EQUAL(i8.s5, 6);
75+
BOOST_CHECK_EQUAL(i8.s6, 7);
76+
BOOST_CHECK_EQUAL(i8.s7, 8);
77+
78+
boost::compute::int16_ i16(
79+
1, 2, 3, 4, 5, 6, 7, 8,
80+
9, 10, 11, 12, 13, 14, 15, 16);
81+
BOOST_CHECK_EQUAL(i16.s0, 1);
82+
BOOST_CHECK_EQUAL(i16.s1, 2);
83+
BOOST_CHECK_EQUAL(i16.s2, 3);
84+
BOOST_CHECK_EQUAL(i16.s3, 4);
85+
BOOST_CHECK_EQUAL(i16.s4, 5);
86+
BOOST_CHECK_EQUAL(i16.s5, 6);
87+
BOOST_CHECK_EQUAL(i16.s6, 7);
88+
BOOST_CHECK_EQUAL(i16.s7, 8);
89+
BOOST_CHECK_EQUAL(i16.s8, 9);
90+
BOOST_CHECK_EQUAL(i16.s9, 10);
91+
BOOST_CHECK_EQUAL(i16.sa, 11);
92+
BOOST_CHECK_EQUAL(i16.sb, 12);
93+
BOOST_CHECK_EQUAL(i16.sc, 13);
94+
BOOST_CHECK_EQUAL(i16.sd, 14);
95+
BOOST_CHECK_EQUAL(i16.se, 15);
96+
BOOST_CHECK_EQUAL(i16.sf, 16);
97+
}

0 commit comments

Comments
 (0)