mbed-os

Dependents:   cobaLCDJoyMotor_Thread odometry_omni_3roda_v3 odometry_omni_3roda_v1 odometry_omni_3roda_v2 ... more

Committer:
be_bryan
Date:
Mon Dec 11 17:54:04 2017 +0000
Revision:
0:b74591d5ab33
motor ++

Who changed what in which revision?

UserRevisionLine numberNew contents of line
be_bryan 0:b74591d5ab33 1 /* mbed Microcontroller Library
be_bryan 0:b74591d5ab33 2 * Copyright (c) 2017-2017 ARM Limited
be_bryan 0:b74591d5ab33 3 *
be_bryan 0:b74591d5ab33 4 * Licensed under the Apache License, Version 2.0 (the "License");
be_bryan 0:b74591d5ab33 5 * you may not use this file except in compliance with the License.
be_bryan 0:b74591d5ab33 6 * You may obtain a copy of the License at
be_bryan 0:b74591d5ab33 7 *
be_bryan 0:b74591d5ab33 8 * http://www.apache.org/licenses/LICENSE-2.0
be_bryan 0:b74591d5ab33 9 *
be_bryan 0:b74591d5ab33 10 * Unless required by applicable law or agreed to in writing, software
be_bryan 0:b74591d5ab33 11 * distributed under the License is distributed on an "AS IS" BASIS,
be_bryan 0:b74591d5ab33 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
be_bryan 0:b74591d5ab33 13 * See the License for the specific language governing permissions and
be_bryan 0:b74591d5ab33 14 * limitations under the License.
be_bryan 0:b74591d5ab33 15 */
be_bryan 0:b74591d5ab33 16
be_bryan 0:b74591d5ab33 17 #ifndef BLE_ARRAY_VIEW_H_
be_bryan 0:b74591d5ab33 18 #define BLE_ARRAY_VIEW_H_
be_bryan 0:b74591d5ab33 19
be_bryan 0:b74591d5ab33 20 #include <stddef.h>
be_bryan 0:b74591d5ab33 21 #include <stdint.h>
be_bryan 0:b74591d5ab33 22
be_bryan 0:b74591d5ab33 23 /**
be_bryan 0:b74591d5ab33 24 * @addtogroup ble
be_bryan 0:b74591d5ab33 25 * @{
be_bryan 0:b74591d5ab33 26 * @addtogroup common
be_bryan 0:b74591d5ab33 27 * @{
be_bryan 0:b74591d5ab33 28 */
be_bryan 0:b74591d5ab33 29
be_bryan 0:b74591d5ab33 30 /**
be_bryan 0:b74591d5ab33 31 * @file
be_bryan 0:b74591d5ab33 32 */
be_bryan 0:b74591d5ab33 33
be_bryan 0:b74591d5ab33 34 namespace ble {
be_bryan 0:b74591d5ab33 35
be_bryan 0:b74591d5ab33 36 /**
be_bryan 0:b74591d5ab33 37 * Immutable view to an array.
be_bryan 0:b74591d5ab33 38 *
be_bryan 0:b74591d5ab33 39 * Array views encapsulate the pointer to an array and its size into a single
be_bryan 0:b74591d5ab33 40 * object; however, it does not manage the lifetime of the array viewed.
be_bryan 0:b74591d5ab33 41 * You can use instances of ArrayView to replace the traditional pair of pointer
be_bryan 0:b74591d5ab33 42 * and size arguments in function calls.
be_bryan 0:b74591d5ab33 43 *
be_bryan 0:b74591d5ab33 44 * You can use the size member function to query the number of elements present
be_bryan 0:b74591d5ab33 45 * in the array, and overloads of the subscript operator allow code using
be_bryan 0:b74591d5ab33 46 * this object to access to the content of the array viewed.
be_bryan 0:b74591d5ab33 47 *
be_bryan 0:b74591d5ab33 48 * @note You can create ArrayView instances with the help of the function
be_bryan 0:b74591d5ab33 49 * template make_ArrayView() and make_const_ArrayView().
be_bryan 0:b74591d5ab33 50 *
be_bryan 0:b74591d5ab33 51 * @tparam T type of objects held by the array.
be_bryan 0:b74591d5ab33 52 */
be_bryan 0:b74591d5ab33 53 template<typename T>
be_bryan 0:b74591d5ab33 54 struct ArrayView {
be_bryan 0:b74591d5ab33 55
be_bryan 0:b74591d5ab33 56 /**
be_bryan 0:b74591d5ab33 57 * Construct a view to an empty array.
be_bryan 0:b74591d5ab33 58 *
be_bryan 0:b74591d5ab33 59 * @post a call to size() will return 0, and data() will return NULL.
be_bryan 0:b74591d5ab33 60 */
be_bryan 0:b74591d5ab33 61 ArrayView() : _array(0), _size(0) { }
be_bryan 0:b74591d5ab33 62
be_bryan 0:b74591d5ab33 63 /**
be_bryan 0:b74591d5ab33 64 * Construct an array view from a pointer to a buffer and its size.
be_bryan 0:b74591d5ab33 65 *
be_bryan 0:b74591d5ab33 66 * @param array_ptr Pointer to the array data
be_bryan 0:b74591d5ab33 67 * @param array_size Number of elements of T present in the array.
be_bryan 0:b74591d5ab33 68 *
be_bryan 0:b74591d5ab33 69 * @post a call to size() will return array_size and data() will return
be_bryan 0:b74591d5ab33 70 * array_tpr.
be_bryan 0:b74591d5ab33 71 */
be_bryan 0:b74591d5ab33 72 ArrayView(T* array_ptr, size_t array_size) :
be_bryan 0:b74591d5ab33 73 _array(array_ptr), _size(array_size) { }
be_bryan 0:b74591d5ab33 74
be_bryan 0:b74591d5ab33 75 /**
be_bryan 0:b74591d5ab33 76 * Construct an array view from the reference to an array.
be_bryan 0:b74591d5ab33 77 *
be_bryan 0:b74591d5ab33 78 * @param elements Reference to the array viewed.
be_bryan 0:b74591d5ab33 79 *
be_bryan 0:b74591d5ab33 80 * @tparam Size Number of elements of T presents in the array.
be_bryan 0:b74591d5ab33 81 *
be_bryan 0:b74591d5ab33 82 * @post a call to size() will return Size, and data() will return
be_bryan 0:b74591d5ab33 83 * a pointer to elements.
be_bryan 0:b74591d5ab33 84 */
be_bryan 0:b74591d5ab33 85 template<size_t Size>
be_bryan 0:b74591d5ab33 86 ArrayView(T (&elements)[Size]):
be_bryan 0:b74591d5ab33 87 _array(elements), _size(Size) { }
be_bryan 0:b74591d5ab33 88
be_bryan 0:b74591d5ab33 89 /**
be_bryan 0:b74591d5ab33 90 * Return the size of the array viewed.
be_bryan 0:b74591d5ab33 91 *
be_bryan 0:b74591d5ab33 92 * @return The number of elements present in the array viewed.
be_bryan 0:b74591d5ab33 93 */
be_bryan 0:b74591d5ab33 94 size_t size() const
be_bryan 0:b74591d5ab33 95 {
be_bryan 0:b74591d5ab33 96 return _size;
be_bryan 0:b74591d5ab33 97 }
be_bryan 0:b74591d5ab33 98
be_bryan 0:b74591d5ab33 99 /**
be_bryan 0:b74591d5ab33 100 * Access to a mutable element of the array.
be_bryan 0:b74591d5ab33 101 *
be_bryan 0:b74591d5ab33 102 * @param index Element index to access.
be_bryan 0:b74591d5ab33 103 *
be_bryan 0:b74591d5ab33 104 * @return A reference to the element at the index specified in input.
be_bryan 0:b74591d5ab33 105 *
be_bryan 0:b74591d5ab33 106 * @pre index shall be less than size().
be_bryan 0:b74591d5ab33 107 */
be_bryan 0:b74591d5ab33 108 T& operator[](size_t index)
be_bryan 0:b74591d5ab33 109 {
be_bryan 0:b74591d5ab33 110 return _array[index];
be_bryan 0:b74591d5ab33 111 }
be_bryan 0:b74591d5ab33 112
be_bryan 0:b74591d5ab33 113 /**
be_bryan 0:b74591d5ab33 114 * Access to an immutable element of the array.
be_bryan 0:b74591d5ab33 115 *
be_bryan 0:b74591d5ab33 116 * @param index Element index to access.
be_bryan 0:b74591d5ab33 117 *
be_bryan 0:b74591d5ab33 118 * @return A const reference to the element at the index specified in input.
be_bryan 0:b74591d5ab33 119 *
be_bryan 0:b74591d5ab33 120 * @pre index shall be less than size().
be_bryan 0:b74591d5ab33 121 */
be_bryan 0:b74591d5ab33 122 const T& operator[](size_t index) const
be_bryan 0:b74591d5ab33 123 {
be_bryan 0:b74591d5ab33 124 return _array[index];
be_bryan 0:b74591d5ab33 125 }
be_bryan 0:b74591d5ab33 126
be_bryan 0:b74591d5ab33 127 /**
be_bryan 0:b74591d5ab33 128 * Get the raw pointer to the array.
be_bryan 0:b74591d5ab33 129 *
be_bryan 0:b74591d5ab33 130 * @return The raw pointer to the array.
be_bryan 0:b74591d5ab33 131 */
be_bryan 0:b74591d5ab33 132 T* data()
be_bryan 0:b74591d5ab33 133 {
be_bryan 0:b74591d5ab33 134 return _array;
be_bryan 0:b74591d5ab33 135 }
be_bryan 0:b74591d5ab33 136
be_bryan 0:b74591d5ab33 137 /**
be_bryan 0:b74591d5ab33 138 * Get the raw const pointer to the array.
be_bryan 0:b74591d5ab33 139 *
be_bryan 0:b74591d5ab33 140 * @return The raw pointer to the array.
be_bryan 0:b74591d5ab33 141 */
be_bryan 0:b74591d5ab33 142 const T* data() const
be_bryan 0:b74591d5ab33 143 {
be_bryan 0:b74591d5ab33 144 return _array;
be_bryan 0:b74591d5ab33 145 }
be_bryan 0:b74591d5ab33 146
be_bryan 0:b74591d5ab33 147 /**
be_bryan 0:b74591d5ab33 148 * Equality operator.
be_bryan 0:b74591d5ab33 149 *
be_bryan 0:b74591d5ab33 150 * @param lhs Left hand side of the binary operation.
be_bryan 0:b74591d5ab33 151 * @param rhs Right hand side of the binary operation.
be_bryan 0:b74591d5ab33 152 *
be_bryan 0:b74591d5ab33 153 * @return True if arrays in input have the same size and the same content
be_bryan 0:b74591d5ab33 154 * and false otherwise.
be_bryan 0:b74591d5ab33 155 */
be_bryan 0:b74591d5ab33 156 friend bool operator==(const ArrayView& lhs, const ArrayView& rhs)
be_bryan 0:b74591d5ab33 157 {
be_bryan 0:b74591d5ab33 158 if (lhs.size() != rhs.size()) {
be_bryan 0:b74591d5ab33 159 return false;
be_bryan 0:b74591d5ab33 160 }
be_bryan 0:b74591d5ab33 161
be_bryan 0:b74591d5ab33 162 if (lhs.data() == rhs.data()) {
be_bryan 0:b74591d5ab33 163 return true;
be_bryan 0:b74591d5ab33 164 }
be_bryan 0:b74591d5ab33 165
be_bryan 0:b74591d5ab33 166 return memcmp(lhs.data(), rhs.data(), lhs.size()) == 0;
be_bryan 0:b74591d5ab33 167 }
be_bryan 0:b74591d5ab33 168
be_bryan 0:b74591d5ab33 169 /**
be_bryan 0:b74591d5ab33 170 * Not equal operator
be_bryan 0:b74591d5ab33 171 *
be_bryan 0:b74591d5ab33 172 * @param lhs Left hand side of the binary operation.
be_bryan 0:b74591d5ab33 173 * @param rhs Right hand side of the binary operation.
be_bryan 0:b74591d5ab33 174 *
be_bryan 0:b74591d5ab33 175 * @return True if arrays in input do not have the same size or the same
be_bryan 0:b74591d5ab33 176 * content and false otherwise.
be_bryan 0:b74591d5ab33 177 */
be_bryan 0:b74591d5ab33 178 friend bool operator!=(const ArrayView& lhs, const ArrayView& rhs)
be_bryan 0:b74591d5ab33 179 {
be_bryan 0:b74591d5ab33 180 return !(lhs == rhs);
be_bryan 0:b74591d5ab33 181 }
be_bryan 0:b74591d5ab33 182
be_bryan 0:b74591d5ab33 183 private:
be_bryan 0:b74591d5ab33 184 T* const _array;
be_bryan 0:b74591d5ab33 185 const size_t _size;
be_bryan 0:b74591d5ab33 186 };
be_bryan 0:b74591d5ab33 187
be_bryan 0:b74591d5ab33 188
be_bryan 0:b74591d5ab33 189 /**
be_bryan 0:b74591d5ab33 190 * Generate an array view from a reference to a C/C++ array.
be_bryan 0:b74591d5ab33 191 *
be_bryan 0:b74591d5ab33 192 * @tparam T Type of elements held in elements.
be_bryan 0:b74591d5ab33 193 * @tparam Size Number of items held in elements.
be_bryan 0:b74591d5ab33 194 *
be_bryan 0:b74591d5ab33 195 * @param elements The reference to the array viewed.
be_bryan 0:b74591d5ab33 196 *
be_bryan 0:b74591d5ab33 197 * @return The ArrayView to elements.
be_bryan 0:b74591d5ab33 198 *
be_bryan 0:b74591d5ab33 199 * @note This helper avoids the typing of template parameter when ArrayView is
be_bryan 0:b74591d5ab33 200 * created 'inline'.
be_bryan 0:b74591d5ab33 201 */
be_bryan 0:b74591d5ab33 202 template<typename T, size_t Size>
be_bryan 0:b74591d5ab33 203 ArrayView<T> make_ArrayView(T (&elements)[Size])
be_bryan 0:b74591d5ab33 204 {
be_bryan 0:b74591d5ab33 205 return ArrayView<T>(elements);
be_bryan 0:b74591d5ab33 206 }
be_bryan 0:b74591d5ab33 207
be_bryan 0:b74591d5ab33 208 /**
be_bryan 0:b74591d5ab33 209 * Generate an array view from a C/C++ pointer and the size of the array.
be_bryan 0:b74591d5ab33 210 *
be_bryan 0:b74591d5ab33 211 * @tparam T Type of elements held in array_ptr.
be_bryan 0:b74591d5ab33 212 *
be_bryan 0:b74591d5ab33 213 * @param array_ptr The pointer to the array to viewed.
be_bryan 0:b74591d5ab33 214 * @param array_size The number of T elements in the array.
be_bryan 0:b74591d5ab33 215 *
be_bryan 0:b74591d5ab33 216 * @return The ArrayView to array_ptr with a size of array_size.
be_bryan 0:b74591d5ab33 217 *
be_bryan 0:b74591d5ab33 218 * @note This helper avoids the typing of template parameter when ArrayView is
be_bryan 0:b74591d5ab33 219 * created 'inline'.
be_bryan 0:b74591d5ab33 220 */
be_bryan 0:b74591d5ab33 221 template<typename T>
be_bryan 0:b74591d5ab33 222 ArrayView<T> make_ArrayView(T* array_ptr, size_t array_size)
be_bryan 0:b74591d5ab33 223 {
be_bryan 0:b74591d5ab33 224 return ArrayView<T>(array_ptr, array_size);
be_bryan 0:b74591d5ab33 225 }
be_bryan 0:b74591d5ab33 226
be_bryan 0:b74591d5ab33 227 /**
be_bryan 0:b74591d5ab33 228 * Generate a const array view from a reference to a C/C++ array.
be_bryan 0:b74591d5ab33 229 *
be_bryan 0:b74591d5ab33 230 * @tparam T Type of elements held in elements.
be_bryan 0:b74591d5ab33 231 * @tparam Size Number of items held in elements.
be_bryan 0:b74591d5ab33 232 *
be_bryan 0:b74591d5ab33 233 * @param elements The array viewed.
be_bryan 0:b74591d5ab33 234 * @return The ArrayView to elements.
be_bryan 0:b74591d5ab33 235 *
be_bryan 0:b74591d5ab33 236 * @note This helper avoids the typing of template parameter when ArrayView is
be_bryan 0:b74591d5ab33 237 * created 'inline'.
be_bryan 0:b74591d5ab33 238 */
be_bryan 0:b74591d5ab33 239 template<typename T, size_t Size>
be_bryan 0:b74591d5ab33 240 ArrayView<const T> make_const_ArrayView(T (&elements)[Size])
be_bryan 0:b74591d5ab33 241 {
be_bryan 0:b74591d5ab33 242 return ArrayView<const T>(elements);
be_bryan 0:b74591d5ab33 243 }
be_bryan 0:b74591d5ab33 244
be_bryan 0:b74591d5ab33 245 /**
be_bryan 0:b74591d5ab33 246 * Generate a const array view from a C/C++ pointer and the size of the array.
be_bryan 0:b74591d5ab33 247 *
be_bryan 0:b74591d5ab33 248 * @tparam T Type of elements held in array_ptr.
be_bryan 0:b74591d5ab33 249 *
be_bryan 0:b74591d5ab33 250 * @param array_ptr The pointer to the array to viewed.
be_bryan 0:b74591d5ab33 251 * @param array_size The number of T elements in the array.
be_bryan 0:b74591d5ab33 252 *
be_bryan 0:b74591d5ab33 253 * @return The ArrayView to array_ptr with a size of array_size.
be_bryan 0:b74591d5ab33 254 *
be_bryan 0:b74591d5ab33 255 * @note This helper avoids the typing of template parameter when ArrayView is
be_bryan 0:b74591d5ab33 256 * created 'inline'.
be_bryan 0:b74591d5ab33 257 */
be_bryan 0:b74591d5ab33 258 template<typename T>
be_bryan 0:b74591d5ab33 259 ArrayView<const T> make_const_ArrayView(T* array_ptr, size_t array_size)
be_bryan 0:b74591d5ab33 260 {
be_bryan 0:b74591d5ab33 261 return ArrayView<const T>(array_ptr, array_size);
be_bryan 0:b74591d5ab33 262 }
be_bryan 0:b74591d5ab33 263
be_bryan 0:b74591d5ab33 264 } // namespace ble
be_bryan 0:b74591d5ab33 265
be_bryan 0:b74591d5ab33 266 /**
be_bryan 0:b74591d5ab33 267 * @}
be_bryan 0:b74591d5ab33 268 * @}
be_bryan 0:b74591d5ab33 269 */
be_bryan 0:b74591d5ab33 270
be_bryan 0:b74591d5ab33 271
be_bryan 0:b74591d5ab33 272 #endif /* BLE_ARRAY_VIEW_H_ */