mbed library sources. Supersedes mbed-src.

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

Committer:
AnnaBridge
Date:
Thu Nov 08 11:46:34 2018 +0000
Revision:
188:bcfe06ba3d64
Child:
189:f392fc9709a3
mbed-dev library. Release version 164

Who changed what in which revision?

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