@@ -16,7 +16,7 @@ V swizzleFrom(const V& x) {
16
16
} else if constexpr (NumItems<V::size ()) { // fill in remainder of permutation
17
17
return swizzleFrom<V,0 ,V::size ()-NumItems,NumItems,N...>(x);
18
18
} else {
19
- return x.template swizzle <N...>();
19
+ return V ( x.template swizzle <N...>() );
20
20
}
21
21
}
22
22
@@ -44,7 +44,7 @@ class VecBitSet: public sycl::vec<T,N>
44
44
swizzleAsg<VecBitSet,T,0 ,n>(r,0 );
45
45
return r;
46
46
}
47
- return sycl::vec<T,N> (0 );
47
+ return VecBitSet (0 );
48
48
}
49
49
50
50
// shift vector by n positions using a swizzle
@@ -54,7 +54,7 @@ class VecBitSet: public sycl::vec<T,N>
54
54
swizzleAsg<VecBitSet,T,N-n,N>(r,0 );
55
55
return r;
56
56
}
57
- return sycl::vec<T,N> (0 );
57
+ return VecBitSet (0 );
58
58
}
59
59
60
60
// returns result of bitshifting to the left
@@ -63,21 +63,28 @@ class VecBitSet: public sycl::vec<T,N>
63
63
VecBitSet bitShiftLeft (sycl::vec<T,N> r, const sycl::vec<T,N>& l, unsigned remainder) const {
64
64
r>>=(8 *sizeof (T)-remainder);
65
65
r|=l<<remainder;
66
- return r ;
66
+ return VecBitSet (r) ;
67
67
}
68
68
69
69
#ifdef CLASSDESC_ACCESS
70
70
CLASSDESC_ACCESS (VecBitSet);
71
71
#endif
72
72
public:
73
+ using Vec=sycl::vec<T,N>;
73
74
VecBitSet ()=default ;
74
75
template <class U >
75
- VecBitSet (const U& x): sycl::vec<T,N>(x) {}
76
- template <class U >
77
- VecBitSet& operator =(const U& x) {sycl::vec<T,N>::operator =(x); return *this ;}
76
+ explicit VecBitSet (const U& x): sycl::vec<T,N>(x) {}
77
+ VecBitSet& operator =(T x) {sycl::vec<T,N>::operator =(x); return *this ;}
78
+ VecBitSet& operator =(const Vec& x) {sycl::vec<T,N>::operator =(x); return *this ;}
79
+ operator bool () const {
80
+ for (unsigned i=0 ; i<N; ++i)
81
+ if ((*this )[i]) return true ;
82
+ return false ;
83
+ }
84
+
78
85
// only need to fix up bit shift operations
79
- VecBitSet operator <<(unsigned n) const {
80
- auto d=div (int (n) ,8 *sizeof (T));
86
+ VecBitSet operator <<(int n) const {
87
+ auto d=div (n ,8 *sizeof (T));
81
88
switch (d.quot ) {
82
89
case 0 : return bitShiftLeft (shiftLeft<1 >(), *this , d.rem );
83
90
case 1 : return bitShiftLeft (shiftLeft<2 >(), shiftLeft<1 >(), d.rem );
@@ -94,12 +101,12 @@ class VecBitSet: public sycl::vec<T,N>
94
101
case 12 : return bitShiftLeft (shiftLeft<13 >(), shiftLeft<12 >(), d.rem );
95
102
case 13 : return bitShiftLeft (shiftLeft<14 >(), shiftLeft<13 >(), d.rem );
96
103
case 14 : return bitShiftLeft (shiftLeft<15 >(), shiftLeft<14 >(), d.rem );
97
- case 15 : return shiftLeft<15 >() >> (8 *sizeof (T)-d.rem );
98
- default : return sycl::vec<T,N> (0 ); // SYCL defines a maximum of 16 elements in a vec.
104
+ case 15 : return shiftLeft<15 >() >> int (8 *sizeof (T)-d.rem );
105
+ default : return VecBitSet (0 ); // SYCL defines a maximum of 16 elements in a vec.
99
106
}
100
107
}
101
- VecBitSet operator >>(unsigned n) const {
102
- auto d=div (int (n) ,8 *sizeof (T));
108
+ VecBitSet operator >>(int n) const {
109
+ auto d=div (n ,8 *sizeof (T));
103
110
d.rem =(8 *sizeof (T)-d.rem )%(8 *sizeof (T)); // shift the other way
104
111
switch (d.quot ) {
105
112
case 0 : return bitShiftLeft (*this , shiftRight<1 >(), d.rem );
@@ -117,13 +124,53 @@ class VecBitSet: public sycl::vec<T,N>
117
124
case 12 : return bitShiftLeft (shiftRight<12 >(), shiftRight<13 >(), d.rem );
118
125
case 13 : return bitShiftLeft (shiftRight<13 >(), shiftRight<14 >(), d.rem );
119
126
case 14 : return bitShiftLeft (shiftRight<14 >(), shiftRight<15 >(), d.rem );
120
- case 15 : return shiftRight<15 >() >> ( 8 * sizeof (T)- d.rem ) ;
121
- default : return sycl::vec<T,N> (0 ); // SYCL defines a maximum of 16 elements in a vec.
127
+ case 15 : return shiftRight<15 >() >> d.rem ;
128
+ default : return VecBitSet (0 ); // SYCL defines a maximum of 16 elements in a vec.
122
129
}
123
130
}
131
+
132
+ int operator <=>(const VecBitSet& x) const {
133
+ for (unsigned i=0 ; i<N; ++i)
134
+ {
135
+ if ((*this )[i]<x[i]) return -1 ;
136
+ if (x[i]<(*this )[i]) return 1 ;
137
+ }
138
+ return 0 ;
139
+ }
124
140
};
125
141
142
+ #define CLASSDESC_json_pack___VecBitSet_T_N_
143
+ #define CLASSDESC_json_unpack___VecBitSet_T_N_
144
+ #define CLASSDESC_RESTProcess___VecBitSet_T_N_
126
145
146
+ #include " json_pack_base.h"
147
+ namespace classdesc_access
148
+ {
149
+ template <class T , unsigned N> struct access_json_pack <VecBitSet<T,N>> {
150
+ template <class _CD_ARG_TYPE >
151
+ void operator ()(classdesc::json_pack_t & targ, const classdesc::string& desc,_CD_ARG_TYPE& arg)
152
+ {
153
+ std::vector<T> tmp;
154
+ for (unsigned i=0 ; i<arg.size (); ++i)
155
+ tmp.push_back (arg[i]);
156
+ targ<<tmp;
157
+ }
158
+ };
159
+
160
+ template <class T , unsigned N> struct access_json_unpack <VecBitSet<T,N>> {
161
+ template <class _CD_ARG_TYPE >
162
+ void operator ()(classdesc::json_pack_t & targ, const classdesc::string& desc,_CD_ARG_TYPE& arg)
163
+ {
164
+ std::vector<T> tmp;
165
+ targ>>tmp;
166
+ for (unsigned i=0 ; i<arg.size () && i<tmp.size (); ++i)
167
+ arg[i]=tmp[i];
168
+ }
169
+ };
170
+
171
+ template <class T , unsigned N> struct access_RESTProcess <VecBitSet<T,N>>:
172
+ public classdesc::NullDescriptor<classdesc::RESTProcess_t> {};
173
+ }
127
174
128
175
#endif
129
176
#endif
0 commit comments