Rtos API example

Committer:
marcozecchini
Date:
Sat Feb 23 12:13:36 2019 +0000
Revision:
0:9fca2b23d0ba
final commit

Who changed what in which revision?

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