Query and Inspection Operations
Relevant source files
This section documents the read-only operations available on CpuMask<SIZE>
instances for examining their state, testing individual bits, and finding set or unset CPU positions. These operations do not modify the cpumask and provide various ways to inspect its contents.
For information about creating new cpumask instances, see Construction and Conversion Methods. For operations that modify cpumask state, see Modification and Iteration.
Overview of Query Operations
The CpuMask
struct provides comprehensive query capabilities organized into several functional categories. These operations leverage the underlying bitmaps::Bitmap
functionality while providing a CPU-specific interface.
flowchart TD subgraph subGraph1["Return Types"] U["bool"] V["bool / usize"] W["Option"] X["Option"] Y["Store / &Store / &[u8]"] end subgraph subGraph0["CpuMask Query API"] A["get(index)"] B["Basic Bit Testing"] C["len()"] D["Size and State Queries"] E["is_empty()"] F["is_full()"] G["first_index()"] H["True Bit Location"] I["last_index()"] J["next_index(index)"] K["prev_index(index)"] L["first_false_index()"] M["False Bit Location"] N["last_false_index()"] O["next_false_index(index)"] P["prev_false_index(index)"] Q["as_value()"] R["Value Access"] S["into_value()"] T["as_bytes()"] end A --> B B --> U C --> D D --> V E --> D F --> D G --> H H --> W I --> H J --> H K --> H L --> M M --> X N --> M O --> M P --> M Q --> R R --> Y S --> R T --> R
Sources: src/lib.rs(L148 - L234)
Basic Bit Testing
get Method
The get
method tests whether a specific CPU bit is set in the mask.
Method | Signature | Description | Performance |
---|---|---|---|
get | get(self, index: usize) -> bool | Returnstrueif the bit atindexis set | O(1) |
The method performs bounds checking in debug builds and delegates to the underlying BitsImpl<SIZE>::Store::get
implementation.
flowchart TD A["CpuMask::get(index)"] B["debug_assert!(index < SIZE)"] C["self.into_value()"] D["BitsImpl::Store::get(&value, index)"] E["bool result"] A --> B B --> C C --> D D --> E
Sources: src/lib.rs(L167 - L171)
Size and State Queries
These methods provide high-level information about the cpumask's state without requiring iteration through individual bits.
Method | Signature | Description | Performance |
---|---|---|---|
len | len(self) -> usize | Count oftruebits in the mask | O(n) for most storage types |
is_empty | is_empty(self) -> bool | Tests if no bits are set | O(log n) |
is_full | is_full(self) -> bool | Tests if all valid bits are set | O(log n) |
Implementation Details
The is_empty
and is_full
methods are implemented in terms of the index-finding operations:
flowchart TD A["is_empty()"] B["first_index().is_none()"] C["is_full()"] D["first_false_index().is_none()"] E["Check if any bit is true"] F["Check if any bit is false"] G["len()"] H["self.value.len()"] I["Bitmap::len()"] A --> B B --> E C --> D D --> F G --> H H --> I
Sources: src/lib.rs(L149 - L164)
Index Finding Operations
The cpumask provides efficient methods for locating set and unset bits, supporting both forward and backward traversal patterns commonly used in CPU scheduling algorithms.
True Bit Location Methods
Method | Signature | Description |
---|---|---|
first_index | first_index(self) -> Option | Find first set bit |
last_index | last_index(self) -> Option | Find last set bit |
next_index | next_index(self, index: usize) -> Option | Find next set bit afterindex |
prev_index | prev_index(self, index: usize) -> Option | Find previous set bit beforeindex |
False Bit Location Methods
Method | Signature | Description |
---|---|---|
first_false_index | first_false_index(self) -> Option | Find first unset bit |
last_false_index | last_false_index(self) -> Option | Find last unset bit |
next_false_index | next_false_index(self, index: usize) -> Option | Find next unset bit afterindex |
prev_false_index | prev_false_index(self, index: usize) -> Option | Find previous unset bit beforeindex |
Delegation to BitsImpl
All index-finding operations delegate to the corresponding methods on the underlying storage type, with false-bit methods using corrected implementations that respect the SIZE
boundary:
flowchart TD subgraph subGraph2["Storage Access"] Q["self.into_value()"] R["as Bits>::Store"] end subgraph subGraph1["False Bit Methods"] I["first_false_index()"] M["BitsImpl::corrected_first_false_index()"] J["last_false_index()"] N["BitsImpl::corrected_last_false_index()"] K["next_false_index(index)"] O["BitsImpl::corrected_next_false_index()"] L["prev_false_index(index)"] P["BitsImpl::Store::prev_false_index()"] end subgraph subGraph0["True Bit Methods"] A["first_index()"] E["BitsImpl::Store::first_index()"] B["last_index()"] F["BitsImpl::Store::last_index()"] C["next_index(index)"] G["BitsImpl::Store::next_index()"] D["prev_index(index)"] H["BitsImpl::Store::prev_index()"] end A --> E B --> F C --> G D --> H E --> Q F --> Q G --> Q H --> Q I --> M J --> N K --> O L --> P M --> Q N --> Q O --> Q P --> Q Q --> R
Sources: src/lib.rs(L183 - L228)
Value Access Operations
These methods provide direct access to the underlying storage representation of the cpumask, enabling interoperability with external systems and efficient bulk operations.
Method | Signature | Description | Usage |
---|---|---|---|
into_value | into_value(self) -> <BitsImpl | Consume and return backing store | Move semantics |
as_value | as_value(&self) -> &<BitsImpl | Reference to backing store | Borrowed access |
as_bytes | as_bytes(&self) -> &[u8] | View as byte slice | Serialization |
Storage Type Mapping
The actual storage type returned by into_value
and referenced by as_value
depends on the SIZE
parameter:
flowchart TD A["SIZE Parameter"] B["Storage Selection"] C["bool"] D["u8"] E["u16"] F["u32"] G["u64"] H["u128"] I["[u128; N]"] J["into_value() -> bool"] K["into_value() -> u8"] L["into_value() -> u16"] M["into_value() -> u32"] N["into_value() -> u64"] O["into_value() -> u128"] P["into_value() -> [u128; N]"] A --> B B --> C B --> D B --> E B --> F B --> G B --> H B --> I C --> J D --> K E --> L F --> M G --> N H --> O I --> P
Sources: src/lib.rs(L131 - L146)
Performance Characteristics
The query operations exhibit different performance characteristics based on the underlying storage type and operation complexity:
Operation Category | Time Complexity | Notes |
---|---|---|
get(index) | O(1) | Direct bit access |
len() | O(n) | Requires bit counting |
is_empty(),is_full() | O(log n) | Uses optimized bit scanning |
Index finding | O(log n) to O(n) | Depends on bit density and hardware support |
Value access | O(1) | Direct storage access |
The actual performance depends heavily on the target architecture's bit manipulation instructions and the density of set bits in the mask.
Sources: src/lib.rs(L148 - L234)