bitunion.hh (12453:424595e0a14e) | bitunion.hh (12454:277c1f58ab6d) |
---|---|
1/* 2 * Copyright (c) 2007-2008 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 277 unchanged lines hidden (view full) --- 286//bitfield definitions which will end up inside it's union. As explained 287//above, these is overlayed the __storage member in its entirety by each of the 288//bitfields which are defined in the union, creating shared storage with no 289//overhead. 290#define __BitUnion(type, name) \ 291 class BitfieldUnderlyingClasses##name : \ 292 public BitfieldBackend::BitfieldTypes<type> \ 293 { \ | 1/* 2 * Copyright (c) 2007-2008 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 277 unchanged lines hidden (view full) --- 286//bitfield definitions which will end up inside it's union. As explained 287//above, these is overlayed the __storage member in its entirety by each of the 288//bitfields which are defined in the union, creating shared storage with no 289//overhead. 290#define __BitUnion(type, name) \ 291 class BitfieldUnderlyingClasses##name : \ 292 public BitfieldBackend::BitfieldTypes<type> \ 293 { \ |
294 public: \ | 294 protected: \ |
295 typedef type __StorageType; \ | 295 typedef type __StorageType; \ |
296 friend BitfieldBackend::BitUnionBaseType< \ 297 BitfieldBackend::BitUnionOperators< \ 298 BitfieldUnderlyingClasses##name> >; \ 299 friend BitfieldBackend::BitUnionBaseType< \ 300 BitfieldUnderlyingClasses##name>; \ 301 public: \ |
|
296 union { \ 297 type __storage; 298 299//This closes off the class and union started by the above macro. It is 300//followed by a typedef which makes "name" refer to a BitfieldOperator 301//class inheriting from the class and union just defined, which completes 302//building up the type for the user. 303#define EndBitUnion(name) \ --- 79 unchanged lines hidden (view full) --- 383 { 384 typedef typename BitUnionType<T>::__StorageType Type; 385 }; 386} 387 388template <typename T> 389using BitUnionBaseType = typename BitfieldBackend::BitUnionBaseType<T>::Type; 390 | 302 union { \ 303 type __storage; 304 305//This closes off the class and union started by the above macro. It is 306//followed by a typedef which makes "name" refer to a BitfieldOperator 307//class inheriting from the class and union just defined, which completes 308//building up the type for the user. 309#define EndBitUnion(name) \ --- 79 unchanged lines hidden (view full) --- 389 { 390 typedef typename BitUnionType<T>::__StorageType Type; 391 }; 392} 393 394template <typename T> 395using BitUnionBaseType = typename BitfieldBackend::BitUnionBaseType<T>::Type; 396 |
397 398//An STL style hash structure for hashing BitUnions based on their base type. |
|
391namespace std 392{ 393 template <typename T> 394 struct hash; 395 396 template <typename T> 397 struct hash<BitUnionType<T> > : public hash<BitUnionBaseType<T> > 398 { 399 size_t 400 operator() (const BitUnionType<T> &val) const 401 { 402 return hash<BitUnionBaseType<T> >::operator()(val); 403 } 404 }; 405} 406 407#endif // __BASE_BITUNION_HH__ | 399namespace std 400{ 401 template <typename T> 402 struct hash; 403 404 template <typename T> 405 struct hash<BitUnionType<T> > : public hash<BitUnionBaseType<T> > 406 { 407 size_t 408 operator() (const BitUnionType<T> &val) const 409 { 410 return hash<BitUnionBaseType<T> >::operator()(val); 411 } 412 }; 413} 414 415#endif // __BASE_BITUNION_HH__ |