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:
Thu Nov 08 11:45:42 2018 +0000
Revision:
171:3a7713b1edbc
Child:
172:65be27845400
mbed library. Release version 164

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