mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
188:bcfe06ba3d64
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 188:bcfe06ba3d64 1 /* mbed Microcontroller Library
AnnaBridge 188:bcfe06ba3d64 2 * Copyright (c) 2018-2018 ARM Limited
AnnaBridge 189:f392fc9709a3 3 * SPDX-License-Identifier: Apache-2.0
AnnaBridge 188:bcfe06ba3d64 4 *
AnnaBridge 188:bcfe06ba3d64 5 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 188:bcfe06ba3d64 6 * you may not use this file except in compliance with the License.
AnnaBridge 188:bcfe06ba3d64 7 * You may obtain a copy of the License at
AnnaBridge 188:bcfe06ba3d64 8 *
AnnaBridge 188:bcfe06ba3d64 9 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 188:bcfe06ba3d64 10 *
AnnaBridge 188:bcfe06ba3d64 11 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 188:bcfe06ba3d64 12 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 188:bcfe06ba3d64 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 188:bcfe06ba3d64 14 * See the License for the specific language governing permissions and
AnnaBridge 188:bcfe06ba3d64 15 * limitations under the License.
AnnaBridge 188:bcfe06ba3d64 16 */
AnnaBridge 188:bcfe06ba3d64 17
AnnaBridge 188:bcfe06ba3d64 18 #ifndef MBED_PLATFORM_SPAN_H_
AnnaBridge 188:bcfe06ba3d64 19 #define MBED_PLATFORM_SPAN_H_
AnnaBridge 188:bcfe06ba3d64 20
AnnaBridge 188:bcfe06ba3d64 21 #include <algorithm>
AnnaBridge 188:bcfe06ba3d64 22 #include <stddef.h>
AnnaBridge 188:bcfe06ba3d64 23 #include <stdint.h>
AnnaBridge 188:bcfe06ba3d64 24
AnnaBridge 188:bcfe06ba3d64 25 #include "platform/mbed_assert.h"
AnnaBridge 188:bcfe06ba3d64 26
AnnaBridge 188:bcfe06ba3d64 27 namespace mbed {
AnnaBridge 188:bcfe06ba3d64 28
AnnaBridge 188:bcfe06ba3d64 29 /** \addtogroup platform */
AnnaBridge 188:bcfe06ba3d64 30 /** @{*/
AnnaBridge 188:bcfe06ba3d64 31 /**
AnnaBridge 188:bcfe06ba3d64 32 * \defgroup platform_Span Span class
AnnaBridge 188:bcfe06ba3d64 33 * @{
AnnaBridge 188:bcfe06ba3d64 34 */
AnnaBridge 188:bcfe06ba3d64 35
AnnaBridge 188:bcfe06ba3d64 36 // Internal details of Span
AnnaBridge 188:bcfe06ba3d64 37 // It is used construct Span from Span of convertible types (non const -> const)
AnnaBridge 188:bcfe06ba3d64 38 namespace span_detail {
AnnaBridge 188:bcfe06ba3d64 39
AnnaBridge 188:bcfe06ba3d64 40 // If From type is convertible to To type, then the compilation constant value is
AnnaBridge 188:bcfe06ba3d64 41 // true; otherwise, it is false.
AnnaBridge 188:bcfe06ba3d64 42 template<typename From, typename To>
AnnaBridge 189:f392fc9709a3 43 class is_convertible {
AnnaBridge 189:f392fc9709a3 44 struct true_type {
AnnaBridge 189:f392fc9709a3 45 char x[512];
AnnaBridge 189:f392fc9709a3 46 };
AnnaBridge 188:bcfe06ba3d64 47 struct false_type { };
AnnaBridge 188:bcfe06ba3d64 48
AnnaBridge 189:f392fc9709a3 49 static const From &generator();
AnnaBridge 188:bcfe06ba3d64 50 static true_type sink(const To &);
AnnaBridge 188:bcfe06ba3d64 51 static false_type sink(...);
AnnaBridge 188:bcfe06ba3d64 52
AnnaBridge 188:bcfe06ba3d64 53 public:
AnnaBridge 188:bcfe06ba3d64 54 static const bool value = sizeof(true_type) == sizeof(sink(generator()));
AnnaBridge 188:bcfe06ba3d64 55 };
AnnaBridge 188:bcfe06ba3d64 56
AnnaBridge 188:bcfe06ba3d64 57 }
AnnaBridge 188:bcfe06ba3d64 58
AnnaBridge 188:bcfe06ba3d64 59 #if defined(DOXYGEN_ONLY)
AnnaBridge 188:bcfe06ba3d64 60 /**
AnnaBridge 188:bcfe06ba3d64 61 * Special value for the Extent parameter of Span.
AnnaBridge 188:bcfe06ba3d64 62 * If the type uses this value, then the size of the array is stored in the object
AnnaBridge 188:bcfe06ba3d64 63 * at runtime.
AnnaBridge 189:f392fc9709a3 64 *
AnnaBridge 188:bcfe06ba3d64 65 * @relates Span
AnnaBridge 188:bcfe06ba3d64 66 */
AnnaBridge 188:bcfe06ba3d64 67 const ptrdiff_t SPAN_DYNAMIC_EXTENT = -1;
AnnaBridge 189:f392fc9709a3 68 #else
AnnaBridge 188:bcfe06ba3d64 69 #define SPAN_DYNAMIC_EXTENT -1
AnnaBridge 188:bcfe06ba3d64 70 #endif
AnnaBridge 188:bcfe06ba3d64 71
AnnaBridge 188:bcfe06ba3d64 72 /**
AnnaBridge 188:bcfe06ba3d64 73 * Nonowning view to a sequence of contiguous elements.
AnnaBridge 188:bcfe06ba3d64 74 *
AnnaBridge 188:bcfe06ba3d64 75 * Spans encapsulate a pointer to a sequence of contiguous elements and its size
AnnaBridge 188:bcfe06ba3d64 76 * into a single object. Span can replace the traditional pair of pointer and
AnnaBridge 188:bcfe06ba3d64 77 * size arguments passed as array definitions in function calls.
AnnaBridge 188:bcfe06ba3d64 78 *
AnnaBridge 188:bcfe06ba3d64 79 * @par Operations
AnnaBridge 188:bcfe06ba3d64 80 *
AnnaBridge 188:bcfe06ba3d64 81 * Span objects can be copied and assigned like regular value types with the help
AnnaBridge 188:bcfe06ba3d64 82 * of the copy constructor or the copy assignment (=) operator.
AnnaBridge 188:bcfe06ba3d64 83 *
AnnaBridge 188:bcfe06ba3d64 84 * You can retrieve elements of the object with the subscript ([]) operator. You can access the
AnnaBridge 188:bcfe06ba3d64 85 * pointer to the first element of the sequence viewed with data().
AnnaBridge 188:bcfe06ba3d64 86 * The function size() returns the number of elements in the sequence, and
AnnaBridge 188:bcfe06ba3d64 87 * empty() informs whether there is any element in the sequence.
AnnaBridge 188:bcfe06ba3d64 88 *
AnnaBridge 188:bcfe06ba3d64 89 * You can slice Span from the beginning of the sequence (first()), from the end
AnnaBridge 188:bcfe06ba3d64 90 * of the sequence (last()) or from an arbitrary point of the sequence (subspan()).
AnnaBridge 188:bcfe06ba3d64 91 *
AnnaBridge 188:bcfe06ba3d64 92 * @par Size encoding
AnnaBridge 188:bcfe06ba3d64 93 *
AnnaBridge 188:bcfe06ba3d64 94 * The size of the sequence can be encoded in the type itself or in the value of
AnnaBridge 188:bcfe06ba3d64 95 * the instance with the help of the template parameter Extent:
AnnaBridge 188:bcfe06ba3d64 96 *
AnnaBridge 188:bcfe06ba3d64 97 * - Span<uint8_t, 6>: Span over a sequence of 6 elements.
AnnaBridge 188:bcfe06ba3d64 98 * - Span<uint8_t>: Span over an arbitrary long sequence.
AnnaBridge 188:bcfe06ba3d64 99 *
AnnaBridge 188:bcfe06ba3d64 100 * When the size is encoded in the type itself, it is guaranteed that the Span
AnnaBridge 188:bcfe06ba3d64 101 * view is a valid sequence (not empty() and not NULL) - unless Extent equals 0.
AnnaBridge 188:bcfe06ba3d64 102 * The type system also prevents automatic conversion from Span of different
AnnaBridge 188:bcfe06ba3d64 103 * sizes. Finally, the Span object is internally represented as a single pointer.
AnnaBridge 188:bcfe06ba3d64 104 *
AnnaBridge 188:bcfe06ba3d64 105 * When the size of the sequence viewed is encoded in the Span value, Span
AnnaBridge 188:bcfe06ba3d64 106 * instances can view an empty sequence. The function empty() helps client code
AnnaBridge 188:bcfe06ba3d64 107 * decide whether Span is viewing valid content or not.
AnnaBridge 188:bcfe06ba3d64 108 *
AnnaBridge 188:bcfe06ba3d64 109 * @par Example
AnnaBridge 188:bcfe06ba3d64 110 *
AnnaBridge 188:bcfe06ba3d64 111 * - Encoding fixed size array: Array values in parameter decays automatically
AnnaBridge 188:bcfe06ba3d64 112 * to pointer, which leaves room for subtitle bugs:
AnnaBridge 188:bcfe06ba3d64 113 *
AnnaBridge 188:bcfe06ba3d64 114 * @code
AnnaBridge 188:bcfe06ba3d64 115 typedef uint8_t mac_address_t[6];
AnnaBridge 188:bcfe06ba3d64 116 void process_mac(mac_address_t);
AnnaBridge 188:bcfe06ba3d64 117
AnnaBridge 188:bcfe06ba3d64 118 // compile just fine
AnnaBridge 188:bcfe06ba3d64 119 uint8_t *invalid_value = NULL;
AnnaBridge 188:bcfe06ba3d64 120 process_mac(invalid_value);
AnnaBridge 188:bcfe06ba3d64 121
AnnaBridge 188:bcfe06ba3d64 122
AnnaBridge 188:bcfe06ba3d64 123 // correct way
AnnaBridge 188:bcfe06ba3d64 124 typedef Span<uint8_t, 6> mac_address_t;
AnnaBridge 188:bcfe06ba3d64 125 void process_mac(mac_address_t);
AnnaBridge 188:bcfe06ba3d64 126
AnnaBridge 188:bcfe06ba3d64 127 // compilation error
AnnaBridge 188:bcfe06ba3d64 128 uint8_t *invalid_value = NULL;
AnnaBridge 188:bcfe06ba3d64 129 process_mac(invalid_value);
AnnaBridge 188:bcfe06ba3d64 130
AnnaBridge 188:bcfe06ba3d64 131 // compilation ok
AnnaBridge 188:bcfe06ba3d64 132 uint8_t valid_value[6];
AnnaBridge 188:bcfe06ba3d64 133 process_mac(valid_value);
AnnaBridge 188:bcfe06ba3d64 134 * @endcode
AnnaBridge 188:bcfe06ba3d64 135 *
AnnaBridge 188:bcfe06ba3d64 136 * - Arbitrary buffer: When dealing with multiple buffers, it becomes painful to
AnnaBridge 188:bcfe06ba3d64 137 * keep track of every buffer size and pointer.
AnnaBridge 188:bcfe06ba3d64 138 *
AnnaBridge 188:bcfe06ba3d64 139 * @code
AnnaBridge 188:bcfe06ba3d64 140 const uint8_t options_tag[OPTIONS_TAG_SIZE];
AnnaBridge 188:bcfe06ba3d64 141
AnnaBridge 188:bcfe06ba3d64 142 struct parsed_value_t {
AnnaBridge 188:bcfe06ba3d64 143 uint8_t *header;
AnnaBridge 188:bcfe06ba3d64 144 uint8_t *options;
AnnaBridge 188:bcfe06ba3d64 145 uint8_t *payload;
AnnaBridge 188:bcfe06ba3d64 146 size_t payload_size;
AnnaBridge 188:bcfe06ba3d64 147 }
AnnaBridge 188:bcfe06ba3d64 148
AnnaBridge 188:bcfe06ba3d64 149 parsed_value_t parse(uint8_t *buffer, size_t buffer_size)
AnnaBridge 188:bcfe06ba3d64 150 {
AnnaBridge 188:bcfe06ba3d64 151 parsed_value_t parsed_value { 0 };
AnnaBridge 188:bcfe06ba3d64 152
AnnaBridge 188:bcfe06ba3d64 153 if (buffer != NULL && buffer_size <= MINIMAL_BUFFER_SIZE) {
AnnaBridge 188:bcfe06ba3d64 154 return parsed_value;
AnnaBridge 188:bcfe06ba3d64 155 }
AnnaBridge 188:bcfe06ba3d64 156
AnnaBridge 188:bcfe06ba3d64 157 parsed_value.header = buffer;
AnnaBridge 188:bcfe06ba3d64 158 parsed_value.header_size = BUFFER_HEADER_SIZE;
AnnaBridge 188:bcfe06ba3d64 159
AnnaBridge 188:bcfe06ba3d64 160 if (memcmp(buffer + HEADER_OPTIONS_INDEX, options_tag, sizeof(options_tag)) == 0) {
AnnaBridge 188:bcfe06ba3d64 161 options = buffer + BUFFER_HEADER_SIZE;
AnnaBridge 188:bcfe06ba3d64 162 payload = buffer + BUFFER_HEADER_SIZE + OPTIONS_SIZE;
AnnaBridge 188:bcfe06ba3d64 163 payload_size = buffer_size - BUFFER_HEADER_SIZE + OPTIONS_SIZE;
AnnaBridge 188:bcfe06ba3d64 164 } else {
AnnaBridge 188:bcfe06ba3d64 165 payload = buffer + BUFFER_HEADER_SIZE;
AnnaBridge 188:bcfe06ba3d64 166 payload_size = buffer_size - BUFFER_HEADER_SIZE;
AnnaBridge 188:bcfe06ba3d64 167 }
AnnaBridge 188:bcfe06ba3d64 168
AnnaBridge 188:bcfe06ba3d64 169 return parsed_value;
AnnaBridge 188:bcfe06ba3d64 170 }
AnnaBridge 188:bcfe06ba3d64 171
AnnaBridge 188:bcfe06ba3d64 172
AnnaBridge 188:bcfe06ba3d64 173 //with Span
AnnaBridge 188:bcfe06ba3d64 174 struct parsed_value_t {
AnnaBridge 188:bcfe06ba3d64 175 Span<uint8_t> header;
AnnaBridge 188:bcfe06ba3d64 176 Span<uint8_t> options;
AnnaBridge 188:bcfe06ba3d64 177 Span<uint8_t> payload;
AnnaBridge 188:bcfe06ba3d64 178 }
AnnaBridge 188:bcfe06ba3d64 179
AnnaBridge 188:bcfe06ba3d64 180 parsed_value_t parse(const Span<uint8_t> &buffer)
AnnaBridge 188:bcfe06ba3d64 181 {
AnnaBridge 188:bcfe06ba3d64 182 parsed_value_t parsed_value;
AnnaBridge 188:bcfe06ba3d64 183
AnnaBridge 188:bcfe06ba3d64 184 if (buffer.size() <= MINIMAL_BUFFER_SIZE) {
AnnaBridge 188:bcfe06ba3d64 185 return parsed_value;
AnnaBridge 188:bcfe06ba3d64 186 }
AnnaBridge 188:bcfe06ba3d64 187
AnnaBridge 188:bcfe06ba3d64 188 parsed_value.header = buffer.first(BUFFER_HEADER_SIZE);
AnnaBridge 188:bcfe06ba3d64 189
AnnaBridge 188:bcfe06ba3d64 190 if (buffer.subspan<HEADER_OPTIONS_INDEX, sizeof(options_tag)>() == option_tag) {
AnnaBridge 188:bcfe06ba3d64 191 options = buffer.supspan(parsed_value.header.size(), OPTIONS_SIZE);
AnnaBridge 188:bcfe06ba3d64 192 }
AnnaBridge 188:bcfe06ba3d64 193
AnnaBridge 188:bcfe06ba3d64 194 payload = buffer.subspan(parsed_value.header.size() + parsed_value.options.size());
AnnaBridge 188:bcfe06ba3d64 195
AnnaBridge 188:bcfe06ba3d64 196 return parsed_value;
AnnaBridge 188:bcfe06ba3d64 197 }
AnnaBridge 188:bcfe06ba3d64 198 * @endcode
AnnaBridge 188:bcfe06ba3d64 199 *
AnnaBridge 188:bcfe06ba3d64 200 * @note You can create Span instances with the help of the function template
AnnaBridge 188:bcfe06ba3d64 201 * make_Span() and make_const_Span().
AnnaBridge 188:bcfe06ba3d64 202 *
AnnaBridge 188:bcfe06ba3d64 203 * @note Span<T, Extent> objects can be implicitly converted to Span<T> objects
AnnaBridge 188:bcfe06ba3d64 204 * where required.
AnnaBridge 188:bcfe06ba3d64 205 *
AnnaBridge 188:bcfe06ba3d64 206 * @tparam ElementType type of objects the Span views.
AnnaBridge 188:bcfe06ba3d64 207 *
AnnaBridge 188:bcfe06ba3d64 208 * @tparam Extent The size of the contiguous sequence viewed. The default value
AnnaBridge 188:bcfe06ba3d64 209 * SPAN_DYNAMIC_SIZE is special because it allows construction of Span objects of
AnnaBridge 188:bcfe06ba3d64 210 * any size (set at runtime).
AnnaBridge 188:bcfe06ba3d64 211 */
AnnaBridge 188:bcfe06ba3d64 212 template<typename ElementType, ptrdiff_t Extent = SPAN_DYNAMIC_EXTENT>
AnnaBridge 188:bcfe06ba3d64 213 struct Span {
AnnaBridge 188:bcfe06ba3d64 214
AnnaBridge 188:bcfe06ba3d64 215 /**
AnnaBridge 188:bcfe06ba3d64 216 * Type of the element contained
AnnaBridge 188:bcfe06ba3d64 217 */
AnnaBridge 188:bcfe06ba3d64 218 typedef ElementType element_type;
AnnaBridge 188:bcfe06ba3d64 219
AnnaBridge 188:bcfe06ba3d64 220 /**
AnnaBridge 188:bcfe06ba3d64 221 * Type of the index.
AnnaBridge 188:bcfe06ba3d64 222 */
AnnaBridge 188:bcfe06ba3d64 223 typedef ptrdiff_t index_type;
AnnaBridge 188:bcfe06ba3d64 224
AnnaBridge 188:bcfe06ba3d64 225 /**
AnnaBridge 188:bcfe06ba3d64 226 * Pointer to an ElementType
AnnaBridge 188:bcfe06ba3d64 227 */
AnnaBridge 188:bcfe06ba3d64 228 typedef element_type *pointer;
AnnaBridge 188:bcfe06ba3d64 229
AnnaBridge 188:bcfe06ba3d64 230 /**
AnnaBridge 188:bcfe06ba3d64 231 * Reference to an ElementType
AnnaBridge 188:bcfe06ba3d64 232 */
AnnaBridge 188:bcfe06ba3d64 233 typedef element_type &reference;
AnnaBridge 188:bcfe06ba3d64 234
AnnaBridge 188:bcfe06ba3d64 235 /**
AnnaBridge 188:bcfe06ba3d64 236 * Size of the Extent; -1 if dynamic.
AnnaBridge 188:bcfe06ba3d64 237 */
AnnaBridge 188:bcfe06ba3d64 238 static const index_type extent = Extent;
AnnaBridge 188:bcfe06ba3d64 239
AnnaBridge 188:bcfe06ba3d64 240 MBED_STATIC_ASSERT(Extent >= 0, "Invalid extent for a Span");
AnnaBridge 188:bcfe06ba3d64 241
AnnaBridge 188:bcfe06ba3d64 242 /**
AnnaBridge 188:bcfe06ba3d64 243 * Construct an empty Span.
AnnaBridge 188:bcfe06ba3d64 244 *
AnnaBridge 188:bcfe06ba3d64 245 * @post a call to size() returns 0, and data() returns NULL.
AnnaBridge 188:bcfe06ba3d64 246 *
AnnaBridge 188:bcfe06ba3d64 247 * @note This function is not accessible if Extent != SPAN_DYNAMIC_EXTENT or
AnnaBridge 188:bcfe06ba3d64 248 * Extent != 0 .
AnnaBridge 188:bcfe06ba3d64 249 */
AnnaBridge 188:bcfe06ba3d64 250 Span() :
AnnaBridge 188:bcfe06ba3d64 251 _data(NULL)
AnnaBridge 188:bcfe06ba3d64 252 {
AnnaBridge 188:bcfe06ba3d64 253 MBED_STATIC_ASSERT(
AnnaBridge 188:bcfe06ba3d64 254 Extent == 0,
AnnaBridge 188:bcfe06ba3d64 255 "Cannot default construct a static-extent Span (unless Extent is 0)"
AnnaBridge 188:bcfe06ba3d64 256 );
AnnaBridge 188:bcfe06ba3d64 257 }
AnnaBridge 188:bcfe06ba3d64 258
AnnaBridge 188:bcfe06ba3d64 259 /**
AnnaBridge 188:bcfe06ba3d64 260 * Construct a Span from a pointer to a buffer and its size.
AnnaBridge 188:bcfe06ba3d64 261 *
AnnaBridge 188:bcfe06ba3d64 262 * @param ptr Pointer to the beginning of the data viewed.
AnnaBridge 188:bcfe06ba3d64 263 *
AnnaBridge 188:bcfe06ba3d64 264 * @param count Number of elements viewed.
AnnaBridge 188:bcfe06ba3d64 265 *
AnnaBridge 188:bcfe06ba3d64 266 * @pre [ptr, ptr + count) must be be a valid range.
AnnaBridge 188:bcfe06ba3d64 267 * @pre count must be equal to Extent.
AnnaBridge 188:bcfe06ba3d64 268 *
AnnaBridge 188:bcfe06ba3d64 269 * @post a call to size() returns Extent, and data() returns @p ptr.
AnnaBridge 188:bcfe06ba3d64 270 */
AnnaBridge 188:bcfe06ba3d64 271 Span(pointer ptr, index_type count) :
AnnaBridge 188:bcfe06ba3d64 272 _data(ptr)
AnnaBridge 188:bcfe06ba3d64 273 {
AnnaBridge 188:bcfe06ba3d64 274 MBED_ASSERT(count == Extent);
AnnaBridge 188:bcfe06ba3d64 275 MBED_ASSERT(Extent == 0 || ptr != NULL);
AnnaBridge 188:bcfe06ba3d64 276 }
AnnaBridge 188:bcfe06ba3d64 277
AnnaBridge 188:bcfe06ba3d64 278 /**
AnnaBridge 188:bcfe06ba3d64 279 * Construct a Span from the range [first, last).
AnnaBridge 188:bcfe06ba3d64 280 *
AnnaBridge 188:bcfe06ba3d64 281 * @param first Pointer to the beginning of the data viewed.
AnnaBridge 188:bcfe06ba3d64 282 * @param last End of the range (element after the last element).
AnnaBridge 188:bcfe06ba3d64 283 *
AnnaBridge 188:bcfe06ba3d64 284 * @pre [first, last) must be be a valid range.
AnnaBridge 188:bcfe06ba3d64 285 * @pre first <= last.
AnnaBridge 188:bcfe06ba3d64 286 * @pre last - first must be equal to Extent.
AnnaBridge 188:bcfe06ba3d64 287 *
AnnaBridge 188:bcfe06ba3d64 288 * @post a call to size() returns Extent, and data() returns @p first.
AnnaBridge 188:bcfe06ba3d64 289 */
AnnaBridge 188:bcfe06ba3d64 290 Span(pointer first, pointer last) :
AnnaBridge 188:bcfe06ba3d64 291 _data(first)
AnnaBridge 188:bcfe06ba3d64 292 {
AnnaBridge 188:bcfe06ba3d64 293 MBED_ASSERT(first <= last);
AnnaBridge 188:bcfe06ba3d64 294 MBED_ASSERT((last - first) == Extent);
AnnaBridge 188:bcfe06ba3d64 295 MBED_ASSERT(Extent == 0 || first != NULL);
AnnaBridge 188:bcfe06ba3d64 296 }
AnnaBridge 188:bcfe06ba3d64 297
AnnaBridge 189:f392fc9709a3 298 // AStyle ignore, not handling correctly below
AnnaBridge 189:f392fc9709a3 299 // *INDENT-OFF*
AnnaBridge 188:bcfe06ba3d64 300 /**
AnnaBridge 188:bcfe06ba3d64 301 * Construct a Span from the reference to an array.
AnnaBridge 188:bcfe06ba3d64 302 *
AnnaBridge 188:bcfe06ba3d64 303 * @param elements Reference to the array viewed.
AnnaBridge 188:bcfe06ba3d64 304 *
AnnaBridge 188:bcfe06ba3d64 305 * @post a call to size() returns Extent, and data() returns a
AnnaBridge 188:bcfe06ba3d64 306 * pointer to elements.
AnnaBridge 188:bcfe06ba3d64 307 */
AnnaBridge 188:bcfe06ba3d64 308 Span(element_type (&elements)[Extent]):
AnnaBridge 188:bcfe06ba3d64 309 _data(elements) { }
AnnaBridge 188:bcfe06ba3d64 310
AnnaBridge 188:bcfe06ba3d64 311 /**
AnnaBridge 188:bcfe06ba3d64 312 * Construct a Span object from another Span of the same size.
AnnaBridge 188:bcfe06ba3d64 313 *
AnnaBridge 188:bcfe06ba3d64 314 * @param other The Span object used to construct this.
AnnaBridge 188:bcfe06ba3d64 315 *
AnnaBridge 188:bcfe06ba3d64 316 * @note For Span with a positive extent, this function is not accessible.
AnnaBridge 188:bcfe06ba3d64 317 *
AnnaBridge 188:bcfe06ba3d64 318 * @note OtherElementType(*)[] must be convertible to ElementType(*)[].
AnnaBridge 188:bcfe06ba3d64 319 */
AnnaBridge 188:bcfe06ba3d64 320 template<typename OtherElementType>
AnnaBridge 188:bcfe06ba3d64 321 Span(const Span<OtherElementType, Extent> &other):
AnnaBridge 188:bcfe06ba3d64 322 _data(other.data())
AnnaBridge 188:bcfe06ba3d64 323 {
AnnaBridge 188:bcfe06ba3d64 324 MBED_STATIC_ASSERT(
AnnaBridge 188:bcfe06ba3d64 325 (span_detail::is_convertible<OtherElementType (*)[1], ElementType (*)[1]>::value),
AnnaBridge 188:bcfe06ba3d64 326 "OtherElementType(*)[] should be convertible to ElementType (*)[]"
AnnaBridge 188:bcfe06ba3d64 327 );
AnnaBridge 188:bcfe06ba3d64 328 }
AnnaBridge 189:f392fc9709a3 329 // *INDENT-ON*
AnnaBridge 188:bcfe06ba3d64 330
AnnaBridge 188:bcfe06ba3d64 331 /**
AnnaBridge 188:bcfe06ba3d64 332 * Return the size of the sequence viewed.
AnnaBridge 188:bcfe06ba3d64 333 *
AnnaBridge 188:bcfe06ba3d64 334 * @return The size of the sequence viewed.
AnnaBridge 188:bcfe06ba3d64 335 */
AnnaBridge 188:bcfe06ba3d64 336 index_type size() const
AnnaBridge 188:bcfe06ba3d64 337 {
AnnaBridge 188:bcfe06ba3d64 338 return Extent;
AnnaBridge 188:bcfe06ba3d64 339 }
AnnaBridge 188:bcfe06ba3d64 340
AnnaBridge 188:bcfe06ba3d64 341 /**
AnnaBridge 188:bcfe06ba3d64 342 * Return if the sequence is empty or not.
AnnaBridge 188:bcfe06ba3d64 343 *
AnnaBridge 188:bcfe06ba3d64 344 * @return true if the sequence is empty and false otherwise.
AnnaBridge 188:bcfe06ba3d64 345 */
AnnaBridge 188:bcfe06ba3d64 346 bool empty() const
AnnaBridge 188:bcfe06ba3d64 347 {
AnnaBridge 188:bcfe06ba3d64 348 return size() == 0;
AnnaBridge 188:bcfe06ba3d64 349 }
AnnaBridge 188:bcfe06ba3d64 350
AnnaBridge 188:bcfe06ba3d64 351 /**
AnnaBridge 188:bcfe06ba3d64 352 * Returns a reference to the element at position @p index.
AnnaBridge 188:bcfe06ba3d64 353 *
AnnaBridge 188:bcfe06ba3d64 354 * @param index Index of the element to access.
AnnaBridge 188:bcfe06ba3d64 355 *
AnnaBridge 188:bcfe06ba3d64 356 * @return A reference to the element at the index specified in input.
AnnaBridge 188:bcfe06ba3d64 357 *
AnnaBridge 188:bcfe06ba3d64 358 * @pre 0 <= index < Extent.
AnnaBridge 188:bcfe06ba3d64 359 */
AnnaBridge 188:bcfe06ba3d64 360 reference operator[](index_type index) const
AnnaBridge 188:bcfe06ba3d64 361 {
AnnaBridge 188:bcfe06ba3d64 362 #ifdef MBED_DEBUG
AnnaBridge 188:bcfe06ba3d64 363 MBED_ASSERT(0 <= index && index < Extent);
AnnaBridge 188:bcfe06ba3d64 364 #endif
AnnaBridge 188:bcfe06ba3d64 365 return _data[index];
AnnaBridge 188:bcfe06ba3d64 366 }
AnnaBridge 188:bcfe06ba3d64 367
AnnaBridge 188:bcfe06ba3d64 368 /**
AnnaBridge 188:bcfe06ba3d64 369 * Return a pointer to the first element of the sequence or NULL if the Span
AnnaBridge 188:bcfe06ba3d64 370 * is empty().
AnnaBridge 188:bcfe06ba3d64 371 *
AnnaBridge 188:bcfe06ba3d64 372 * @return The pointer to the first element of the Span.
AnnaBridge 188:bcfe06ba3d64 373 */
AnnaBridge 188:bcfe06ba3d64 374 pointer data() const
AnnaBridge 188:bcfe06ba3d64 375 {
AnnaBridge 188:bcfe06ba3d64 376 return _data;
AnnaBridge 188:bcfe06ba3d64 377 }
AnnaBridge 188:bcfe06ba3d64 378
AnnaBridge 188:bcfe06ba3d64 379 /**
AnnaBridge 188:bcfe06ba3d64 380 * Create a new Span over the first @p Count elements of the existing view.
AnnaBridge 188:bcfe06ba3d64 381 *
AnnaBridge 188:bcfe06ba3d64 382 * @tparam Count The number of element viewed by the new Span
AnnaBridge 188:bcfe06ba3d64 383 *
AnnaBridge 188:bcfe06ba3d64 384 * @return A new Span over the first @p Count elements.
AnnaBridge 188:bcfe06ba3d64 385 *
AnnaBridge 188:bcfe06ba3d64 386 * @pre Count >= 0 && Count <= size().
AnnaBridge 188:bcfe06ba3d64 387 */
AnnaBridge 188:bcfe06ba3d64 388 template<ptrdiff_t Count>
AnnaBridge 188:bcfe06ba3d64 389 Span<element_type, Count> first() const
AnnaBridge 188:bcfe06ba3d64 390 {
AnnaBridge 188:bcfe06ba3d64 391 MBED_STATIC_ASSERT(
AnnaBridge 188:bcfe06ba3d64 392 (0 <= Count) && (Count <= Extent),
AnnaBridge 188:bcfe06ba3d64 393 "Invalid subspan extent"
AnnaBridge 188:bcfe06ba3d64 394 );
AnnaBridge 188:bcfe06ba3d64 395 return Span<element_type, Count>(_data, Count);
AnnaBridge 188:bcfe06ba3d64 396 }
AnnaBridge 188:bcfe06ba3d64 397
AnnaBridge 188:bcfe06ba3d64 398 /**
AnnaBridge 188:bcfe06ba3d64 399 * Create a new Span over the last @p Count elements of the existing view.
AnnaBridge 188:bcfe06ba3d64 400 *
AnnaBridge 188:bcfe06ba3d64 401 * @tparam Count The number of element viewed by the new Span.
AnnaBridge 188:bcfe06ba3d64 402 *
AnnaBridge 188:bcfe06ba3d64 403 * @return A new Span over the last @p Count elements.
AnnaBridge 188:bcfe06ba3d64 404 *
AnnaBridge 188:bcfe06ba3d64 405 * @pre Count >= 0 && Count <= size().
AnnaBridge 188:bcfe06ba3d64 406 */
AnnaBridge 188:bcfe06ba3d64 407 template<ptrdiff_t Count>
AnnaBridge 188:bcfe06ba3d64 408 Span<element_type, Count> last() const
AnnaBridge 188:bcfe06ba3d64 409 {
AnnaBridge 188:bcfe06ba3d64 410 MBED_STATIC_ASSERT(
AnnaBridge 188:bcfe06ba3d64 411 (0 <= Count) && (Count <= Extent),
AnnaBridge 188:bcfe06ba3d64 412 "Invalid subspan extent"
AnnaBridge 188:bcfe06ba3d64 413 );
AnnaBridge 188:bcfe06ba3d64 414 return Span<element_type, Count>(_data + (Extent - Count), Count);
AnnaBridge 188:bcfe06ba3d64 415 }
AnnaBridge 188:bcfe06ba3d64 416
AnnaBridge 189:f392fc9709a3 417 // AStyle ignore, not handling correctly below
AnnaBridge 189:f392fc9709a3 418 // *INDENT-OFF*
AnnaBridge 188:bcfe06ba3d64 419 /**
AnnaBridge 188:bcfe06ba3d64 420 * Create a subspan that is a view of other Count elements; the view starts at
AnnaBridge 188:bcfe06ba3d64 421 * element Offset.
AnnaBridge 188:bcfe06ba3d64 422 *
AnnaBridge 188:bcfe06ba3d64 423 * @tparam Offset The offset of the first element viewed by the subspan.
AnnaBridge 188:bcfe06ba3d64 424 *
AnnaBridge 188:bcfe06ba3d64 425 * @tparam Count The number of elements present in the subspan. If Count
AnnaBridge 188:bcfe06ba3d64 426 * is equal to SPAN_DYNAMIC_EXTENT, then a Span starting at offset and
AnnaBridge 188:bcfe06ba3d64 427 * containing the rest of the elements is returned.
AnnaBridge 188:bcfe06ba3d64 428 *
AnnaBridge 188:bcfe06ba3d64 429 * @return A subspan of this starting at Offset and Count long.
AnnaBridge 188:bcfe06ba3d64 430 */
AnnaBridge 188:bcfe06ba3d64 431 template<std::ptrdiff_t Offset, std::ptrdiff_t Count>
AnnaBridge 188:bcfe06ba3d64 432 Span<element_type, Count == SPAN_DYNAMIC_EXTENT ? Extent - Offset : Count>
AnnaBridge 188:bcfe06ba3d64 433 subspan() const
AnnaBridge 188:bcfe06ba3d64 434 {
AnnaBridge 188:bcfe06ba3d64 435 MBED_STATIC_ASSERT(
AnnaBridge 188:bcfe06ba3d64 436 0 <= Offset && Offset <= Extent,
AnnaBridge 188:bcfe06ba3d64 437 "Invalid subspan offset"
AnnaBridge 188:bcfe06ba3d64 438 );
AnnaBridge 188:bcfe06ba3d64 439 MBED_STATIC_ASSERT(
AnnaBridge 188:bcfe06ba3d64 440 (Count == SPAN_DYNAMIC_EXTENT) ||
AnnaBridge 188:bcfe06ba3d64 441 (0 <= Count && (Count + Offset) <= Extent),
AnnaBridge 188:bcfe06ba3d64 442 "Invalid subspan count"
AnnaBridge 188:bcfe06ba3d64 443 );
AnnaBridge 188:bcfe06ba3d64 444 return Span<element_type, Count == SPAN_DYNAMIC_EXTENT ? Extent - Offset : Count>(
AnnaBridge 188:bcfe06ba3d64 445 _data + Offset,
AnnaBridge 188:bcfe06ba3d64 446 Count == SPAN_DYNAMIC_EXTENT ? Extent - Offset : Count
AnnaBridge 188:bcfe06ba3d64 447 );
AnnaBridge 188:bcfe06ba3d64 448 }
AnnaBridge 189:f392fc9709a3 449 // *INDENT-ON*
AnnaBridge 188:bcfe06ba3d64 450
AnnaBridge 188:bcfe06ba3d64 451 /**
AnnaBridge 188:bcfe06ba3d64 452 * Create a new Span over the first @p count elements of the existing view.
AnnaBridge 188:bcfe06ba3d64 453 *
AnnaBridge 188:bcfe06ba3d64 454 * @param count The number of element viewed by the new Span.
AnnaBridge 188:bcfe06ba3d64 455 *
AnnaBridge 188:bcfe06ba3d64 456 * @return A new Span over the first @p count elements.
AnnaBridge 188:bcfe06ba3d64 457 */
AnnaBridge 188:bcfe06ba3d64 458 Span<element_type, SPAN_DYNAMIC_EXTENT> first(index_type count) const
AnnaBridge 188:bcfe06ba3d64 459 {
AnnaBridge 188:bcfe06ba3d64 460 MBED_ASSERT(0 <= count && count <= Extent);
AnnaBridge 188:bcfe06ba3d64 461 return Span<element_type, SPAN_DYNAMIC_EXTENT>(_data, count);
AnnaBridge 188:bcfe06ba3d64 462 }
AnnaBridge 188:bcfe06ba3d64 463
AnnaBridge 188:bcfe06ba3d64 464 /**
AnnaBridge 188:bcfe06ba3d64 465 * Create a new Span over the last @p count elements of the existing view.
AnnaBridge 188:bcfe06ba3d64 466 *
AnnaBridge 188:bcfe06ba3d64 467 * @param count The number of elements viewed by the new Span.
AnnaBridge 188:bcfe06ba3d64 468 *
AnnaBridge 188:bcfe06ba3d64 469 * @return A new Span over the last @p count elements.
AnnaBridge 188:bcfe06ba3d64 470 */
AnnaBridge 188:bcfe06ba3d64 471 Span<element_type, SPAN_DYNAMIC_EXTENT> last(index_type count) const
AnnaBridge 188:bcfe06ba3d64 472 {
AnnaBridge 188:bcfe06ba3d64 473 MBED_ASSERT(0 <= count && count <= Extent);
AnnaBridge 188:bcfe06ba3d64 474 return Span<element_type, SPAN_DYNAMIC_EXTENT>(
AnnaBridge 189:f392fc9709a3 475 _data + (Extent - count),
AnnaBridge 189:f392fc9709a3 476 count
AnnaBridge 189:f392fc9709a3 477 );
AnnaBridge 188:bcfe06ba3d64 478 }
AnnaBridge 188:bcfe06ba3d64 479
AnnaBridge 188:bcfe06ba3d64 480 /**
AnnaBridge 188:bcfe06ba3d64 481 * Create a subspan that is a view of other count elements; the view starts at
AnnaBridge 188:bcfe06ba3d64 482 * element offset.
AnnaBridge 188:bcfe06ba3d64 483 *
AnnaBridge 188:bcfe06ba3d64 484 * @param offset The offset of the first element viewed by the subspan.
AnnaBridge 188:bcfe06ba3d64 485 *
AnnaBridge 188:bcfe06ba3d64 486 * @param count The number of elements present in the subspan. If Count
AnnaBridge 188:bcfe06ba3d64 487 * is equal to SPAN_DYNAMIC_EXTENT, then a span starting at offset and
AnnaBridge 188:bcfe06ba3d64 488 * containing the rest of the elements is returned.
AnnaBridge 188:bcfe06ba3d64 489 *
AnnaBridge 188:bcfe06ba3d64 490 * @return
AnnaBridge 188:bcfe06ba3d64 491 */
AnnaBridge 188:bcfe06ba3d64 492 Span<element_type, SPAN_DYNAMIC_EXTENT> subspan(
AnnaBridge 188:bcfe06ba3d64 493 index_type offset, index_type count = SPAN_DYNAMIC_EXTENT
AnnaBridge 188:bcfe06ba3d64 494 ) const
AnnaBridge 188:bcfe06ba3d64 495 {
AnnaBridge 188:bcfe06ba3d64 496 MBED_ASSERT(0 <= offset && offset <= Extent);
AnnaBridge 188:bcfe06ba3d64 497 MBED_ASSERT(
AnnaBridge 188:bcfe06ba3d64 498 (count == SPAN_DYNAMIC_EXTENT) ||
AnnaBridge 188:bcfe06ba3d64 499 (0 <= count && (count + offset) <= Extent)
AnnaBridge 188:bcfe06ba3d64 500 );
AnnaBridge 188:bcfe06ba3d64 501 return Span<element_type, SPAN_DYNAMIC_EXTENT>(
AnnaBridge 189:f392fc9709a3 502 _data + offset,
AnnaBridge 189:f392fc9709a3 503 count == SPAN_DYNAMIC_EXTENT ? Extent - offset : count
AnnaBridge 189:f392fc9709a3 504 );
AnnaBridge 188:bcfe06ba3d64 505 }
AnnaBridge 188:bcfe06ba3d64 506
AnnaBridge 188:bcfe06ba3d64 507 private:
AnnaBridge 188:bcfe06ba3d64 508 pointer _data;
AnnaBridge 188:bcfe06ba3d64 509 };
AnnaBridge 188:bcfe06ba3d64 510
AnnaBridge 188:bcfe06ba3d64 511 /**
AnnaBridge 188:bcfe06ba3d64 512 * Span specialization that handle dynamic size.
AnnaBridge 188:bcfe06ba3d64 513 */
AnnaBridge 188:bcfe06ba3d64 514 template<typename ElementType>
AnnaBridge 188:bcfe06ba3d64 515 struct Span<ElementType, SPAN_DYNAMIC_EXTENT> {
AnnaBridge 188:bcfe06ba3d64 516 /**
AnnaBridge 188:bcfe06ba3d64 517 * Type of the element contained.
AnnaBridge 188:bcfe06ba3d64 518 */
AnnaBridge 188:bcfe06ba3d64 519 typedef ElementType element_type;
AnnaBridge 188:bcfe06ba3d64 520
AnnaBridge 188:bcfe06ba3d64 521 /**
AnnaBridge 188:bcfe06ba3d64 522 * Type of the index.
AnnaBridge 188:bcfe06ba3d64 523 */
AnnaBridge 188:bcfe06ba3d64 524 typedef ptrdiff_t index_type;
AnnaBridge 188:bcfe06ba3d64 525
AnnaBridge 188:bcfe06ba3d64 526 /**
AnnaBridge 188:bcfe06ba3d64 527 * Pointer to an ElementType.
AnnaBridge 188:bcfe06ba3d64 528 */
AnnaBridge 188:bcfe06ba3d64 529 typedef element_type *pointer;
AnnaBridge 188:bcfe06ba3d64 530
AnnaBridge 188:bcfe06ba3d64 531 /**
AnnaBridge 188:bcfe06ba3d64 532 * Reference to an ElementType.
AnnaBridge 188:bcfe06ba3d64 533 */
AnnaBridge 188:bcfe06ba3d64 534 typedef element_type &reference;
AnnaBridge 188:bcfe06ba3d64 535
AnnaBridge 188:bcfe06ba3d64 536 /**
AnnaBridge 188:bcfe06ba3d64 537 * Size of the Extent; -1 if dynamic.
AnnaBridge 188:bcfe06ba3d64 538 */
AnnaBridge 188:bcfe06ba3d64 539 static const index_type extent = SPAN_DYNAMIC_EXTENT;
AnnaBridge 188:bcfe06ba3d64 540
AnnaBridge 188:bcfe06ba3d64 541 /**
AnnaBridge 188:bcfe06ba3d64 542 * Construct an empty Span.
AnnaBridge 188:bcfe06ba3d64 543 *
AnnaBridge 188:bcfe06ba3d64 544 * @post a call to size() returns 0, and data() returns NULL.
AnnaBridge 188:bcfe06ba3d64 545 *
AnnaBridge 188:bcfe06ba3d64 546 * @note This function is not accessible if Extent != SPAN_DYNAMIC_EXTENT or
AnnaBridge 188:bcfe06ba3d64 547 * Extent != 0 .
AnnaBridge 188:bcfe06ba3d64 548 */
AnnaBridge 188:bcfe06ba3d64 549 Span() :
AnnaBridge 188:bcfe06ba3d64 550 _data(NULL), _size(0) { }
AnnaBridge 188:bcfe06ba3d64 551
AnnaBridge 188:bcfe06ba3d64 552 /**
AnnaBridge 188:bcfe06ba3d64 553 * Construct a Span from a pointer to a buffer and its size.
AnnaBridge 188:bcfe06ba3d64 554 *
AnnaBridge 188:bcfe06ba3d64 555 * @param ptr Pointer to the beginning of the data viewed.
AnnaBridge 188:bcfe06ba3d64 556 *
AnnaBridge 188:bcfe06ba3d64 557 * @param count Number of elements viewed.
AnnaBridge 188:bcfe06ba3d64 558 *
AnnaBridge 188:bcfe06ba3d64 559 * @pre [ptr, ptr + count) must be be a valid range.
AnnaBridge 188:bcfe06ba3d64 560 * @pre count must be equal to extent.
AnnaBridge 188:bcfe06ba3d64 561 *
AnnaBridge 188:bcfe06ba3d64 562 * @post a call to size() returns count, and data() returns @p ptr.
AnnaBridge 188:bcfe06ba3d64 563 */
AnnaBridge 188:bcfe06ba3d64 564 Span(pointer ptr, index_type count) :
AnnaBridge 188:bcfe06ba3d64 565 _data(ptr), _size(count)
AnnaBridge 188:bcfe06ba3d64 566 {
AnnaBridge 188:bcfe06ba3d64 567 MBED_ASSERT(count >= 0);
AnnaBridge 188:bcfe06ba3d64 568 MBED_ASSERT(ptr != NULL || count == 0);
AnnaBridge 188:bcfe06ba3d64 569 }
AnnaBridge 188:bcfe06ba3d64 570
AnnaBridge 188:bcfe06ba3d64 571 /**
AnnaBridge 188:bcfe06ba3d64 572 * Construct a Span from the range [first, last).
AnnaBridge 188:bcfe06ba3d64 573 *
AnnaBridge 188:bcfe06ba3d64 574 * @param first Pointer to the beginning of the data viewed.
AnnaBridge 188:bcfe06ba3d64 575 * @param last End of the range (element after the last element).
AnnaBridge 188:bcfe06ba3d64 576 *
AnnaBridge 188:bcfe06ba3d64 577 * @pre [first, last) must be be a valid range.
AnnaBridge 188:bcfe06ba3d64 578 * @pre first <= last.
AnnaBridge 188:bcfe06ba3d64 579 *
AnnaBridge 188:bcfe06ba3d64 580 * @post a call to size() returns the result of (last - first), and
AnnaBridge 188:bcfe06ba3d64 581 * data() returns @p first.
AnnaBridge 188:bcfe06ba3d64 582 */
AnnaBridge 188:bcfe06ba3d64 583 Span(pointer first, pointer last) :
AnnaBridge 188:bcfe06ba3d64 584 _data(first), _size(last - first)
AnnaBridge 188:bcfe06ba3d64 585 {
AnnaBridge 188:bcfe06ba3d64 586 MBED_ASSERT(first <= last);
AnnaBridge 188:bcfe06ba3d64 587 MBED_ASSERT(first != NULL || (last - first) == 0);
AnnaBridge 188:bcfe06ba3d64 588 }
AnnaBridge 188:bcfe06ba3d64 589
AnnaBridge 189:f392fc9709a3 590 // AStyle ignore, not handling correctly below
AnnaBridge 189:f392fc9709a3 591 // *INDENT-OFF*
AnnaBridge 188:bcfe06ba3d64 592 /**
AnnaBridge 188:bcfe06ba3d64 593 * Construct a Span from the reference to an array.
AnnaBridge 188:bcfe06ba3d64 594 *
AnnaBridge 188:bcfe06ba3d64 595 * @param elements Reference to the array viewed.
AnnaBridge 188:bcfe06ba3d64 596 *
AnnaBridge 188:bcfe06ba3d64 597 * @tparam Count Number of elements of T presents in the array.
AnnaBridge 188:bcfe06ba3d64 598 *
AnnaBridge 188:bcfe06ba3d64 599 * @post a call to size() returns Count, and data() returns a
AnnaBridge 188:bcfe06ba3d64 600 * pointer to elements.
AnnaBridge 188:bcfe06ba3d64 601 */
AnnaBridge 188:bcfe06ba3d64 602 template<size_t Count>
AnnaBridge 188:bcfe06ba3d64 603 Span(element_type (&elements)[Count]):
AnnaBridge 188:bcfe06ba3d64 604 _data(elements), _size(Count) { }
AnnaBridge 188:bcfe06ba3d64 605
AnnaBridge 188:bcfe06ba3d64 606 /**
AnnaBridge 188:bcfe06ba3d64 607 * Construct a Span object from another Span.
AnnaBridge 188:bcfe06ba3d64 608 *
AnnaBridge 188:bcfe06ba3d64 609 * @param other The Span object used to construct this.
AnnaBridge 188:bcfe06ba3d64 610 *
AnnaBridge 188:bcfe06ba3d64 611 * @note For Span with a positive extent, this function is not accessible.
AnnaBridge 188:bcfe06ba3d64 612 *
AnnaBridge 188:bcfe06ba3d64 613 * @note OtherElementType(*)[] must be convertible to ElementType(*)[].
AnnaBridge 188:bcfe06ba3d64 614 */
AnnaBridge 188:bcfe06ba3d64 615 template<typename OtherElementType, ptrdiff_t OtherExtent>
AnnaBridge 188:bcfe06ba3d64 616 Span(const Span<OtherElementType, OtherExtent> &other):
AnnaBridge 188:bcfe06ba3d64 617 _data(other.data()), _size(other.size())
AnnaBridge 188:bcfe06ba3d64 618 {
AnnaBridge 188:bcfe06ba3d64 619 MBED_STATIC_ASSERT(
AnnaBridge 188:bcfe06ba3d64 620 (span_detail::is_convertible<OtherElementType (*)[1], ElementType (*)[1]>::value),
AnnaBridge 188:bcfe06ba3d64 621 "OtherElementType(*)[] should be convertible to ElementType (*)[]"
AnnaBridge 188:bcfe06ba3d64 622 );
AnnaBridge 188:bcfe06ba3d64 623 }
AnnaBridge 189:f392fc9709a3 624 // *INDENT-ON*
AnnaBridge 188:bcfe06ba3d64 625
AnnaBridge 188:bcfe06ba3d64 626 /**
AnnaBridge 188:bcfe06ba3d64 627 * Return the size of the array viewed.
AnnaBridge 188:bcfe06ba3d64 628 *
AnnaBridge 188:bcfe06ba3d64 629 * @return The number of elements present in the array viewed.
AnnaBridge 188:bcfe06ba3d64 630 */
AnnaBridge 188:bcfe06ba3d64 631 index_type size() const
AnnaBridge 188:bcfe06ba3d64 632 {
AnnaBridge 188:bcfe06ba3d64 633 return _size;
AnnaBridge 188:bcfe06ba3d64 634 }
AnnaBridge 188:bcfe06ba3d64 635
AnnaBridge 188:bcfe06ba3d64 636 /**
AnnaBridge 188:bcfe06ba3d64 637 * Return if the sequence viewed is empty or not.
AnnaBridge 188:bcfe06ba3d64 638 *
AnnaBridge 188:bcfe06ba3d64 639 * @return true if the sequence is empty and false otherwise.
AnnaBridge 188:bcfe06ba3d64 640 */
AnnaBridge 188:bcfe06ba3d64 641 bool empty() const
AnnaBridge 188:bcfe06ba3d64 642 {
AnnaBridge 188:bcfe06ba3d64 643 return size() == 0;
AnnaBridge 188:bcfe06ba3d64 644 }
AnnaBridge 188:bcfe06ba3d64 645
AnnaBridge 188:bcfe06ba3d64 646 /**
AnnaBridge 188:bcfe06ba3d64 647 * Access to an element of the sequence.
AnnaBridge 188:bcfe06ba3d64 648 *
AnnaBridge 188:bcfe06ba3d64 649 * @param index Element index to access.
AnnaBridge 188:bcfe06ba3d64 650 *
AnnaBridge 188:bcfe06ba3d64 651 * @return A reference to the element at the index specified in input.
AnnaBridge 188:bcfe06ba3d64 652 *
AnnaBridge 188:bcfe06ba3d64 653 * @pre index is less than size().
AnnaBridge 188:bcfe06ba3d64 654 */
AnnaBridge 188:bcfe06ba3d64 655 reference operator[](index_type index) const
AnnaBridge 188:bcfe06ba3d64 656 {
AnnaBridge 188:bcfe06ba3d64 657 #ifdef MBED_DEBUG
AnnaBridge 188:bcfe06ba3d64 658 MBED_ASSERT(0 <= index && index < _size);
AnnaBridge 188:bcfe06ba3d64 659 #endif
AnnaBridge 188:bcfe06ba3d64 660 return _data[index];
AnnaBridge 188:bcfe06ba3d64 661 }
AnnaBridge 188:bcfe06ba3d64 662
AnnaBridge 188:bcfe06ba3d64 663 /**
AnnaBridge 188:bcfe06ba3d64 664 * Get the raw pointer to the sequence viewed.
AnnaBridge 188:bcfe06ba3d64 665 *
AnnaBridge 188:bcfe06ba3d64 666 * @return The raw pointer to the first element viewed.
AnnaBridge 188:bcfe06ba3d64 667 */
AnnaBridge 188:bcfe06ba3d64 668 pointer data() const
AnnaBridge 188:bcfe06ba3d64 669 {
AnnaBridge 188:bcfe06ba3d64 670 return _data;
AnnaBridge 188:bcfe06ba3d64 671 }
AnnaBridge 188:bcfe06ba3d64 672
AnnaBridge 188:bcfe06ba3d64 673 /**
AnnaBridge 188:bcfe06ba3d64 674 * Create a new Span over the first @p Count elements of the existing view.
AnnaBridge 188:bcfe06ba3d64 675 *
AnnaBridge 188:bcfe06ba3d64 676 * @tparam Count The number of elements viewed by the new Span.
AnnaBridge 188:bcfe06ba3d64 677 *
AnnaBridge 188:bcfe06ba3d64 678 * @return A new Span over the first @p Count elements.
AnnaBridge 188:bcfe06ba3d64 679 *
AnnaBridge 188:bcfe06ba3d64 680 * @pre Count >= 0 && Count <= size().
AnnaBridge 188:bcfe06ba3d64 681 */
AnnaBridge 188:bcfe06ba3d64 682 template<ptrdiff_t Count>
AnnaBridge 188:bcfe06ba3d64 683 Span<element_type, Count> first() const
AnnaBridge 188:bcfe06ba3d64 684 {
AnnaBridge 188:bcfe06ba3d64 685 MBED_ASSERT((Count >= 0) && (Count <= _size));
AnnaBridge 188:bcfe06ba3d64 686 return Span<element_type, Count>(_data, Count);
AnnaBridge 188:bcfe06ba3d64 687 }
AnnaBridge 188:bcfe06ba3d64 688
AnnaBridge 188:bcfe06ba3d64 689 /**
AnnaBridge 188:bcfe06ba3d64 690 * Create a new Span over the last @p Count elements of the existing view.
AnnaBridge 188:bcfe06ba3d64 691 *
AnnaBridge 188:bcfe06ba3d64 692 * @tparam Count The number of elements viewed by the new Span.
AnnaBridge 188:bcfe06ba3d64 693 *
AnnaBridge 188:bcfe06ba3d64 694 * @return A new Span over the last @p Count elements.
AnnaBridge 188:bcfe06ba3d64 695 *
AnnaBridge 188:bcfe06ba3d64 696 * @pre Count >= 0 && Count <= size().
AnnaBridge 188:bcfe06ba3d64 697 */
AnnaBridge 188:bcfe06ba3d64 698 template<ptrdiff_t Count>
AnnaBridge 188:bcfe06ba3d64 699 Span<element_type, Count> last() const
AnnaBridge 188:bcfe06ba3d64 700 {
AnnaBridge 188:bcfe06ba3d64 701 MBED_ASSERT((0 <= Count) && (Count <= _size));
AnnaBridge 188:bcfe06ba3d64 702 return Span<element_type, Count>(_data + (_size - Count), Count);
AnnaBridge 188:bcfe06ba3d64 703 }
AnnaBridge 188:bcfe06ba3d64 704
AnnaBridge 188:bcfe06ba3d64 705 /**
AnnaBridge 188:bcfe06ba3d64 706 * Create a subspan that is a view other Count elements; the view starts at
AnnaBridge 188:bcfe06ba3d64 707 * element Offset.
AnnaBridge 188:bcfe06ba3d64 708 *
AnnaBridge 188:bcfe06ba3d64 709 * @tparam Offset The offset of the first element viewed by the subspan.
AnnaBridge 188:bcfe06ba3d64 710 *
AnnaBridge 188:bcfe06ba3d64 711 * @tparam Count The number of elements present in the subspan. If Count
AnnaBridge 188:bcfe06ba3d64 712 * is equal to SPAN_DYNAMIC_EXTENT, then a Span starting at offset and
AnnaBridge 188:bcfe06ba3d64 713 * containing the rest of the elements is returned.
AnnaBridge 188:bcfe06ba3d64 714 *
AnnaBridge 188:bcfe06ba3d64 715 * @return A subspan of this starting at Offset and Count long.
AnnaBridge 188:bcfe06ba3d64 716 */
AnnaBridge 188:bcfe06ba3d64 717 template<std::ptrdiff_t Offset, std::ptrdiff_t Count>
AnnaBridge 188:bcfe06ba3d64 718 Span<element_type, Count>
AnnaBridge 188:bcfe06ba3d64 719 subspan() const
AnnaBridge 188:bcfe06ba3d64 720 {
AnnaBridge 188:bcfe06ba3d64 721 MBED_ASSERT(0 <= Offset && Offset <= _size);
AnnaBridge 188:bcfe06ba3d64 722 MBED_ASSERT(
AnnaBridge 188:bcfe06ba3d64 723 (Count == SPAN_DYNAMIC_EXTENT) ||
AnnaBridge 188:bcfe06ba3d64 724 (0 <= Count && (Count + Offset) <= _size)
AnnaBridge 188:bcfe06ba3d64 725 );
AnnaBridge 188:bcfe06ba3d64 726 return Span<element_type, Count>(
AnnaBridge 189:f392fc9709a3 727 _data + Offset,
AnnaBridge 189:f392fc9709a3 728 Count == SPAN_DYNAMIC_EXTENT ? _size - Offset : Count
AnnaBridge 189:f392fc9709a3 729 );
AnnaBridge 188:bcfe06ba3d64 730 }
AnnaBridge 188:bcfe06ba3d64 731
AnnaBridge 188:bcfe06ba3d64 732 /**
AnnaBridge 188:bcfe06ba3d64 733 * Create a new Span over the first @p count elements of the existing view.
AnnaBridge 188:bcfe06ba3d64 734 *
AnnaBridge 188:bcfe06ba3d64 735 * @param count The number of elements viewed by the new Span.
AnnaBridge 188:bcfe06ba3d64 736 *
AnnaBridge 188:bcfe06ba3d64 737 * @return A new Span over the first @p count elements.
AnnaBridge 188:bcfe06ba3d64 738 */
AnnaBridge 188:bcfe06ba3d64 739 Span<element_type, SPAN_DYNAMIC_EXTENT> first(index_type count) const
AnnaBridge 188:bcfe06ba3d64 740 {
AnnaBridge 188:bcfe06ba3d64 741 MBED_ASSERT(0 <= count && count <= _size);
AnnaBridge 188:bcfe06ba3d64 742 return Span<element_type, SPAN_DYNAMIC_EXTENT>(_data, count);
AnnaBridge 188:bcfe06ba3d64 743 }
AnnaBridge 188:bcfe06ba3d64 744
AnnaBridge 188:bcfe06ba3d64 745 /**
AnnaBridge 188:bcfe06ba3d64 746 * Create a new Span over the last @p count elements of the existing view.
AnnaBridge 188:bcfe06ba3d64 747 *
AnnaBridge 188:bcfe06ba3d64 748 * @param count The number of elements viewed by the new Span.
AnnaBridge 188:bcfe06ba3d64 749 *
AnnaBridge 188:bcfe06ba3d64 750 * @return A new Span over the last @p count elements.
AnnaBridge 188:bcfe06ba3d64 751 */
AnnaBridge 188:bcfe06ba3d64 752 Span<element_type, SPAN_DYNAMIC_EXTENT> last(index_type count) const
AnnaBridge 188:bcfe06ba3d64 753 {
AnnaBridge 188:bcfe06ba3d64 754 MBED_ASSERT(0 <= count && count <= _size);
AnnaBridge 188:bcfe06ba3d64 755 return Span<element_type, SPAN_DYNAMIC_EXTENT>(
AnnaBridge 189:f392fc9709a3 756 _data + (_size - count),
AnnaBridge 189:f392fc9709a3 757 count
AnnaBridge 189:f392fc9709a3 758 );
AnnaBridge 188:bcfe06ba3d64 759 }
AnnaBridge 188:bcfe06ba3d64 760
AnnaBridge 188:bcfe06ba3d64 761 /**
AnnaBridge 188:bcfe06ba3d64 762 * Create a subspan that is a view of other count elements; the view starts at
AnnaBridge 188:bcfe06ba3d64 763 * element offset.
AnnaBridge 188:bcfe06ba3d64 764 *
AnnaBridge 188:bcfe06ba3d64 765 * @param offset The offset of the first element viewed by the subspan.
AnnaBridge 188:bcfe06ba3d64 766 *
AnnaBridge 188:bcfe06ba3d64 767 * @param count The number of elements present in the subspan. If Count
AnnaBridge 188:bcfe06ba3d64 768 * is equal to SPAN_DYNAMIC_EXTENT, then a Span starting at offset and
AnnaBridge 188:bcfe06ba3d64 769 * containing the rest of the elements is returned.
AnnaBridge 188:bcfe06ba3d64 770 *
AnnaBridge 188:bcfe06ba3d64 771 * @return A subspan of this starting at offset and count long.
AnnaBridge 188:bcfe06ba3d64 772 */
AnnaBridge 188:bcfe06ba3d64 773 Span<element_type, SPAN_DYNAMIC_EXTENT> subspan(
AnnaBridge 188:bcfe06ba3d64 774 index_type offset, index_type count = SPAN_DYNAMIC_EXTENT
AnnaBridge 188:bcfe06ba3d64 775 ) const
AnnaBridge 188:bcfe06ba3d64 776 {
AnnaBridge 188:bcfe06ba3d64 777 MBED_ASSERT(0 <= offset && offset <= _size);
AnnaBridge 188:bcfe06ba3d64 778 MBED_ASSERT(
AnnaBridge 188:bcfe06ba3d64 779 (count == SPAN_DYNAMIC_EXTENT) ||
AnnaBridge 188:bcfe06ba3d64 780 (0 <= count && (count + offset) <= _size)
AnnaBridge 188:bcfe06ba3d64 781 );
AnnaBridge 188:bcfe06ba3d64 782 return Span<element_type, SPAN_DYNAMIC_EXTENT>(
AnnaBridge 189:f392fc9709a3 783 _data + offset,
AnnaBridge 189:f392fc9709a3 784 count == SPAN_DYNAMIC_EXTENT ? _size - offset : count
AnnaBridge 189:f392fc9709a3 785 );
AnnaBridge 188:bcfe06ba3d64 786 }
AnnaBridge 188:bcfe06ba3d64 787
AnnaBridge 188:bcfe06ba3d64 788 private:
AnnaBridge 188:bcfe06ba3d64 789 pointer _data;
AnnaBridge 188:bcfe06ba3d64 790 index_type _size;
AnnaBridge 188:bcfe06ba3d64 791 };
AnnaBridge 188:bcfe06ba3d64 792
AnnaBridge 188:bcfe06ba3d64 793 /**
AnnaBridge 188:bcfe06ba3d64 794 * Equality operator between two Span objects.
AnnaBridge 188:bcfe06ba3d64 795 *
AnnaBridge 188:bcfe06ba3d64 796 * @param lhs Left side of the binary operation.
AnnaBridge 188:bcfe06ba3d64 797 * @param rhs Right side of the binary operation.
AnnaBridge 188:bcfe06ba3d64 798 *
AnnaBridge 188:bcfe06ba3d64 799 * @return True if Spans in input have the same size and the same content and
AnnaBridge 188:bcfe06ba3d64 800 * false otherwise.
AnnaBridge 189:f392fc9709a3 801 *
AnnaBridge 188:bcfe06ba3d64 802 * @relates Span
AnnaBridge 188:bcfe06ba3d64 803 */
AnnaBridge 188:bcfe06ba3d64 804 template<typename T, typename U, ptrdiff_t LhsExtent, ptrdiff_t RhsExtent>
AnnaBridge 188:bcfe06ba3d64 805 bool operator==(const Span<T, LhsExtent> &lhs, const Span<U, RhsExtent> &rhs)
AnnaBridge 188:bcfe06ba3d64 806 {
AnnaBridge 188:bcfe06ba3d64 807 if (lhs.size() != rhs.size()) {
AnnaBridge 188:bcfe06ba3d64 808 return false;
AnnaBridge 188:bcfe06ba3d64 809 }
AnnaBridge 188:bcfe06ba3d64 810
AnnaBridge 188:bcfe06ba3d64 811 if (lhs.data() == rhs.data()) {
AnnaBridge 188:bcfe06ba3d64 812 return true;
AnnaBridge 188:bcfe06ba3d64 813 }
AnnaBridge 188:bcfe06ba3d64 814
AnnaBridge 188:bcfe06ba3d64 815 return std::equal(lhs.data(), lhs.data() + lhs.size(), rhs.data());
AnnaBridge 188:bcfe06ba3d64 816 }
AnnaBridge 188:bcfe06ba3d64 817
AnnaBridge 189:f392fc9709a3 818 // AStyle ignore, not handling correctly below
AnnaBridge 189:f392fc9709a3 819 // *INDENT-OFF*
AnnaBridge 188:bcfe06ba3d64 820 /**
AnnaBridge 188:bcfe06ba3d64 821 * Equality operation between a Span and a reference to a C++ array.
AnnaBridge 188:bcfe06ba3d64 822 *
AnnaBridge 188:bcfe06ba3d64 823 * @param lhs Left side of the binary operation.
AnnaBridge 188:bcfe06ba3d64 824 * @param rhs Right side of the binary operation.
AnnaBridge 188:bcfe06ba3d64 825 *
AnnaBridge 188:bcfe06ba3d64 826 * @return True if elements in input have the same size and the same content and
AnnaBridge 188:bcfe06ba3d64 827 * false otherwise.
AnnaBridge 188:bcfe06ba3d64 828 */
AnnaBridge 188:bcfe06ba3d64 829 template<typename T, ptrdiff_t LhsExtent, ptrdiff_t RhsExtent>
AnnaBridge 188:bcfe06ba3d64 830 bool operator==(const Span<T, LhsExtent> &lhs, T (&rhs)[RhsExtent])
AnnaBridge 188:bcfe06ba3d64 831 {
AnnaBridge 188:bcfe06ba3d64 832 return lhs == Span<T>(rhs);
AnnaBridge 188:bcfe06ba3d64 833 }
AnnaBridge 188:bcfe06ba3d64 834
AnnaBridge 188:bcfe06ba3d64 835 /**
AnnaBridge 188:bcfe06ba3d64 836 * Equality operation between a Span and a reference to a C++ array.
AnnaBridge 188:bcfe06ba3d64 837 *
AnnaBridge 188:bcfe06ba3d64 838 * @param lhs Left side of the binary operation.
AnnaBridge 188:bcfe06ba3d64 839 * @param rhs Right side of the binary operation.
AnnaBridge 188:bcfe06ba3d64 840 *
AnnaBridge 188:bcfe06ba3d64 841 * @return True if elements in input have the same size and the same content
AnnaBridge 188:bcfe06ba3d64 842 * and false otherwise.
AnnaBridge 188:bcfe06ba3d64 843 */
AnnaBridge 188:bcfe06ba3d64 844 template<typename T, ptrdiff_t LhsExtent, ptrdiff_t RhsExtent>
AnnaBridge 188:bcfe06ba3d64 845 bool operator==(T (&lhs)[LhsExtent], const Span<T, RhsExtent> &rhs)
AnnaBridge 188:bcfe06ba3d64 846 {
AnnaBridge 188:bcfe06ba3d64 847 return Span<T>(lhs) == rhs;
AnnaBridge 188:bcfe06ba3d64 848 }
AnnaBridge 188:bcfe06ba3d64 849
AnnaBridge 188:bcfe06ba3d64 850 /**
AnnaBridge 188:bcfe06ba3d64 851 * Not equal operator
AnnaBridge 188:bcfe06ba3d64 852 *
AnnaBridge 188:bcfe06ba3d64 853 * @param lhs Left side of the binary operation.
AnnaBridge 188:bcfe06ba3d64 854 * @param rhs Right side of the binary operation.
AnnaBridge 188:bcfe06ba3d64 855 *
AnnaBridge 188:bcfe06ba3d64 856 * @return True if arrays in input do not have the same size or the same content
AnnaBridge 188:bcfe06ba3d64 857 * and false otherwise.
AnnaBridge 189:f392fc9709a3 858 *
AnnaBridge 188:bcfe06ba3d64 859 * @relates Span
AnnaBridge 188:bcfe06ba3d64 860 */
AnnaBridge 188:bcfe06ba3d64 861 template<typename T, typename U, ptrdiff_t LhsExtent, ptrdiff_t RhsExtent>
AnnaBridge 188:bcfe06ba3d64 862 bool operator!=(const Span<T, LhsExtent> &lhs, const Span<U, RhsExtent> &rhs)
AnnaBridge 188:bcfe06ba3d64 863 {
AnnaBridge 188:bcfe06ba3d64 864 return !(lhs == rhs);
AnnaBridge 188:bcfe06ba3d64 865 }
AnnaBridge 188:bcfe06ba3d64 866
AnnaBridge 188:bcfe06ba3d64 867 /**
AnnaBridge 188:bcfe06ba3d64 868 * Not Equal operation between a Span and a reference to a C++ array.
AnnaBridge 188:bcfe06ba3d64 869 *
AnnaBridge 188:bcfe06ba3d64 870 * @param lhs Left side of the binary operation.
AnnaBridge 188:bcfe06ba3d64 871 * @param rhs Right side of the binary operation.
AnnaBridge 188:bcfe06ba3d64 872 *
AnnaBridge 188:bcfe06ba3d64 873 * @return True if elements in input have the same size and the same content
AnnaBridge 188:bcfe06ba3d64 874 * and false otherwise.
AnnaBridge 188:bcfe06ba3d64 875 */
AnnaBridge 188:bcfe06ba3d64 876 template<typename T, ptrdiff_t LhsExtent, ptrdiff_t RhsExtent>
AnnaBridge 188:bcfe06ba3d64 877 bool operator!=(const Span<T, LhsExtent> &lhs, T (&rhs)[RhsExtent])
AnnaBridge 188:bcfe06ba3d64 878 {
AnnaBridge 188:bcfe06ba3d64 879 return !(lhs == Span<T, RhsExtent>(rhs));
AnnaBridge 188:bcfe06ba3d64 880 }
AnnaBridge 188:bcfe06ba3d64 881
AnnaBridge 188:bcfe06ba3d64 882 /**
AnnaBridge 188:bcfe06ba3d64 883 * Not Equal operation between a Span and a reference to a C++ array.
AnnaBridge 188:bcfe06ba3d64 884 *
AnnaBridge 188:bcfe06ba3d64 885 * @param lhs Left side of the binary operation.
AnnaBridge 188:bcfe06ba3d64 886 * @param rhs Right side of the binary operation.
AnnaBridge 188:bcfe06ba3d64 887 *
AnnaBridge 188:bcfe06ba3d64 888 * @return True if elements in input have the same size and the same content
AnnaBridge 188:bcfe06ba3d64 889 * and false otherwise.
AnnaBridge 188:bcfe06ba3d64 890 */
AnnaBridge 188:bcfe06ba3d64 891 template<typename T, ptrdiff_t LhsExtent, ptrdiff_t RhsExtent>
AnnaBridge 188:bcfe06ba3d64 892 bool operator!=(T (&lhs)[LhsExtent], const Span<T, RhsExtent> &rhs)
AnnaBridge 188:bcfe06ba3d64 893 {
AnnaBridge 188:bcfe06ba3d64 894 return !(Span<T, LhsExtent>(lhs) == rhs);
AnnaBridge 188:bcfe06ba3d64 895 }
AnnaBridge 188:bcfe06ba3d64 896
AnnaBridge 188:bcfe06ba3d64 897 /**
AnnaBridge 188:bcfe06ba3d64 898 * Generate a Span from a reference to a C/C++ array.
AnnaBridge 188:bcfe06ba3d64 899 *
AnnaBridge 188:bcfe06ba3d64 900 * @tparam T Type of elements held in elements.
AnnaBridge 188:bcfe06ba3d64 901 * @tparam Extent Number of items held in elements.
AnnaBridge 188:bcfe06ba3d64 902 *
AnnaBridge 188:bcfe06ba3d64 903 * @param elements The reference to the array viewed.
AnnaBridge 188:bcfe06ba3d64 904 *
AnnaBridge 188:bcfe06ba3d64 905 * @return The Span to elements.
AnnaBridge 188:bcfe06ba3d64 906 *
AnnaBridge 188:bcfe06ba3d64 907 * @note This helper avoids the typing of template parameter when Span is
AnnaBridge 188:bcfe06ba3d64 908 * created 'inline'.
AnnaBridge 189:f392fc9709a3 909 *
AnnaBridge 188:bcfe06ba3d64 910 * @relates Span
AnnaBridge 188:bcfe06ba3d64 911 */
AnnaBridge 188:bcfe06ba3d64 912 template<typename T, size_t Size>
AnnaBridge 188:bcfe06ba3d64 913 Span<T, Size> make_Span(T (&elements)[Size])
AnnaBridge 188:bcfe06ba3d64 914 {
AnnaBridge 188:bcfe06ba3d64 915 return Span<T, Size>(elements);
AnnaBridge 188:bcfe06ba3d64 916 }
AnnaBridge 188:bcfe06ba3d64 917
AnnaBridge 188:bcfe06ba3d64 918 /**
AnnaBridge 188:bcfe06ba3d64 919 * Generate a Span from a pointer to a C/C++ array.
AnnaBridge 188:bcfe06ba3d64 920 *
AnnaBridge 188:bcfe06ba3d64 921 * @tparam Extent Number of items held in elements.
AnnaBridge 188:bcfe06ba3d64 922 * @tparam T Type of elements held in elements.
AnnaBridge 188:bcfe06ba3d64 923 *
AnnaBridge 188:bcfe06ba3d64 924 * @param elements The reference to the array viewed.
AnnaBridge 188:bcfe06ba3d64 925 *
AnnaBridge 188:bcfe06ba3d64 926 * @return The Span to elements.
AnnaBridge 188:bcfe06ba3d64 927 *
AnnaBridge 188:bcfe06ba3d64 928 * @note This helper avoids the typing of template parameter when Span is
AnnaBridge 188:bcfe06ba3d64 929 * created 'inline'.
AnnaBridge 188:bcfe06ba3d64 930 */
AnnaBridge 188:bcfe06ba3d64 931 template<ptrdiff_t Extent, typename T>
AnnaBridge 188:bcfe06ba3d64 932 Span<T, Extent> make_Span(T *elements)
AnnaBridge 188:bcfe06ba3d64 933 {
AnnaBridge 188:bcfe06ba3d64 934 return Span<T, Extent>(elements, Extent);
AnnaBridge 188:bcfe06ba3d64 935 }
AnnaBridge 188:bcfe06ba3d64 936
AnnaBridge 188:bcfe06ba3d64 937 /**
AnnaBridge 188:bcfe06ba3d64 938 * Generate a Span from a C/C++ pointer and the size of the array.
AnnaBridge 188:bcfe06ba3d64 939 *
AnnaBridge 188:bcfe06ba3d64 940 * @tparam T Type of elements held in array_ptr.
AnnaBridge 188:bcfe06ba3d64 941 *
AnnaBridge 188:bcfe06ba3d64 942 * @param array_ptr The pointer to the array viewed.
AnnaBridge 188:bcfe06ba3d64 943 * @param array_size The number of T elements in the array.
AnnaBridge 188:bcfe06ba3d64 944 *
AnnaBridge 188:bcfe06ba3d64 945 * @return The Span to array_ptr with a size of array_size.
AnnaBridge 188:bcfe06ba3d64 946 *
AnnaBridge 188:bcfe06ba3d64 947 * @note This helper avoids the typing of template parameter when Span is
AnnaBridge 188:bcfe06ba3d64 948 * created 'inline'.
AnnaBridge 188:bcfe06ba3d64 949 *
AnnaBridge 188:bcfe06ba3d64 950 * @relates Span
AnnaBridge 188:bcfe06ba3d64 951 */
AnnaBridge 188:bcfe06ba3d64 952 template<typename T>
AnnaBridge 188:bcfe06ba3d64 953 Span<T> make_Span(T *array_ptr, ptrdiff_t array_size)
AnnaBridge 188:bcfe06ba3d64 954 {
AnnaBridge 188:bcfe06ba3d64 955 return Span<T>(array_ptr, array_size);
AnnaBridge 188:bcfe06ba3d64 956 }
AnnaBridge 188:bcfe06ba3d64 957
AnnaBridge 188:bcfe06ba3d64 958 /**
AnnaBridge 188:bcfe06ba3d64 959 * Generate a Span to a const content from a reference to a C/C++ array.
AnnaBridge 188:bcfe06ba3d64 960 *
AnnaBridge 188:bcfe06ba3d64 961 * @tparam T Type of elements held in elements.
AnnaBridge 188:bcfe06ba3d64 962 * @tparam Extent Number of items held in elements.
AnnaBridge 188:bcfe06ba3d64 963 *
AnnaBridge 188:bcfe06ba3d64 964 * @param elements The array viewed.
AnnaBridge 188:bcfe06ba3d64 965 * @return The Span to elements.
AnnaBridge 188:bcfe06ba3d64 966 *
AnnaBridge 188:bcfe06ba3d64 967 * @note This helper avoids the typing of template parameter when Span is
AnnaBridge 188:bcfe06ba3d64 968 * created 'inline'.
AnnaBridge 188:bcfe06ba3d64 969 */
AnnaBridge 188:bcfe06ba3d64 970 template<typename T, size_t Extent>
AnnaBridge 188:bcfe06ba3d64 971 Span<const T, Extent> make_const_Span(const T (&elements)[Extent])
AnnaBridge 188:bcfe06ba3d64 972 {
AnnaBridge 188:bcfe06ba3d64 973 return Span<const T, Extent>(elements);
AnnaBridge 188:bcfe06ba3d64 974 }
AnnaBridge 189:f392fc9709a3 975 // *INDENT-ON*
AnnaBridge 188:bcfe06ba3d64 976 /**
AnnaBridge 188:bcfe06ba3d64 977 * Generate a Span to a const content from a pointer to a C/C++ array.
AnnaBridge 188:bcfe06ba3d64 978 *
AnnaBridge 188:bcfe06ba3d64 979 * @tparam Extent Number of items held in elements.
AnnaBridge 188:bcfe06ba3d64 980 * @tparam T Type of elements held in elements.
AnnaBridge 188:bcfe06ba3d64 981 *
AnnaBridge 188:bcfe06ba3d64 982 * @param elements The reference to the array viewed.
AnnaBridge 188:bcfe06ba3d64 983 *
AnnaBridge 188:bcfe06ba3d64 984 * @return The Span to elements.
AnnaBridge 188:bcfe06ba3d64 985 *
AnnaBridge 188:bcfe06ba3d64 986 * @note This helper avoids the typing of template parameter when Span is
AnnaBridge 188:bcfe06ba3d64 987 * created 'inline'.
AnnaBridge 189:f392fc9709a3 988 *
AnnaBridge 188:bcfe06ba3d64 989 * @relates Span
AnnaBridge 188:bcfe06ba3d64 990 */
AnnaBridge 188:bcfe06ba3d64 991 template<size_t Extent, typename T>
AnnaBridge 188:bcfe06ba3d64 992 Span<const T, Extent> make_const_Span(const T *elements)
AnnaBridge 188:bcfe06ba3d64 993 {
AnnaBridge 188:bcfe06ba3d64 994 return Span<const T, Extent>(elements, Extent);
AnnaBridge 188:bcfe06ba3d64 995 }
AnnaBridge 188:bcfe06ba3d64 996
AnnaBridge 188:bcfe06ba3d64 997 /**
AnnaBridge 188:bcfe06ba3d64 998 * Generate a Span to a const content from a C/C++ pointer and the size of the
AnnaBridge 188:bcfe06ba3d64 999 * array.
AnnaBridge 188:bcfe06ba3d64 1000 *
AnnaBridge 188:bcfe06ba3d64 1001 * @tparam T Type of elements held in array_ptr.
AnnaBridge 188:bcfe06ba3d64 1002 *
AnnaBridge 188:bcfe06ba3d64 1003 * @param array_ptr The pointer to the array to viewed.
AnnaBridge 188:bcfe06ba3d64 1004 * @param array_size The number of T elements in the array.
AnnaBridge 188:bcfe06ba3d64 1005 *
AnnaBridge 188:bcfe06ba3d64 1006 * @return The Span to array_ptr with a size of array_size.
AnnaBridge 188:bcfe06ba3d64 1007 *
AnnaBridge 188:bcfe06ba3d64 1008 * @note This helper avoids the typing of template parameter when Span is
AnnaBridge 188:bcfe06ba3d64 1009 * created 'inline'.
AnnaBridge 189:f392fc9709a3 1010 *
AnnaBridge 188:bcfe06ba3d64 1011 * @relates Span
AnnaBridge 188:bcfe06ba3d64 1012 */
AnnaBridge 188:bcfe06ba3d64 1013 template<typename T>
AnnaBridge 188:bcfe06ba3d64 1014 Span<const T> make_const_Span(T *array_ptr, size_t array_size)
AnnaBridge 188:bcfe06ba3d64 1015 {
AnnaBridge 188:bcfe06ba3d64 1016 return Span<const T>(array_ptr, array_size);
AnnaBridge 188:bcfe06ba3d64 1017 }
AnnaBridge 188:bcfe06ba3d64 1018
AnnaBridge 188:bcfe06ba3d64 1019 /**@}*/
AnnaBridge 188:bcfe06ba3d64 1020
AnnaBridge 188:bcfe06ba3d64 1021 /**@}*/
AnnaBridge 188:bcfe06ba3d64 1022
AnnaBridge 188:bcfe06ba3d64 1023 } // namespace mbed
AnnaBridge 188:bcfe06ba3d64 1024
AnnaBridge 188:bcfe06ba3d64 1025 #endif /* MBED_PLATFORM_SPAN_H_ */