The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Dependents:   hello SerialTestv11 SerialTestv12 Sierpinski ... more

mbed 2

This is the mbed 2 library. If you'd like to learn about Mbed OS please see the mbed-os docs.

Committer:
AnnaBridge
Date:
Wed Feb 20 20:53:29 2019 +0000
Revision:
172:65be27845400
Parent:
171:3a7713b1edbc
mbed library release version 165

Who changed what in which revision?

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