A Bitmap class, basically a wrapper for bit shifting and masking
This commit is contained in:
		
							parent
							
								
									57aaad7d22
								
							
						
					
					
						commit
						764297de59
					
				
					 1 changed files with 100 additions and 0 deletions
				
			
		
							
								
								
									
										100
									
								
								src/kstd/Bitmap.hh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								src/kstd/Bitmap.hh
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,100 @@ | |||
| /* Bitmap.hh
 | ||||
|  * vim: set tw=80: | ||||
|  * Eryn Wells <eryn@erynwells.me> | ||||
|  */ | ||||
| /**
 | ||||
|  * Declares a Bitmap object, which manages an array of bytes. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef __KSTD_BITMAP_HH__ | ||||
| #define __KSTD_BITMAP_HH__ | ||||
| 
 | ||||
| #include "kstd/Types.hh" | ||||
| 
 | ||||
| namespace kstd { | ||||
| 
 | ||||
| /** An array-like object of N bits, where N is the size of the type T given as a template parameter. */ | ||||
| template <typename T> | ||||
| struct Bitmap | ||||
| { | ||||
|     typedef T FieldType; | ||||
| 
 | ||||
|     /** Size of the bitmap in bits. */ | ||||
|     static const usize length = sizeof(FieldType) * 8; | ||||
| 
 | ||||
|     Bitmap() | ||||
|         : mBitmap(0) | ||||
|     { } | ||||
| 
 | ||||
|     explicit | ||||
|     Bitmap(FieldType value) | ||||
|         : mBitmap(value) | ||||
|     { } | ||||
| 
 | ||||
|     /** Get the status of a single bit. Returns `true` if the bit is 1. */ | ||||
|     bool | ||||
|     isSet(usize bit) | ||||
|         const | ||||
|     { | ||||
|         if (isValid(bit)) { | ||||
|             return (mBitmap & (1 << bit)) > 0; | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     /** Set a single bit to 1. */ | ||||
|     void | ||||
|     set(usize bit) | ||||
|     { | ||||
|         if (isValid(bit)) { | ||||
|             mBitmap |= 1 << bit; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** Set a single bit to zero. */ | ||||
|     void | ||||
|     clear(usize bit) | ||||
|     { | ||||
|         if (isValid(bit)) { | ||||
|             mBitmap &= ~(1 << bit); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** Toggle the state of a single bit. Returns `true` if the bit was set to 1. */ | ||||
|     bool | ||||
|     toggle(usize bit) | ||||
|     { | ||||
|         if (isValid(bit)) { | ||||
|             mBitmap ^= 1 << bit; | ||||
|             return isSet(bit); | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     /** Clear the entire bit field. */ | ||||
|     void | ||||
|     zero() | ||||
|     { | ||||
|         mBitmap = 0; | ||||
|     } | ||||
| 
 | ||||
|     /** Set everything to 1. */ | ||||
|     void | ||||
|     fill() | ||||
|     { | ||||
|         mBitmap = ~(0); | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|     FieldType mBitmap; | ||||
| 
 | ||||
|     inline bool | ||||
|     isValid(usize bit) | ||||
|     { | ||||
|         return bit >= 0 && bit < Bitmap::length; | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| } /* namespace kstd */ | ||||
| 
 | ||||
| #endif /* __KSTD_BITMAP_HH__ */ | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue