Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
bit tag data More...
#include <BitPage.hpp>
Public Member Functions | |
BitPage (int bits_per_ent, unsigned char init_val) | |
Initialize memory. | |
void | get_bits (int offset, int count, int bits_per_ent, unsigned char *data) const |
Get tag values. | |
void | set_bits (int offset, int count, int bits_per_ent, const unsigned char *data) |
Set tag values. | |
void | set_bits (int offset, int count, int bits_per_ent, unsigned char value) |
Set several tag values to the same value. | |
unsigned char | get_bits (int offset, int bits_per_ent) const |
Get tag value. | |
void | set_bits (int offset, int bits_per_ent, unsigned char data) |
Set tag value. | |
void | search (unsigned char value, int offset, int count, int bits_per_ent, Range &results, EntityHandle start) const |
Search stored values for specified value. | |
Private Attributes | |
char | byteArray [BitTag::PageSize] |
The actual array of bytes. |
bit tag data
This class represents a fixed-size block of memory in which bit tag values are stored.
Definition at line 17 of file BitPage.hpp.
moab::BitPage::BitPage | ( | int | bits_per_ent, |
unsigned char | init_val | ||
) |
Initialize memory.
bits_per_ent | Number of bits in each tag value. MUST BE A POWER OF TWO. |
init_val | The lower bits_per_ent bits of this byte are used to initialize each tag value. |
Definition at line 22 of file BitPage.cpp.
References byteArray, and moab::BitTag::PageSize.
{ unsigned char mask = (unsigned char)( 1 << per_ent ) - 1; // 2^per_ent - 1 init_val &= (unsigned char)mask; switch( per_ent ) { default: assert( false ); abort(); break; // must be power of two // Note: fall through such that all bits in init_val are set, but with odd structure to avoid // fall-through warnings case 1: init_val |= (unsigned char)( init_val << 1 ); // fall through case 2: init_val |= (unsigned char)( init_val << 2 ); // fall through case 4: init_val |= (unsigned char)( init_val << 4 ); // fall through case 8:; } memset( byteArray, init_val, BitTag::PageSize ); }
void moab::BitPage::get_bits | ( | int | offset, |
int | count, | ||
int | bits_per_ent, | ||
unsigned char * | data | ||
) | const [inline] |
Get tag values.
Get 'count' tag values, beginning with the one at 'offset'.
offset | Offset into list of values, where a value of zero indicates the first tag value, a value of one indicates the second tag value, etc. NOTE: This is the value offset, not the bit offset. |
count | Number of consecutive tag values to get. |
bits_per_ent | Number of bits composing each tag value. NOTE: Must be a power of two. |
data | Memory into which to copy tag values. Each value is copied into a separate byte, such that the lower bits of the bit contain the tag value and any unused higher bits are zero. |
Definition at line 149 of file BitPage.hpp.
Referenced by search().
{ unsigned char* end = data + count; while( data != end ) *( data++ ) = get_bits( offset++, per_ent ); }
unsigned char moab::BitPage::get_bits | ( | int | offset, |
int | bits_per_ent | ||
) | const [inline] |
Get tag value.
Get one tag value.
offset | Offset into list of values, where a value of zero indicates the first tag value, a value of one indicates the second tag value, etc. NOTE: This is the value offset, not the bit offset. |
bits_per_ent | Number of bits composing each tag value. NOTE: Must be a power of two. |
Definition at line 127 of file BitPage.hpp.
References byteArray, and moab::BitTag::PageSize.
{ // Assume per_ent is a power of two, which should be guaranteed // by higher-level code. unsigned char mask = (unsigned char)( 1 << per_ent ) - 1; // 2^per_ent - 1 int byte = ( offset * per_ent ) >> 3; // shifting 3 is dividing by eight int bit = ( offset * per_ent ) & 7; // masking with 7 is modulo eight assert( byte < BitTag::PageSize ); return (unsigned char)( byteArray[byte] >> bit ) & mask; }
void moab::BitPage::search | ( | unsigned char | value, |
int | offset, | ||
int | count, | ||
int | bits_per_ent, | ||
Range & | results, | ||
EntityHandle | start | ||
) | const |
Search stored values for specified value.
Find the offsets n in the data at which the specified value occurs, and for each one insert 'start + n' into the passed Range.
value | The value to look for |
offset | The offset at which to begin searching |
count | The number of values to search |
bits_per_ent | Number of bits composing each tag value. |
results | Result list. |
start | The handle of the entity corresponding to the tag value stored at 'offset' |
Definition at line 9 of file BitPage.cpp.
References moab::Range::begin(), get_bits(), and moab::Range::insert().
{ const int end = offset + count; Range::iterator hint = results.begin(); while( offset != end ) { if( get_bits( offset, per_ent ) == value ) hint = results.insert( hint, start ); ++offset; ++start; } }
void moab::BitPage::set_bits | ( | int | offset, |
int | count, | ||
int | bits_per_ent, | ||
const unsigned char * | data | ||
) | [inline] |
Set tag values.
Set 'count' tag values, beginning with the one at 'offset'.
offset | Offset into list of values, where a value of zero indicates the first tag value, a value of one indicates the second tag value, etc. NOTE: This is the value offset, not the bit offset. |
count | Number of consecutive tag values to set. |
bits_per_ent | Number of bits composing each tag value. NOTE: Must be a power of two. |
data | Memory from which to copy tag values. Each value is copied from a separate byte. The lower 'bits_per_ent' of each byte are used as the tag value. Any additional higher bits are ignored. |
Definition at line 156 of file BitPage.hpp.
Referenced by set_bits().
{ const unsigned char* end = data + count; while( data != end ) set_bits( offset++, per_ent, *( data++ ) ); }
void moab::BitPage::set_bits | ( | int | offset, |
int | count, | ||
int | bits_per_ent, | ||
unsigned char | value | ||
) | [inline] |
Set several tag values to the same value.
Set 'count' tag values to specified value.
offset | Offset into list of values, where a value of zero indicates the first tag value, a value of one indicates the second tag value, etc. NOTE: This is the value offset, not the bit offset. |
count | Number of consecutive tag values to set. |
bits_per_ent | Number of bits composing each tag value. NOTE: Must be a power of two. |
value | The lower 'bits_per_ent' of this byte are used as the tag value. Any additional higher bits are ignored. |
Definition at line 163 of file BitPage.hpp.
References set_bits().
{ int end = offset + count; while( offset < end ) set_bits( offset++, per_ent, value ); }
void moab::BitPage::set_bits | ( | int | offset, |
int | bits_per_ent, | ||
unsigned char | data | ||
) | [inline] |
Set tag value.
Set tag value.
offset | Offset into list of values, where a value of zero indicates the first tag value, a value of one indicates the second tag value, etc. NOTE: This is the value offset, not the bit offset. |
bits_per_ent | Number of bits composing each tag value. NOTE: Must be a power of two. |
value | The lower 'bits_per_ent' of this byte are used as the tag value. Any additional higher bits are ignored. |
Definition at line 138 of file BitPage.hpp.
References byteArray, and moab::BitTag::PageSize.
{ int byte = ( offset * per_ent ) >> 3; // shifting 3 is dividing by eight int bit = ( offset * per_ent ) & 7; // masking with 7 is modulo eight assert( byte < BitTag::PageSize ); // Assume per_ent is a power of two, which should be guaranteed // by higher-level code. unsigned char mask = (unsigned char)( ( 1 << per_ent ) - 1 ) << bit; byteArray[byte] = (char)( ( byteArray[byte] & ~mask ) | ( ( bits << bit ) & mask ) ); }
char moab::BitPage::byteArray[BitTag::PageSize] [private] |
The actual array of bytes.
Definition at line 124 of file BitPage.hpp.
Referenced by BitPage(), get_bits(), and set_bits().