base: Add support for merging of interleaved address ranges
[gem5.git] / src / base / bitunion.hh
index 7f7b06966609e91e0601ec18e1ceea19f07cd827..f640fa3b19275b3d77400037312bc5453cdf870f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003-2005 The Regents of The University of Michigan
+ * Copyright (c) 2007-2008 The Regents of The University of Michigan
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #ifndef __BASE_BITUNION_HH__
 #define __BASE_BITUNION_HH__
 
-#include <inttypes.h>
 #include "base/bitfield.hh"
+#include "base/types.hh"
 
-//     The following implements the BitUnion system of defining bitfields
+//      The following implements the BitUnion system of defining bitfields
 //on top of an underlying class. This is done through the pervasive use of
 //both named and unnamed unions which all contain the same actual storage.
 //Since they're unioned with each other, all of these storage locations
@@ -86,7 +86,7 @@ namespace BitfieldBackend
         class Bitfield : public BitfieldBase<Type>
         {
           public:
-            operator uint64_t () const
+            operator const uint64_t () const
             {
                 return this->getBits(first, last);
             }
@@ -117,7 +117,7 @@ namespace BitfieldBackend
         class BitfieldWO : public Bitfield<first, last>
         {
           private:
-            operator uint64_t () const;
+            operator const uint64_t () const;
 
           public:
             using Bitfield<first, last>::operator=;
@@ -136,7 +136,7 @@ namespace BitfieldBackend
         class SignedBitfield : public BitfieldBase<Type>
         {
           public:
-            operator int64_t () const
+            operator const int64_t () const
             {
                 return sext<first - last + 1>(this->getBits(first, last));
             }
@@ -167,7 +167,7 @@ namespace BitfieldBackend
         class SignedBitfieldWO : public SignedBitfield<first, last>
         {
           private:
-            operator int64_t () const;
+            operator const int64_t () const;
 
           public:
             int64_t operator=(const int64_t _data)
@@ -200,7 +200,7 @@ namespace BitfieldBackend
 
         BitUnionOperators() {}
 
-        operator Type () const
+        operator const Type () const
         {
             return Base::__data;
         }
@@ -242,11 +242,7 @@ namespace BitfieldBackend
 //bitfields which are defined in the union, creating shared storage with no
 //overhead.
 #define __BitUnion(type, name) \
-    namespace BitfieldUnderlyingClasses \
-    { \
-        class name; \
-    } \
-    class BitfieldUnderlyingClasses::name : \
+    class BitfieldUnderlyingClasses##name : \
         public BitfieldBackend::BitfieldTypes<type> \
     { \
       public: \
@@ -262,8 +258,8 @@ namespace BitfieldBackend
         }; \
     }; \
     typedef BitfieldBackend::BitUnionOperators< \
-        BitfieldUnderlyingClasses::name::__DataType, \
-        BitfieldUnderlyingClasses::name> name;
+        BitfieldUnderlyingClasses##name::__DataType, \
+        BitfieldUnderlyingClasses##name> name;
 
 //This sets up a bitfield which has other bitfields nested inside of it. The
 //__data member functions like the "underlying storage" of the top level
@@ -284,7 +280,7 @@ namespace BitfieldBackend
 //do so.
 #define EndSubBitUnion(name) \
         }; \
-        inline operator const __DataType () \
+        inline operator const __DataType () const \
         { return __data; } \
         \
         inline const __DataType operator = (const __DataType & _data) \