Extended MaximInterface

Dependents:   mbed_DS28EC20_GPIO

Committer:
reARMnimator
Date:
Mon Jan 06 15:54:55 2020 +0000
Revision:
10:de4b8812877d
Parent:
7:471901a04573
Fixed inappropriate include path.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 6:a8c83a2e6fa4 1 /*******************************************************************************
IanBenzMaxim 6:a8c83a2e6fa4 2 * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved.
IanBenzMaxim 6:a8c83a2e6fa4 3 *
IanBenzMaxim 6:a8c83a2e6fa4 4 * Permission is hereby granted, free of charge, to any person obtaining a
IanBenzMaxim 6:a8c83a2e6fa4 5 * copy of this software and associated documentation files (the "Software"),
IanBenzMaxim 6:a8c83a2e6fa4 6 * to deal in the Software without restriction, including without limitation
IanBenzMaxim 6:a8c83a2e6fa4 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
IanBenzMaxim 6:a8c83a2e6fa4 8 * and/or sell copies of the Software, and to permit persons to whom the
IanBenzMaxim 6:a8c83a2e6fa4 9 * Software is furnished to do so, subject to the following conditions:
IanBenzMaxim 6:a8c83a2e6fa4 10 *
IanBenzMaxim 6:a8c83a2e6fa4 11 * The above copyright notice and this permission notice shall be included
IanBenzMaxim 6:a8c83a2e6fa4 12 * in all copies or substantial portions of the Software.
IanBenzMaxim 6:a8c83a2e6fa4 13 *
IanBenzMaxim 6:a8c83a2e6fa4 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
IanBenzMaxim 6:a8c83a2e6fa4 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
IanBenzMaxim 6:a8c83a2e6fa4 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IanBenzMaxim 6:a8c83a2e6fa4 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
IanBenzMaxim 6:a8c83a2e6fa4 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
IanBenzMaxim 6:a8c83a2e6fa4 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
IanBenzMaxim 6:a8c83a2e6fa4 20 * OTHER DEALINGS IN THE SOFTWARE.
IanBenzMaxim 6:a8c83a2e6fa4 21 *
IanBenzMaxim 6:a8c83a2e6fa4 22 * Except as contained in this notice, the name of Maxim Integrated
IanBenzMaxim 6:a8c83a2e6fa4 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
IanBenzMaxim 6:a8c83a2e6fa4 24 * Products, Inc. Branding Policy.
IanBenzMaxim 6:a8c83a2e6fa4 25 *
IanBenzMaxim 6:a8c83a2e6fa4 26 * The mere transfer of this software does not imply any licenses
IanBenzMaxim 6:a8c83a2e6fa4 27 * of trade secrets, proprietary technology, copyrights, patents,
IanBenzMaxim 6:a8c83a2e6fa4 28 * trademarks, maskwork rights, or any other form of intellectual
IanBenzMaxim 6:a8c83a2e6fa4 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
IanBenzMaxim 6:a8c83a2e6fa4 30 * ownership rights.
IanBenzMaxim 6:a8c83a2e6fa4 31 *******************************************************************************/
IanBenzMaxim 6:a8c83a2e6fa4 32
IanBenzMaxim 6:a8c83a2e6fa4 33 #ifndef MaximInterface_span
IanBenzMaxim 6:a8c83a2e6fa4 34 #define MaximInterface_span
IanBenzMaxim 6:a8c83a2e6fa4 35
IanBenzMaxim 6:a8c83a2e6fa4 36 #include <stddef.h>
IanBenzMaxim 6:a8c83a2e6fa4 37 #include <algorithm>
IanBenzMaxim 6:a8c83a2e6fa4 38 #include <iterator>
IanBenzMaxim 6:a8c83a2e6fa4 39 #include <vector>
IanBenzMaxim 6:a8c83a2e6fa4 40 #include "array.hpp"
IanBenzMaxim 6:a8c83a2e6fa4 41 #include "type_traits.hpp"
IanBenzMaxim 6:a8c83a2e6fa4 42
IanBenzMaxim 6:a8c83a2e6fa4 43 namespace MaximInterface {
IanBenzMaxim 6:a8c83a2e6fa4 44
IanBenzMaxim 6:a8c83a2e6fa4 45 static const ptrdiff_t dynamic_extent = -1;
IanBenzMaxim 6:a8c83a2e6fa4 46
IanBenzMaxim 6:a8c83a2e6fa4 47 struct with_container_t {
IanBenzMaxim 6:a8c83a2e6fa4 48 explicit with_container_t(int) {}
IanBenzMaxim 6:a8c83a2e6fa4 49 };
IanBenzMaxim 6:a8c83a2e6fa4 50
IanBenzMaxim 6:a8c83a2e6fa4 51 static const with_container_t with_container(0);
IanBenzMaxim 6:a8c83a2e6fa4 52
IanBenzMaxim 6:a8c83a2e6fa4 53 namespace detail {
IanBenzMaxim 6:a8c83a2e6fa4 54
IanBenzMaxim 6:a8c83a2e6fa4 55 template <template <typename, ptrdiff_t = MaximInterface::dynamic_extent>
IanBenzMaxim 6:a8c83a2e6fa4 56 class span,
IanBenzMaxim 6:a8c83a2e6fa4 57 typename T, ptrdiff_t Extent>
IanBenzMaxim 6:a8c83a2e6fa4 58 class span_base {
IanBenzMaxim 6:a8c83a2e6fa4 59 public:
IanBenzMaxim 6:a8c83a2e6fa4 60 typedef T element_type;
IanBenzMaxim 6:a8c83a2e6fa4 61 typedef typename remove_cv<element_type>::type value_type;
IanBenzMaxim 6:a8c83a2e6fa4 62 typedef ptrdiff_t index_type;
IanBenzMaxim 6:a8c83a2e6fa4 63 typedef ptrdiff_t difference_type;
IanBenzMaxim 6:a8c83a2e6fa4 64 typedef element_type * pointer;
IanBenzMaxim 6:a8c83a2e6fa4 65 typedef element_type & reference;
IanBenzMaxim 6:a8c83a2e6fa4 66 typedef element_type * iterator;
IanBenzMaxim 6:a8c83a2e6fa4 67 typedef const element_type * const_iterator;
IanBenzMaxim 6:a8c83a2e6fa4 68 typedef std::reverse_iterator<iterator> reverse_iterator;
IanBenzMaxim 6:a8c83a2e6fa4 69 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
IanBenzMaxim 6:a8c83a2e6fa4 70
IanBenzMaxim 6:a8c83a2e6fa4 71 static const index_type extent = Extent;
IanBenzMaxim 6:a8c83a2e6fa4 72
IanBenzMaxim 6:a8c83a2e6fa4 73 protected:
IanBenzMaxim 6:a8c83a2e6fa4 74 span_base(pointer data) : data_(data) {}
IanBenzMaxim 6:a8c83a2e6fa4 75 ~span_base() {}
IanBenzMaxim 6:a8c83a2e6fa4 76
IanBenzMaxim 6:a8c83a2e6fa4 77 public:
IanBenzMaxim 6:a8c83a2e6fa4 78 /// @name Iterators
IanBenzMaxim 6:a8c83a2e6fa4 79 /// @{
IanBenzMaxim 7:471901a04573 80
IanBenzMaxim 6:a8c83a2e6fa4 81 iterator begin() const {
IanBenzMaxim 6:a8c83a2e6fa4 82 return const_cast<iterator>(static_cast<const span_base &>(*this).cbegin());
IanBenzMaxim 6:a8c83a2e6fa4 83 }
IanBenzMaxim 6:a8c83a2e6fa4 84
IanBenzMaxim 6:a8c83a2e6fa4 85 const_iterator cbegin() const { return data(); }
IanBenzMaxim 6:a8c83a2e6fa4 86
IanBenzMaxim 6:a8c83a2e6fa4 87 iterator end() const {
IanBenzMaxim 6:a8c83a2e6fa4 88 return const_cast<iterator>(static_cast<const span_base &>(*this).cend());
IanBenzMaxim 6:a8c83a2e6fa4 89 }
IanBenzMaxim 6:a8c83a2e6fa4 90
IanBenzMaxim 6:a8c83a2e6fa4 91 const_iterator cend() const { return cbegin() + size(); }
IanBenzMaxim 6:a8c83a2e6fa4 92
IanBenzMaxim 6:a8c83a2e6fa4 93 reverse_iterator rbegin() const { return reverse_iterator(end()); }
IanBenzMaxim 6:a8c83a2e6fa4 94
IanBenzMaxim 6:a8c83a2e6fa4 95 const_reverse_iterator crbegin() const {
IanBenzMaxim 6:a8c83a2e6fa4 96 return const_reverse_iterator(cend());
IanBenzMaxim 6:a8c83a2e6fa4 97 }
IanBenzMaxim 6:a8c83a2e6fa4 98
IanBenzMaxim 6:a8c83a2e6fa4 99 reverse_iterator rend() const { return reverse_iterator(begin()); }
IanBenzMaxim 6:a8c83a2e6fa4 100
IanBenzMaxim 6:a8c83a2e6fa4 101 const_reverse_iterator crend() const {
IanBenzMaxim 6:a8c83a2e6fa4 102 return const_reverse_iterator(cbegin());
IanBenzMaxim 6:a8c83a2e6fa4 103 }
IanBenzMaxim 7:471901a04573 104
IanBenzMaxim 6:a8c83a2e6fa4 105 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 106
IanBenzMaxim 6:a8c83a2e6fa4 107 /// @name Element access
IanBenzMaxim 6:a8c83a2e6fa4 108 /// @{
IanBenzMaxim 7:471901a04573 109
IanBenzMaxim 6:a8c83a2e6fa4 110 reference operator[](index_type idx) const { return data()[idx]; }
IanBenzMaxim 6:a8c83a2e6fa4 111
IanBenzMaxim 6:a8c83a2e6fa4 112 reference operator()(index_type idx) const { return operator[](idx); }
IanBenzMaxim 6:a8c83a2e6fa4 113
IanBenzMaxim 6:a8c83a2e6fa4 114 pointer data() const { return data_; }
IanBenzMaxim 7:471901a04573 115
IanBenzMaxim 6:a8c83a2e6fa4 116 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 117
IanBenzMaxim 6:a8c83a2e6fa4 118 /// @name Subviews
IanBenzMaxim 6:a8c83a2e6fa4 119 /// @{
IanBenzMaxim 7:471901a04573 120
IanBenzMaxim 6:a8c83a2e6fa4 121 template <index_type Count> span<element_type, Count> first() const {
IanBenzMaxim 6:a8c83a2e6fa4 122 return subspan<0, Count>();
IanBenzMaxim 6:a8c83a2e6fa4 123 }
IanBenzMaxim 6:a8c83a2e6fa4 124
IanBenzMaxim 6:a8c83a2e6fa4 125 span<element_type> first(index_type Count) const { return subspan(0, Count); }
IanBenzMaxim 6:a8c83a2e6fa4 126
IanBenzMaxim 6:a8c83a2e6fa4 127 span<element_type> last(index_type Count) const {
IanBenzMaxim 6:a8c83a2e6fa4 128 return subspan(size() - Count, Count);
IanBenzMaxim 6:a8c83a2e6fa4 129 }
IanBenzMaxim 6:a8c83a2e6fa4 130
IanBenzMaxim 6:a8c83a2e6fa4 131 template <index_type Offset, index_type Count>
IanBenzMaxim 6:a8c83a2e6fa4 132 span<element_type, Count> subspan() const {
IanBenzMaxim 6:a8c83a2e6fa4 133 return span<element_type, Count>(data() + Offset, Count);
IanBenzMaxim 6:a8c83a2e6fa4 134 }
IanBenzMaxim 6:a8c83a2e6fa4 135
IanBenzMaxim 6:a8c83a2e6fa4 136 span<element_type> subspan(index_type Offset,
IanBenzMaxim 6:a8c83a2e6fa4 137 index_type Count = dynamic_extent) const {
IanBenzMaxim 6:a8c83a2e6fa4 138 return span<element_type>(
IanBenzMaxim 6:a8c83a2e6fa4 139 data() + Offset, Count == dynamic_extent ? size() - Offset : Count);
IanBenzMaxim 6:a8c83a2e6fa4 140 }
IanBenzMaxim 7:471901a04573 141
IanBenzMaxim 6:a8c83a2e6fa4 142 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 143
IanBenzMaxim 6:a8c83a2e6fa4 144 private:
IanBenzMaxim 6:a8c83a2e6fa4 145 index_type size() const {
IanBenzMaxim 6:a8c83a2e6fa4 146 return static_cast<const span<T, Extent> &>(*this).size();
IanBenzMaxim 6:a8c83a2e6fa4 147 }
IanBenzMaxim 6:a8c83a2e6fa4 148
IanBenzMaxim 6:a8c83a2e6fa4 149 pointer data_;
IanBenzMaxim 6:a8c83a2e6fa4 150 };
IanBenzMaxim 6:a8c83a2e6fa4 151
IanBenzMaxim 6:a8c83a2e6fa4 152 } // namespace detail
IanBenzMaxim 6:a8c83a2e6fa4 153
IanBenzMaxim 6:a8c83a2e6fa4 154 /// Generic memory span class similar to gsl::span or the proposed std::span.
IanBenzMaxim 6:a8c83a2e6fa4 155 template <typename T, ptrdiff_t Extent = dynamic_extent>
IanBenzMaxim 6:a8c83a2e6fa4 156 class span : public detail::span_base<MaximInterface::span, T, Extent> {
IanBenzMaxim 6:a8c83a2e6fa4 157 typedef detail::span_base<MaximInterface::span, T, Extent> span_base;
IanBenzMaxim 6:a8c83a2e6fa4 158
IanBenzMaxim 6:a8c83a2e6fa4 159 public:
IanBenzMaxim 6:a8c83a2e6fa4 160 using span_base::extent;
IanBenzMaxim 6:a8c83a2e6fa4 161 using typename span_base::element_type;
IanBenzMaxim 6:a8c83a2e6fa4 162 using typename span_base::index_type;
IanBenzMaxim 6:a8c83a2e6fa4 163 using typename span_base::pointer;
IanBenzMaxim 6:a8c83a2e6fa4 164 using typename span_base::value_type;
IanBenzMaxim 6:a8c83a2e6fa4 165
IanBenzMaxim 6:a8c83a2e6fa4 166 span(pointer data, index_type) : span_base(data) {}
IanBenzMaxim 6:a8c83a2e6fa4 167
IanBenzMaxim 6:a8c83a2e6fa4 168 span(pointer begin, pointer) : span_base(begin) {}
IanBenzMaxim 6:a8c83a2e6fa4 169
IanBenzMaxim 6:a8c83a2e6fa4 170 span(element_type (&arr)[extent]) : span_base(arr) {}
IanBenzMaxim 6:a8c83a2e6fa4 171
IanBenzMaxim 6:a8c83a2e6fa4 172 span(array<value_type, extent> & arr) : span_base(arr.data()) {}
IanBenzMaxim 6:a8c83a2e6fa4 173
IanBenzMaxim 6:a8c83a2e6fa4 174 span(const array<value_type, extent> & arr) : span_base(arr.data()) {}
IanBenzMaxim 6:a8c83a2e6fa4 175
IanBenzMaxim 6:a8c83a2e6fa4 176 template <typename U> span(const span<U, extent> & s) : span_base(s.data()) {}
IanBenzMaxim 6:a8c83a2e6fa4 177
IanBenzMaxim 6:a8c83a2e6fa4 178 template <typename Allocator>
IanBenzMaxim 6:a8c83a2e6fa4 179 explicit span(std::vector<value_type, Allocator> & vec)
IanBenzMaxim 6:a8c83a2e6fa4 180 : span_base(&vec.front()) {}
IanBenzMaxim 6:a8c83a2e6fa4 181
IanBenzMaxim 6:a8c83a2e6fa4 182 template <typename Allocator>
IanBenzMaxim 6:a8c83a2e6fa4 183 explicit span(const std::vector<value_type, Allocator> & vec)
IanBenzMaxim 6:a8c83a2e6fa4 184 : span_base(&vec.front()) {}
IanBenzMaxim 6:a8c83a2e6fa4 185
IanBenzMaxim 6:a8c83a2e6fa4 186 template <typename Container>
IanBenzMaxim 6:a8c83a2e6fa4 187 span(with_container_t, Container & cont) : span_base(cont.data()) {}
IanBenzMaxim 6:a8c83a2e6fa4 188
IanBenzMaxim 6:a8c83a2e6fa4 189 template <typename Container>
IanBenzMaxim 6:a8c83a2e6fa4 190 span(with_container_t, const Container & cont) : span_base(cont.data()) {}
IanBenzMaxim 6:a8c83a2e6fa4 191
IanBenzMaxim 6:a8c83a2e6fa4 192 /// @name Observers
IanBenzMaxim 6:a8c83a2e6fa4 193 /// @{
IanBenzMaxim 7:471901a04573 194
IanBenzMaxim 6:a8c83a2e6fa4 195 static index_type size() { return extent; }
IanBenzMaxim 6:a8c83a2e6fa4 196
IanBenzMaxim 6:a8c83a2e6fa4 197 static index_type size_bytes() { return size() * sizeof(element_type); }
IanBenzMaxim 6:a8c83a2e6fa4 198
IanBenzMaxim 6:a8c83a2e6fa4 199 static bool empty() { return size() == 0; }
IanBenzMaxim 7:471901a04573 200
IanBenzMaxim 6:a8c83a2e6fa4 201 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 202
IanBenzMaxim 6:a8c83a2e6fa4 203 /// @name Subviews
IanBenzMaxim 6:a8c83a2e6fa4 204 /// @{
IanBenzMaxim 7:471901a04573 205
IanBenzMaxim 6:a8c83a2e6fa4 206 template <index_type Count> span<element_type, Count> last() const {
IanBenzMaxim 6:a8c83a2e6fa4 207 return this->template subspan<extent - Count, Count>();
IanBenzMaxim 6:a8c83a2e6fa4 208 }
IanBenzMaxim 7:471901a04573 209
IanBenzMaxim 6:a8c83a2e6fa4 210 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 211 };
IanBenzMaxim 6:a8c83a2e6fa4 212
IanBenzMaxim 6:a8c83a2e6fa4 213 template <typename T>
IanBenzMaxim 6:a8c83a2e6fa4 214 class span<T, dynamic_extent>
IanBenzMaxim 6:a8c83a2e6fa4 215 : public detail::span_base<MaximInterface::span, T, dynamic_extent> {
IanBenzMaxim 6:a8c83a2e6fa4 216 typedef detail::span_base<MaximInterface::span, T, dynamic_extent> span_base;
IanBenzMaxim 6:a8c83a2e6fa4 217
IanBenzMaxim 6:a8c83a2e6fa4 218 public:
IanBenzMaxim 6:a8c83a2e6fa4 219 using typename span_base::element_type;
IanBenzMaxim 6:a8c83a2e6fa4 220 using typename span_base::index_type;
IanBenzMaxim 6:a8c83a2e6fa4 221 using typename span_base::pointer;
IanBenzMaxim 6:a8c83a2e6fa4 222 using typename span_base::value_type;
IanBenzMaxim 6:a8c83a2e6fa4 223
IanBenzMaxim 6:a8c83a2e6fa4 224 span() : span_base(NULL), size_(0) {}
IanBenzMaxim 6:a8c83a2e6fa4 225
IanBenzMaxim 6:a8c83a2e6fa4 226 span(pointer data, index_type size) : span_base(data), size_(size) {}
IanBenzMaxim 6:a8c83a2e6fa4 227
IanBenzMaxim 6:a8c83a2e6fa4 228 span(pointer begin, pointer end) : span_base(begin), size_(end - begin) {}
IanBenzMaxim 6:a8c83a2e6fa4 229
IanBenzMaxim 6:a8c83a2e6fa4 230 template <size_t N> span(element_type (&arr)[N]) : span_base(arr), size_(N) {}
IanBenzMaxim 6:a8c83a2e6fa4 231
IanBenzMaxim 6:a8c83a2e6fa4 232 template <size_t N>
IanBenzMaxim 6:a8c83a2e6fa4 233 span(array<value_type, N> & arr) : span_base(arr.data()), size_(N) {}
IanBenzMaxim 6:a8c83a2e6fa4 234
IanBenzMaxim 6:a8c83a2e6fa4 235 template <size_t N>
IanBenzMaxim 6:a8c83a2e6fa4 236 span(const array<value_type, N> & arr) : span_base(arr.data()), size_(N) {}
IanBenzMaxim 6:a8c83a2e6fa4 237
IanBenzMaxim 6:a8c83a2e6fa4 238 template <typename U, ptrdiff_t N>
IanBenzMaxim 6:a8c83a2e6fa4 239 span(const span<U, N> & s) : span_base(s.data()), size_(s.size()) {}
IanBenzMaxim 6:a8c83a2e6fa4 240
IanBenzMaxim 6:a8c83a2e6fa4 241 template <typename Allocator>
IanBenzMaxim 6:a8c83a2e6fa4 242 span(std::vector<value_type, Allocator> & vec)
IanBenzMaxim 6:a8c83a2e6fa4 243 : span_base(vec.empty() ? NULL : &vec.front()), size_(vec.size()) {}
IanBenzMaxim 6:a8c83a2e6fa4 244
IanBenzMaxim 6:a8c83a2e6fa4 245 template <typename Allocator>
IanBenzMaxim 6:a8c83a2e6fa4 246 span(const std::vector<value_type, Allocator> & vec)
IanBenzMaxim 6:a8c83a2e6fa4 247 : span_base(vec.empty() ? NULL : &vec.front()), size_(vec.size()) {}
IanBenzMaxim 6:a8c83a2e6fa4 248
IanBenzMaxim 6:a8c83a2e6fa4 249 template <typename Container>
IanBenzMaxim 6:a8c83a2e6fa4 250 span(with_container_t, Container & cont)
IanBenzMaxim 6:a8c83a2e6fa4 251 : span_base(cont.data()), size_(cont.size()) {}
IanBenzMaxim 6:a8c83a2e6fa4 252
IanBenzMaxim 6:a8c83a2e6fa4 253 template <typename Container>
IanBenzMaxim 6:a8c83a2e6fa4 254 span(with_container_t, const Container & cont)
IanBenzMaxim 6:a8c83a2e6fa4 255 : span_base(cont.data()), size_(cont.size()) {}
IanBenzMaxim 6:a8c83a2e6fa4 256
IanBenzMaxim 6:a8c83a2e6fa4 257 /// @name Observers
IanBenzMaxim 6:a8c83a2e6fa4 258 /// @{
IanBenzMaxim 7:471901a04573 259
IanBenzMaxim 6:a8c83a2e6fa4 260 index_type size() const { return size_; }
IanBenzMaxim 6:a8c83a2e6fa4 261
IanBenzMaxim 6:a8c83a2e6fa4 262 index_type size_bytes() const { return size() * sizeof(element_type); }
IanBenzMaxim 6:a8c83a2e6fa4 263
IanBenzMaxim 6:a8c83a2e6fa4 264 bool empty() const { return size() == 0; }
IanBenzMaxim 7:471901a04573 265
IanBenzMaxim 6:a8c83a2e6fa4 266 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 267
IanBenzMaxim 6:a8c83a2e6fa4 268 /// @name Subviews
IanBenzMaxim 6:a8c83a2e6fa4 269 /// @{
IanBenzMaxim 7:471901a04573 270
IanBenzMaxim 6:a8c83a2e6fa4 271 template <index_type Count> span<element_type, Count> last() const {
IanBenzMaxim 6:a8c83a2e6fa4 272 return span<element_type, Count>(this->data() + (size() - Count), Count);
IanBenzMaxim 6:a8c83a2e6fa4 273 }
IanBenzMaxim 7:471901a04573 274
IanBenzMaxim 6:a8c83a2e6fa4 275 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 276
IanBenzMaxim 6:a8c83a2e6fa4 277 private:
IanBenzMaxim 6:a8c83a2e6fa4 278 index_type size_;
IanBenzMaxim 6:a8c83a2e6fa4 279 };
IanBenzMaxim 6:a8c83a2e6fa4 280
IanBenzMaxim 6:a8c83a2e6fa4 281 template <typename T, ptrdiff_t Extent, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 282 bool operator==(span<T, Extent> lhs, span<U, Extent> rhs) {
IanBenzMaxim 6:a8c83a2e6fa4 283 return lhs.size() == rhs.size() &&
IanBenzMaxim 6:a8c83a2e6fa4 284 std::equal(lhs.begin(), lhs.end(), rhs.begin());
IanBenzMaxim 6:a8c83a2e6fa4 285 }
IanBenzMaxim 6:a8c83a2e6fa4 286
IanBenzMaxim 6:a8c83a2e6fa4 287 template <typename T, ptrdiff_t Extent, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 288 bool operator!=(span<T, Extent> lhs, span<U, Extent> rhs) {
IanBenzMaxim 6:a8c83a2e6fa4 289 return !operator==(lhs, rhs);
IanBenzMaxim 6:a8c83a2e6fa4 290 }
IanBenzMaxim 6:a8c83a2e6fa4 291
IanBenzMaxim 6:a8c83a2e6fa4 292 template <typename T, ptrdiff_t Extent, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 293 bool operator<(span<T, Extent> lhs, span<U, Extent> rhs) {
IanBenzMaxim 6:a8c83a2e6fa4 294 return std::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(),
IanBenzMaxim 6:a8c83a2e6fa4 295 rhs.end());
IanBenzMaxim 6:a8c83a2e6fa4 296 }
IanBenzMaxim 6:a8c83a2e6fa4 297
IanBenzMaxim 6:a8c83a2e6fa4 298 template <typename T, ptrdiff_t Extent, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 299 bool operator>(span<T, Extent> lhs, span<U, Extent> rhs) {
IanBenzMaxim 6:a8c83a2e6fa4 300 return operator<(rhs, lhs);
IanBenzMaxim 6:a8c83a2e6fa4 301 }
IanBenzMaxim 6:a8c83a2e6fa4 302
IanBenzMaxim 6:a8c83a2e6fa4 303 template <typename T, ptrdiff_t Extent, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 304 bool operator<=(span<T, Extent> lhs, span<U, Extent> rhs) {
IanBenzMaxim 6:a8c83a2e6fa4 305 return !operator>(lhs, rhs);
IanBenzMaxim 6:a8c83a2e6fa4 306 }
IanBenzMaxim 6:a8c83a2e6fa4 307
IanBenzMaxim 6:a8c83a2e6fa4 308 template <typename T, ptrdiff_t Extent, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 309 bool operator>=(span<T, Extent> lhs, span<U, Extent> rhs) {
IanBenzMaxim 6:a8c83a2e6fa4 310 return !operator<(lhs, rhs);
IanBenzMaxim 6:a8c83a2e6fa4 311 }
IanBenzMaxim 6:a8c83a2e6fa4 312
IanBenzMaxim 6:a8c83a2e6fa4 313 template <typename T>
IanBenzMaxim 6:a8c83a2e6fa4 314 span<T> make_span(T * data, typename span<T>::index_type size) {
IanBenzMaxim 6:a8c83a2e6fa4 315 return span<T>(data, size);
IanBenzMaxim 6:a8c83a2e6fa4 316 }
IanBenzMaxim 6:a8c83a2e6fa4 317
IanBenzMaxim 6:a8c83a2e6fa4 318 template <typename T> span<T> make_span(T * begin, T * end) {
IanBenzMaxim 6:a8c83a2e6fa4 319 return span<T>(begin, end);
IanBenzMaxim 6:a8c83a2e6fa4 320 }
IanBenzMaxim 6:a8c83a2e6fa4 321
IanBenzMaxim 6:a8c83a2e6fa4 322 template <typename T, size_t N> span<T, N> make_span(T (&arr)[N]) {
IanBenzMaxim 6:a8c83a2e6fa4 323 return span<T, N>(arr);
IanBenzMaxim 6:a8c83a2e6fa4 324 }
IanBenzMaxim 6:a8c83a2e6fa4 325
IanBenzMaxim 6:a8c83a2e6fa4 326 template <typename T, size_t N> span<T, N> make_span(array<T, N> & arr) {
IanBenzMaxim 6:a8c83a2e6fa4 327 return arr;
IanBenzMaxim 6:a8c83a2e6fa4 328 }
IanBenzMaxim 6:a8c83a2e6fa4 329
IanBenzMaxim 6:a8c83a2e6fa4 330 template <typename T, size_t N>
IanBenzMaxim 6:a8c83a2e6fa4 331 span<const T, N> make_span(const array<T, N> & arr) {
IanBenzMaxim 6:a8c83a2e6fa4 332 return arr;
IanBenzMaxim 6:a8c83a2e6fa4 333 }
IanBenzMaxim 6:a8c83a2e6fa4 334
IanBenzMaxim 6:a8c83a2e6fa4 335 template <typename T, typename Allocator>
IanBenzMaxim 6:a8c83a2e6fa4 336 span<T> make_span(std::vector<T, Allocator> & vec) {
IanBenzMaxim 6:a8c83a2e6fa4 337 return vec;
IanBenzMaxim 6:a8c83a2e6fa4 338 }
IanBenzMaxim 6:a8c83a2e6fa4 339
IanBenzMaxim 6:a8c83a2e6fa4 340 template <typename T, typename Allocator>
IanBenzMaxim 6:a8c83a2e6fa4 341 span<const T> make_span(const std::vector<T, Allocator> & vec) {
IanBenzMaxim 6:a8c83a2e6fa4 342 return vec;
IanBenzMaxim 6:a8c83a2e6fa4 343 }
IanBenzMaxim 6:a8c83a2e6fa4 344
IanBenzMaxim 6:a8c83a2e6fa4 345 template <typename Container>
IanBenzMaxim 6:a8c83a2e6fa4 346 span<typename Container::value_type> make_span(with_container_t,
IanBenzMaxim 6:a8c83a2e6fa4 347 Container & cont) {
IanBenzMaxim 6:a8c83a2e6fa4 348 return span<typename Container::value_type>(with_container, cont);
IanBenzMaxim 6:a8c83a2e6fa4 349 }
IanBenzMaxim 6:a8c83a2e6fa4 350
IanBenzMaxim 6:a8c83a2e6fa4 351 template <typename Container>
IanBenzMaxim 6:a8c83a2e6fa4 352 span<const typename Container::value_type> make_span(with_container_t,
IanBenzMaxim 6:a8c83a2e6fa4 353 const Container & cont) {
IanBenzMaxim 6:a8c83a2e6fa4 354 return span<const typename Container::value_type>(with_container, cont);
IanBenzMaxim 6:a8c83a2e6fa4 355 }
IanBenzMaxim 6:a8c83a2e6fa4 356
IanBenzMaxim 6:a8c83a2e6fa4 357 /// Deep copy between static spans of the same size.
IanBenzMaxim 6:a8c83a2e6fa4 358 template <typename T, ptrdiff_t Extent, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 359 typename enable_if<Extent != dynamic_extent>::type copy(span<T, Extent> src,
IanBenzMaxim 6:a8c83a2e6fa4 360 span<U, Extent> dst) {
IanBenzMaxim 6:a8c83a2e6fa4 361 std::copy(src.begin(), src.end(), dst.begin());
IanBenzMaxim 6:a8c83a2e6fa4 362 }
IanBenzMaxim 6:a8c83a2e6fa4 363
IanBenzMaxim 6:a8c83a2e6fa4 364 } // namespace MaximInterface
IanBenzMaxim 6:a8c83a2e6fa4 365
IanBenzMaxim 6:a8c83a2e6fa4 366 #endif