Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: TYBLE16_simple_data_logger TYBLE16_MP3_Air
Span< ElementType, Extent > Struct Template Reference
[Span class]
Nonowning view to a sequence of contiguous elements. More...
#include <Span.h>
Public Types | |
typedef ElementType | element_type |
Type of the element contained. | |
typedef ptrdiff_t | index_type |
Type of the index. | |
typedef element_type * | pointer |
Pointer to an ElementType. | |
typedef element_type & | reference |
Reference to an ElementType. | |
Public Member Functions | |
Span () | |
Construct an empty Span. | |
Span (pointer ptr, index_type count) | |
Construct a Span from a pointer to a buffer and its size. | |
Span (pointer first, pointer last) | |
Construct a Span from the range [first, last). | |
Span (element_type(&elements)[Extent]) | |
Construct a Span from the reference to an array. | |
template<typename OtherElementType > | |
Span (const Span< OtherElementType, Extent > &other) | |
Construct a Span object from another Span of the same size. | |
index_type | size () const |
Return the size of the sequence viewed. | |
bool | empty () const |
Return if the sequence is empty or not. | |
reference | operator[] (index_type index) const |
Returns a reference to the element at position index . | |
pointer | data () const |
Return a pointer to the first element of the sequence or NULL if the Span is empty(). | |
template<ptrdiff_t Count> | |
Span< element_type, Count > | first () const |
Create a new Span over the first Count elements of the existing view. | |
template<ptrdiff_t Count> | |
Span< element_type, Count > | last () const |
Create a new Span over the last Count elements of the existing view. | |
template<std::ptrdiff_t Offset, std::ptrdiff_t Count> | |
Span< element_type, Count==SPAN_DYNAMIC_EXTENT?Extent-Offset:Count > | subspan () const |
Create a subspan that is a view of other Count elements; the view starts at element Offset. | |
Span< element_type, SPAN_DYNAMIC_EXTENT > | first (index_type count) const |
Create a new Span over the first count elements of the existing view. | |
Span< element_type, SPAN_DYNAMIC_EXTENT > | last (index_type count) const |
Create a new Span over the last count elements of the existing view. | |
Span< element_type, SPAN_DYNAMIC_EXTENT > | subspan (index_type offset, index_type count=SPAN_DYNAMIC_EXTENT) const |
Create a subspan that is a view of other count elements; the view starts at element offset. | |
Static Public Attributes | |
static const index_type | extent = Extent |
Size of the Extent; -1 if dynamic. | |
Related Functions | |
(Note that these are not member functions.) | |
const ptrdiff_t | SPAN_DYNAMIC_EXTENT = -1 |
Special value for the Extent parameter of Span. | |
template<typename T , typename U , ptrdiff_t LhsExtent, ptrdiff_t RhsExtent> | |
bool | operator== (const Span< T, LhsExtent > &lhs, const Span< U, RhsExtent > &rhs) |
Equality operator between two Span objects. | |
template<typename T , typename U , ptrdiff_t LhsExtent, ptrdiff_t RhsExtent> | |
bool | operator!= (const Span< T, LhsExtent > &lhs, const Span< U, RhsExtent > &rhs) |
Not equal operator. | |
template<typename T , size_t Size> | |
Span< T, Size > | make_Span (T(&elements)[Size]) |
Generate a Span from a reference to a C/C++ array. | |
template<typename T > | |
Span< T > | make_Span (T *array_ptr, ptrdiff_t array_size) |
Generate a Span from a C/C++ pointer and the size of the array. | |
template<size_t Extent, typename T > | |
Span< const T, Extent > | make_const_Span (const T *elements) |
Generate a Span to a const content from a pointer to a C/C++ array. | |
template<typename T > | |
Span< const T > | make_const_Span (T *array_ptr, size_t array_size) |
Generate a Span to a const content from a C/C++ pointer and the size of the array. |
Detailed Description
template<typename ElementType, ptrdiff_t Extent = SPAN_DYNAMIC_EXTENT>
struct mbed::Span< ElementType, Extent >
Nonowning view to a sequence of contiguous elements.
Spans encapsulate a pointer to a sequence of contiguous elements and its size into a single object. Span can replace the traditional pair of pointer and size arguments passed as array definitions in function calls.
- Operations
Span objects can be copied and assigned like regular value types with the help of the copy constructor or the copy assignment (=) operator.
You can retrieve elements of the object with the subscript ([]) operator. You can access the pointer to the first element of the sequence viewed with data(). The function size() returns the number of elements in the sequence, and empty() informs whether there is any element in the sequence.
You can slice Span from the beginning of the sequence (first()), from the end of the sequence (last()) or from an arbitrary point of the sequence (subspan()).
- Size encoding
The size of the sequence can be encoded in the type itself or in the value of the instance with the help of the template parameter Extent:
- Span<uint8_t, 6>: Span over a sequence of 6 elements.
- Span<uint8_t>: Span over an arbitrary long sequence.
When the size is encoded in the type itself, it is guaranteed that the Span view is a valid sequence (not empty() and not NULL) - unless Extent equals 0. The type system also prevents automatic conversion from Span of different sizes. Finally, the Span object is internally represented as a single pointer.
When the size of the sequence viewed is encoded in the Span value, Span instances can view an empty sequence. The function empty() helps client code decide whether Span is viewing valid content or not.
- Example
- Encoding fixed size array: Array values in parameter decays automatically to pointer, which leaves room for subtitle bugs:
typedef uint8_t mac_address_t[6]; void process_mac(mac_address_t); // compile just fine uint8_t *invalid_value = NULL; process_mac(invalid_value); // correct way typedef Span<uint8_t, 6> mac_address_t; void process_mac(mac_address_t); // compilation error uint8_t *invalid_value = NULL; process_mac(invalid_value); // compilation ok uint8_t valid_value[6]; process_mac(valid_value);
- Arbitrary buffer: When dealing with multiple buffers, it becomes painful to keep track of every buffer size and pointer.
const uint8_t options_tag[OPTIONS_TAG_SIZE]; struct parsed_value_t { uint8_t *header; uint8_t *options; uint8_t *payload; size_t payload_size; } parsed_value_t parse(uint8_t *buffer, size_t buffer_size) { parsed_value_t parsed_value { 0 }; if (buffer != NULL && buffer_size <= MINIMAL_BUFFER_SIZE) { return parsed_value; } parsed_value.header = buffer; parsed_value.header_size = BUFFER_HEADER_SIZE; if (memcmp(buffer + HEADER_OPTIONS_INDEX, options_tag, sizeof(options_tag)) == 0) { options = buffer + BUFFER_HEADER_SIZE; payload = buffer + BUFFER_HEADER_SIZE + OPTIONS_SIZE; payload_size = buffer_size - BUFFER_HEADER_SIZE + OPTIONS_SIZE; } else { payload = buffer + BUFFER_HEADER_SIZE; payload_size = buffer_size - BUFFER_HEADER_SIZE; } return parsed_value; } //with Span struct parsed_value_t { Span<uint8_t> header; Span<uint8_t> options; Span<uint8_t> payload; } parsed_value_t parse(const Span<uint8_t> &buffer) { parsed_value_t parsed_value; if (buffer.size() <= MINIMAL_BUFFER_SIZE) { return parsed_value; } parsed_value.header = buffer.first(BUFFER_HEADER_SIZE); if (buffer.subspan<HEADER_OPTIONS_INDEX, sizeof(options_tag)>() == option_tag) { options = buffer.supspan(parsed_value.header.size(), OPTIONS_SIZE); } payload = buffer.subspan(parsed_value.header.size() + parsed_value.options.size()); return parsed_value; }
- Note:
- You can create Span instances with the help of the function template make_Span() and make_const_Span().
- Span<T, Extent> objects can be implicitly converted to Span<T> objects where required.
- Template Parameters:
-
ElementType type of objects the Span views. Extent The size of the contiguous sequence viewed. The default value SPAN_DYNAMIC_SIZE is special because it allows construction of Span objects of any size (set at runtime).
Definition at line 214 of file Span.h.
Member Typedef Documentation
typedef ElementType element_type |
typedef ptrdiff_t index_type |
typedef element_type* pointer |
typedef element_type& reference |
Constructor & Destructor Documentation
Span | ( | ) |
Span | ( | pointer | ptr, |
index_type | count | ||
) |
Construct a Span from a pointer to a buffer and its size.
- Parameters:
-
ptr Pointer to the beginning of the data viewed. count Number of elements viewed.
- Precondition:
- [ptr, ptr + count) must be be a valid range.
- count must be equal to Extent.
Construct a Span from the range [first, last).
- Parameters:
-
first Pointer to the beginning of the data viewed. last End of the range (element after the last element).
- Precondition:
- [first, last) must be be a valid range.
- first <= last.
- last - first must be equal to Extent.
Span | ( | element_type(&) | elements[Extent] ) |
Member Function Documentation
pointer data | ( | ) | const |
bool empty | ( | ) | const |
Span<element_type, SPAN_DYNAMIC_EXTENT> first | ( | index_type | count ) | const |
Span<element_type, Count> first | ( | ) | const |
Span<element_type, SPAN_DYNAMIC_EXTENT> last | ( | index_type | count ) | const |
Span<element_type, Count> last | ( | ) | const |
reference operator[] | ( | index_type | index ) | const |
index_type size | ( | ) | const |
Span<element_type, SPAN_DYNAMIC_EXTENT> subspan | ( | index_type | offset, |
index_type | count = SPAN_DYNAMIC_EXTENT |
||
) | const |
Create a subspan that is a view of other count elements; the view starts at element offset.
- Parameters:
-
offset The offset of the first element viewed by the subspan. count The number of elements present in the subspan. If Count is equal to SPAN_DYNAMIC_EXTENT, then a span starting at offset and containing the rest of the elements is returned.
- Returns:
Span<element_type, Count == SPAN_DYNAMIC_EXTENT ? Extent - Offset : Count> subspan | ( | ) | const |
Create a subspan that is a view of other Count elements; the view starts at element Offset.
- Template Parameters:
-
Offset The offset of the first element viewed by the subspan. Count The number of elements present in the subspan. If Count is equal to SPAN_DYNAMIC_EXTENT, then a Span starting at offset and containing the rest of the elements is returned.
- Returns:
- A subspan of this starting at Offset and Count long.
Field Documentation
const index_type extent = Extent [static] |
Generated on Tue Jul 12 2022 13:55:44 by
