@@ -89,7 +89,16 @@ static inline constexpr uint32_t hb_uint32_swap (uint32_t v)
8989{ return (hb_uint16_swap (v) << 16 ) | hb_uint16_swap (v >> 16 ); }
9090
9191template <typename Type>
92- struct __attribute__ ((packed)) hb_packed_t { Type v; };
92+ struct __attribute__ ((packed)) hb_packed_t
93+ {
94+ hb_packed_t () = default ;
95+ constexpr hb_packed_t (Type V) : v (V) {}
96+ operator Type () const { return v; }
97+ hb_packed_t & operator = (Type V) { v = V; return *this ; }
98+
99+ private:
100+ Type v;
101+ };
93102
94103#ifndef HB_FAST_NUM_ACCESS
95104
@@ -134,9 +143,9 @@ struct HBInt<BE, Type, 2>
134143#if HB_FAST_NUM_ACCESS
135144 {
136145 if (BE == (__BYTE_ORDER == __BIG_ENDIAN))
137- ((hb_packed_t <uint16_t > *) v)-> v = V;
146+ * ((hb_packed_t <uint16_t > *) v) = V;
138147 else
139- ((hb_packed_t <uint16_t > *) v)-> v = __builtin_bswap16 (V);
148+ * ((hb_packed_t <uint16_t > *) v) = __builtin_bswap16 (V);
140149 }
141150#else
142151 : v {BE ? uint8_t ((V >> 8 ) & 0xFF ) : uint8_t ((V ) & 0xFF ),
@@ -147,9 +156,9 @@ struct HBInt<BE, Type, 2>
147156 {
148157#if HB_FAST_NUM_ACCESS
149158 return (BE == (__BYTE_ORDER == __BIG_ENDIAN)) ?
150- (( const hb_packed_t <uint16_t > *) v)-> v
159+ (uint16_t ) *(( const hb_packed_t <uint16_t > *) v)
151160 :
152- __builtin_bswap16 ((( const hb_packed_t <uint16_t > *) v)-> v )
161+ __builtin_bswap16 ((uint16_t ) *(( const hb_packed_t <uint16_t > *) v))
153162 ;
154163#else
155164 return (BE ? (v[0 ] << 8 ) : (v[0 ] ))
@@ -186,9 +195,9 @@ struct HBInt<BE, Type, 4>
186195#if HB_FAST_NUM_ACCESS
187196 {
188197 if (BE == (__BYTE_ORDER == __BIG_ENDIAN))
189- ((hb_packed_t <uint32_t > *) v)-> v = V;
198+ * ((hb_packed_t <uint32_t > *) v) = V;
190199 else
191- ((hb_packed_t <uint32_t > *) v)-> v = __builtin_bswap32 (V);
200+ * ((hb_packed_t <uint32_t > *) v) = __builtin_bswap32 (V);
192201 }
193202#else
194203 : v {BE ? uint8_t ((V >> 24 ) & 0xFF ) : uint8_t ((V ) & 0xFF ),
@@ -200,9 +209,9 @@ struct HBInt<BE, Type, 4>
200209 constexpr operator Type () const {
201210#if HB_FAST_NUM_ACCESS
202211 return (BE == (__BYTE_ORDER == __BIG_ENDIAN)) ?
203- (( const hb_packed_t <uint32_t > *) v)-> v
212+ (uint32_t ) *(( const hb_packed_t <uint32_t > *) v)
204213 :
205- __builtin_bswap32 ((( const hb_packed_t <uint32_t > *) v)-> v )
214+ __builtin_bswap32 ((uint32_t ) *(( const hb_packed_t <uint32_t > *) v))
206215 ;
207216#else
208217 return (BE ? (v[0 ] << 24 ) : (v[0 ] ))
@@ -226,9 +235,9 @@ struct HBInt<BE, Type, 8>
226235#if HB_FAST_NUM_ACCESS
227236 {
228237 if (BE == (__BYTE_ORDER == __BIG_ENDIAN))
229- ((hb_packed_t <uint64_t > *) v)-> v = V;
238+ * ((hb_packed_t <uint64_t > *) v) = V;
230239 else
231- ((hb_packed_t <uint64_t > *) v)-> v = __builtin_bswap64 (V);
240+ * ((hb_packed_t <uint64_t > *) v) = __builtin_bswap64 (V);
232241 }
233242#else
234243 : v {BE ? uint8_t ((V >> 56 ) & 0xFF ) : uint8_t ((V ) & 0xFF ),
@@ -244,9 +253,9 @@ struct HBInt<BE, Type, 8>
244253 constexpr operator Type () const {
245254#if HB_FAST_NUM_ACCESS
246255 return (BE == (__BYTE_ORDER == __BIG_ENDIAN)) ?
247- (( const hb_packed_t <uint64_t > *) v)-> v
256+ (uint64_t ) *(( const hb_packed_t <uint64_t > *) v)
248257 :
249- __builtin_bswap64 ((( const hb_packed_t <uint64_t > *) v)-> v )
258+ __builtin_bswap64 ((uint64_t ) *(( const hb_packed_t <uint64_t > *) v))
250259 ;
251260#else
252261 return (BE ? (uint64_t (v[0 ]) << 56 ) : (uint64_t (v[0 ]) ))
@@ -276,31 +285,31 @@ struct HBFloat
276285 {
277286#if HB_FAST_NUM_ACCESS
278287 {
279- if (BE == (__BYTE_ORDER == __BIG_ENDIAN))
280- {
281- ((hb_packed_t <Type> *) v)-> v = V;
282- return ;
283- }
284- }
288+ if (BE == (__BYTE_ORDER == __BIG_ENDIAN))
289+ {
290+ * ((hb_packed_t <Type> *) v) = V;
291+ return ;
292+ }
293+ }
285294#endif
286295
287296 union {
288297 hb_packed_t <Type> f;
289298 hb_packed_t <IntType> i;
290299 } u = {{V}};
291300
292- const HBInt<BE, IntType> I = u.i . v ;
301+ const HBInt<BE, IntType> I = (IntType) u.i ;
293302 for (unsigned i = 0 ; i < Bytes; i++)
294303 v[i] = I.v [i];
295304 }
296305
297306 /* c++14 constexpr */ operator Type () const
298307 {
299308#if HB_FAST_NUM_ACCESS
300- {
301- if (BE == (__BYTE_ORDER == __BIG_ENDIAN))
302- return (( const hb_packed_t <Type> *) v)-> v ;
303- }
309+ {
310+ if (BE == (__BYTE_ORDER == __BIG_ENDIAN))
311+ return (Type) *(( const hb_packed_t <Type> *) v);
312+ }
304313#endif
305314
306315 HBInt<BE, IntType> I;
@@ -312,7 +321,7 @@ struct HBFloat
312321 hb_packed_t <Type> f;
313322 } u = {{I}};
314323
315- return u.f . v ;
324+ return (Type) u.f ;
316325 }
317326 private: uint8_t v[Bytes];
318327};
0 commit comments