Azure IoT common library

Dependents:   STM32F746_iothub_client_sample_mqtt f767zi_mqtt iothub_client_sample_amqp iothub_client_sample_http ... more

Committer:
AzureIoTClient
Date:
Thu Oct 04 09:17:16 2018 -0700
Revision:
49:6bb8b9a66642
Parent:
21:b92006c5b9ff
1.2.10

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Azure.IoT Build 0:fa2de1b79154 1 // Copyright (c) Microsoft. All rights reserved.
Azure.IoT Build 0:fa2de1b79154 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
Azure.IoT Build 0:fa2de1b79154 3
Azure.IoT Build 0:fa2de1b79154 4 #include <stdlib.h>
Azure.IoT Build 0:fa2de1b79154 5 #include "azure_c_shared_utility/gballoc.h"
Azure.IoT Build 0:fa2de1b79154 6 #include "azure_c_shared_utility/vector.h"
AzureIoTClient 21:b92006c5b9ff 7 #include "azure_c_shared_utility/optimize_size.h"
AzureIoTClient 19:2e0811512ceb 8 #include "azure_c_shared_utility/xlogging.h"
Azure.IoT Build 0:fa2de1b79154 9
AzureIoTClient 19:2e0811512ceb 10 #include "azure_c_shared_utility/vector_types_internal.h"
Azure.IoT Build 0:fa2de1b79154 11
Azure.IoT Build 0:fa2de1b79154 12 VECTOR_HANDLE VECTOR_create(size_t elementSize)
Azure.IoT Build 0:fa2de1b79154 13 {
Azure.IoT Build 0:fa2de1b79154 14 VECTOR_HANDLE result;
Azure.IoT Build 0:fa2de1b79154 15
AzureIoTClient 19:2e0811512ceb 16 /* Codes_SRS_VECTOR_10_002: [VECTOR_create shall fail and return NULL if elementsize is 0.] */
AzureIoTClient 19:2e0811512ceb 17 if (elementSize == 0)
Azure.IoT Build 0:fa2de1b79154 18 {
AzureIoTClient 19:2e0811512ceb 19 LogError("invalid elementSize(%zd).", elementSize);
Azure.IoT Build 0:fa2de1b79154 20 result = NULL;
Azure.IoT Build 0:fa2de1b79154 21 }
Azure.IoT Build 0:fa2de1b79154 22 else
Azure.IoT Build 0:fa2de1b79154 23 {
AzureIoTClient 19:2e0811512ceb 24 result = (VECTOR*)malloc(sizeof(VECTOR));
AzureIoTClient 19:2e0811512ceb 25 /* Codes_SRS_VECTOR_10_002 : [VECTOR_create shall fail and return NULL if malloc fails.] */
AzureIoTClient 19:2e0811512ceb 26 if (result == NULL)
AzureIoTClient 19:2e0811512ceb 27 {
AzureIoTClient 19:2e0811512ceb 28 LogError("malloc failed.");
AzureIoTClient 19:2e0811512ceb 29 }
AzureIoTClient 19:2e0811512ceb 30 else
AzureIoTClient 19:2e0811512ceb 31 {
AzureIoTClient 19:2e0811512ceb 32 /* Codes_SRS_VECTOR_10_001: [VECTOR_create shall allocate a VECTOR_HANDLE that will contain an empty vector.The size of each element is given with the parameter elementSize.] */
AzureIoTClient 19:2e0811512ceb 33 result->storage = NULL;
AzureIoTClient 19:2e0811512ceb 34 result->count = 0;
AzureIoTClient 19:2e0811512ceb 35 result->elementSize = elementSize;
AzureIoTClient 19:2e0811512ceb 36 }
Azure.IoT Build 0:fa2de1b79154 37 }
Azure.IoT Build 0:fa2de1b79154 38 return result;
Azure.IoT Build 0:fa2de1b79154 39 }
Azure.IoT Build 0:fa2de1b79154 40
Azure.IoT Build 0:fa2de1b79154 41 void VECTOR_destroy(VECTOR_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 42 {
AzureIoTClient 19:2e0811512ceb 43 /* Codes_SRS_VECTOR_10_009: [VECTOR_destroy shall return if the given handle is NULL.] */
AzureIoTClient 19:2e0811512ceb 44 if (handle == NULL)
Azure.IoT Build 0:fa2de1b79154 45 {
AzureIoTClient 19:2e0811512ceb 46 LogError("invalid argument handle(NULL).");
AzureIoTClient 19:2e0811512ceb 47 }
AzureIoTClient 19:2e0811512ceb 48 else
AzureIoTClient 19:2e0811512ceb 49 {
AzureIoTClient 19:2e0811512ceb 50 /* Codes_SRS_VECTOR_10_008: [VECTOR_destroy shall free the given handle and its internal storage.] */
AzureIoTClient 19:2e0811512ceb 51 free(handle->storage);
AzureIoTClient 19:2e0811512ceb 52 free(handle);
Azure.IoT Build 0:fa2de1b79154 53 }
Azure.IoT Build 0:fa2de1b79154 54 }
Azure.IoT Build 0:fa2de1b79154 55
AzureIoTClient 19:2e0811512ceb 56 VECTOR_HANDLE VECTOR_move(VECTOR_HANDLE handle)
AzureIoTClient 19:2e0811512ceb 57 {
AzureIoTClient 19:2e0811512ceb 58 VECTOR_HANDLE result;
AzureIoTClient 19:2e0811512ceb 59 if (handle == NULL)
AzureIoTClient 19:2e0811512ceb 60 {
AzureIoTClient 19:2e0811512ceb 61 /* Codes_SRS_VECTOR_10_005: [VECTOR_move shall fail and return NULL if the given handle is NULL.] */
AzureIoTClient 19:2e0811512ceb 62 LogError("invalid argument - handle(NULL).");
AzureIoTClient 19:2e0811512ceb 63 result = NULL;
AzureIoTClient 19:2e0811512ceb 64 }
AzureIoTClient 19:2e0811512ceb 65 else
AzureIoTClient 19:2e0811512ceb 66 {
AzureIoTClient 19:2e0811512ceb 67 result = (VECTOR*)malloc(sizeof(VECTOR));
AzureIoTClient 19:2e0811512ceb 68 if (result == NULL)
AzureIoTClient 19:2e0811512ceb 69 {
AzureIoTClient 19:2e0811512ceb 70 /* Codes_SRS_VECTOR_10_006: [VECTOR_move shall fail and return NULL if malloc fails.] */
AzureIoTClient 19:2e0811512ceb 71 LogError("malloc failed.");
AzureIoTClient 19:2e0811512ceb 72 }
AzureIoTClient 19:2e0811512ceb 73 else
AzureIoTClient 19:2e0811512ceb 74 {
AzureIoTClient 19:2e0811512ceb 75 /* Codes_SRS_VECTOR_10_004: [VECTOR_move shall allocate a VECTOR_HANDLE and move the data to it from the given handle.] */
AzureIoTClient 19:2e0811512ceb 76 result->count = handle->count;
AzureIoTClient 19:2e0811512ceb 77 result->elementSize = handle->elementSize;
AzureIoTClient 19:2e0811512ceb 78 result->storage = handle->storage;
AzureIoTClient 19:2e0811512ceb 79
AzureIoTClient 19:2e0811512ceb 80 handle->storage = NULL;
AzureIoTClient 19:2e0811512ceb 81 handle->count = 0;
AzureIoTClient 19:2e0811512ceb 82 }
AzureIoTClient 19:2e0811512ceb 83 }
AzureIoTClient 19:2e0811512ceb 84 return result;
AzureIoTClient 19:2e0811512ceb 85 }
AzureIoTClient 19:2e0811512ceb 86
Azure.IoT Build 0:fa2de1b79154 87 /* insertion */
AzureIoTClient 19:2e0811512ceb 88
Azure.IoT Build 0:fa2de1b79154 89 int VECTOR_push_back(VECTOR_HANDLE handle, const void* elements, size_t numElements)
Azure.IoT Build 0:fa2de1b79154 90 {
Azure.IoT Build 0:fa2de1b79154 91 int result;
Azure.IoT Build 0:fa2de1b79154 92 if (handle == NULL || elements == NULL || numElements == 0)
Azure.IoT Build 0:fa2de1b79154 93 {
AzureIoTClient 19:2e0811512ceb 94 /* Codes_SRS_VECTOR_10_011: [VECTOR_push_back shall fail and return non-zero if `handle` is NULL.] */
AzureIoTClient 19:2e0811512ceb 95 /* Codes_SRS_VECTOR_10_034: [VECTOR_push_back shall fail and return non-zero if `elements` is NULL.] */
AzureIoTClient 19:2e0811512ceb 96 /* Codes_SRS_VECTOR_10_035: [VECTOR_push_back shall fail and return non-zero if `numElements` is 0.] */
AzureIoTClient 19:2e0811512ceb 97 LogError("invalid argument - handle(%p), elements(%p), numElements(%zd).", handle, elements, numElements);
AzureIoTClient 21:b92006c5b9ff 98 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 99 }
Azure.IoT Build 0:fa2de1b79154 100 else
Azure.IoT Build 0:fa2de1b79154 101 {
AzureIoTClient 19:2e0811512ceb 102 size_t curSize = handle->elementSize * handle->count;
AzureIoTClient 19:2e0811512ceb 103 size_t appendSize = handle->elementSize * numElements;
Azure.IoT Build 0:fa2de1b79154 104
AzureIoTClient 19:2e0811512ceb 105 void* temp = realloc(handle->storage, curSize + appendSize);
Azure.IoT Build 0:fa2de1b79154 106 if (temp == NULL)
Azure.IoT Build 0:fa2de1b79154 107 {
AzureIoTClient 19:2e0811512ceb 108 /* Codes_SRS_VECTOR_10_012: [VECTOR_push_back shall fail and return non-zero if memory allocation fails.] */
AzureIoTClient 19:2e0811512ceb 109 LogError("realloc failed.");
AzureIoTClient 21:b92006c5b9ff 110 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 111 }
Azure.IoT Build 0:fa2de1b79154 112 else
Azure.IoT Build 0:fa2de1b79154 113 {
AzureIoTClient 19:2e0811512ceb 114 /* Codes_SRS_VECTOR_10_013: [VECTOR_push_back shall append the given elements and return 0 indicating success.] */
AzureIoTClient 19:2e0811512ceb 115 (void)memcpy((unsigned char*)temp + curSize, elements, appendSize);
AzureIoTClient 19:2e0811512ceb 116 handle->storage = temp;
AzureIoTClient 19:2e0811512ceb 117 handle->count += numElements;
Azure.IoT Build 0:fa2de1b79154 118 result = 0;
Azure.IoT Build 0:fa2de1b79154 119 }
Azure.IoT Build 0:fa2de1b79154 120 }
Azure.IoT Build 0:fa2de1b79154 121 return result;
Azure.IoT Build 0:fa2de1b79154 122 }
Azure.IoT Build 0:fa2de1b79154 123
Azure.IoT Build 0:fa2de1b79154 124 /* removal */
AzureIoTClient 19:2e0811512ceb 125
Azure.IoT Build 0:fa2de1b79154 126 void VECTOR_erase(VECTOR_HANDLE handle, void* elements, size_t numElements)
Azure.IoT Build 0:fa2de1b79154 127 {
AzureIoTClient 19:2e0811512ceb 128 if (handle == NULL || elements == NULL || numElements == 0)
Azure.IoT Build 0:fa2de1b79154 129 {
AzureIoTClient 19:2e0811512ceb 130 /* Codes_SRS_VECTOR_10_015: [VECTOR_erase shall return if `handle` is NULL.] */
AzureIoTClient 19:2e0811512ceb 131 /* Codes_SRS_VECTOR_10_038: [VECTOR_erase shall return if `elements` is NULL.] */
AzureIoTClient 19:2e0811512ceb 132 /* Codes_SRS_VECTOR_10_039: [VECTOR_erase shall return if `numElements` is 0.] */
AzureIoTClient 19:2e0811512ceb 133 LogError("invalid argument - handle(%p), elements(%p), numElements(%zd).", handle, elements, numElements);
AzureIoTClient 19:2e0811512ceb 134 }
AzureIoTClient 19:2e0811512ceb 135 else
AzureIoTClient 19:2e0811512ceb 136 {
AzureIoTClient 19:2e0811512ceb 137 if (elements < handle->storage)
Azure.IoT Build 0:fa2de1b79154 138 {
AzureIoTClient 19:2e0811512ceb 139 /* Codes_SRS_VECTOR_10_040: [VECTOR_erase shall return if `elements` is out of bound.] */
AzureIoTClient 19:2e0811512ceb 140 LogError("invalid argument elements(%p) is not a member of this object.", elements);
Azure.IoT Build 0:fa2de1b79154 141 }
Azure.IoT Build 0:fa2de1b79154 142 else
Azure.IoT Build 0:fa2de1b79154 143 {
AzureIoTClient 19:2e0811512ceb 144 ptrdiff_t diff = ((unsigned char*)elements) - ((unsigned char*)handle->storage);
AzureIoTClient 19:2e0811512ceb 145 if ((diff % handle->elementSize) != 0)
AzureIoTClient 19:2e0811512ceb 146 {
AzureIoTClient 19:2e0811512ceb 147 /* Codes_SRS_VECTOR_10_041: [VECTOR_erase shall return if elements is misaligned.] */
AzureIoTClient 19:2e0811512ceb 148 LogError("invalid argument - elements(%p) is misaligned", elements);
AzureIoTClient 19:2e0811512ceb 149 }
AzureIoTClient 19:2e0811512ceb 150 else
AzureIoTClient 19:2e0811512ceb 151 {
AzureIoTClient 19:2e0811512ceb 152 /* Compute the arguments needed for memmove. */
AzureIoTClient 19:2e0811512ceb 153 unsigned char* src = (unsigned char*)elements + (handle->elementSize * numElements);
AzureIoTClient 19:2e0811512ceb 154 unsigned char* srcEnd = (unsigned char*)handle->storage + (handle->elementSize * handle->count);
AzureIoTClient 19:2e0811512ceb 155 if (src > srcEnd)
AzureIoTClient 19:2e0811512ceb 156 {
AzureIoTClient 19:2e0811512ceb 157 /* Codes_SRS_VECTOR_10_040: [VECTOR_erase shall return if `elements` is out of bound.] */
AzureIoTClient 19:2e0811512ceb 158 LogError("invalid argument - numElements(%zd) is out of bound.", numElements);
AzureIoTClient 19:2e0811512ceb 159 }
AzureIoTClient 19:2e0811512ceb 160 else
AzureIoTClient 19:2e0811512ceb 161 {
AzureIoTClient 19:2e0811512ceb 162 /* Codes_SRS_VECTOR_10_014: [VECTOR_erase shall remove the 'numElements' starting at 'elements' and reduce its internal storage.] */
AzureIoTClient 19:2e0811512ceb 163 handle->count -= numElements;
AzureIoTClient 19:2e0811512ceb 164 if (handle->count == 0)
AzureIoTClient 19:2e0811512ceb 165 {
AzureIoTClient 19:2e0811512ceb 166 free(handle->storage);
AzureIoTClient 19:2e0811512ceb 167 handle->storage = NULL;
AzureIoTClient 19:2e0811512ceb 168 }
AzureIoTClient 19:2e0811512ceb 169 else
AzureIoTClient 19:2e0811512ceb 170 {
AzureIoTClient 19:2e0811512ceb 171 void* tmp;
AzureIoTClient 19:2e0811512ceb 172 (void)memmove(elements, src, srcEnd - src);
AzureIoTClient 19:2e0811512ceb 173 tmp = realloc(handle->storage, (handle->elementSize * handle->count));
AzureIoTClient 19:2e0811512ceb 174 if (tmp == NULL)
AzureIoTClient 19:2e0811512ceb 175 {
AzureIoTClient 19:2e0811512ceb 176 LogInfo("realloc failed. Keeping original internal storage pointer.");
AzureIoTClient 19:2e0811512ceb 177 }
AzureIoTClient 19:2e0811512ceb 178 else
AzureIoTClient 19:2e0811512ceb 179 {
AzureIoTClient 19:2e0811512ceb 180 handle->storage = tmp;
AzureIoTClient 19:2e0811512ceb 181 }
AzureIoTClient 19:2e0811512ceb 182 }
AzureIoTClient 19:2e0811512ceb 183 }
AzureIoTClient 19:2e0811512ceb 184 }
Azure.IoT Build 0:fa2de1b79154 185 }
Azure.IoT Build 0:fa2de1b79154 186 }
Azure.IoT Build 0:fa2de1b79154 187 }
Azure.IoT Build 0:fa2de1b79154 188
Azure.IoT Build 0:fa2de1b79154 189 void VECTOR_clear(VECTOR_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 190 {
AzureIoTClient 19:2e0811512ceb 191 /* Codes_SRS_VECTOR_10_017: [VECTOR_clear shall if the object is NULL or empty.] */
AzureIoTClient 19:2e0811512ceb 192 if (handle == NULL)
Azure.IoT Build 0:fa2de1b79154 193 {
AzureIoTClient 19:2e0811512ceb 194 LogError("invalid argument handle(NULL).");
AzureIoTClient 19:2e0811512ceb 195 }
AzureIoTClient 19:2e0811512ceb 196 else
AzureIoTClient 19:2e0811512ceb 197 {
AzureIoTClient 19:2e0811512ceb 198 /* Codes_SRS_VECTOR_10_016: [VECTOR_clear shall remove all elements from the object and release internal storage.] */
AzureIoTClient 19:2e0811512ceb 199 free(handle->storage);
AzureIoTClient 19:2e0811512ceb 200 handle->storage = NULL;
AzureIoTClient 19:2e0811512ceb 201 handle->count = 0;
Azure.IoT Build 0:fa2de1b79154 202 }
Azure.IoT Build 0:fa2de1b79154 203 }
Azure.IoT Build 0:fa2de1b79154 204
Azure.IoT Build 0:fa2de1b79154 205 /* access */
Azure.IoT Build 0:fa2de1b79154 206
AzureIoTClient 19:2e0811512ceb 207 void* VECTOR_element(VECTOR_HANDLE handle, size_t index)
Azure.IoT Build 0:fa2de1b79154 208 {
AzureIoTClient 19:2e0811512ceb 209 void* result;
AzureIoTClient 19:2e0811512ceb 210 if (handle == NULL)
AzureIoTClient 19:2e0811512ceb 211 {
AzureIoTClient 19:2e0811512ceb 212 /* Codes_SRS_VECTOR_10_019: [VECTOR_element shall fail and return NULL if handle is NULL.] */
AzureIoTClient 19:2e0811512ceb 213 LogError("invalid argument handle(NULL).");
AzureIoTClient 19:2e0811512ceb 214 result = NULL;
AzureIoTClient 19:2e0811512ceb 215 }
AzureIoTClient 19:2e0811512ceb 216 else
Azure.IoT Build 0:fa2de1b79154 217 {
AzureIoTClient 19:2e0811512ceb 218 if (index >= handle->count)
Azure.IoT Build 0:fa2de1b79154 219 {
AzureIoTClient 19:2e0811512ceb 220 /* Codes_SRS_VECTOR_10_020: [VECTOR_element shall fail and return NULL if the given index is out of range.] */
AzureIoTClient 19:2e0811512ceb 221 LogError("invalid argument - index(%zd); should be >= 0 and < %zd.", index, handle->count);
AzureIoTClient 19:2e0811512ceb 222 result = NULL;
AzureIoTClient 19:2e0811512ceb 223 }
AzureIoTClient 19:2e0811512ceb 224 else
AzureIoTClient 19:2e0811512ceb 225 {
AzureIoTClient 19:2e0811512ceb 226 /* Codes_SRS_VECTOR_10_018: [VECTOR_element shall return the element at the given index.] */
AzureIoTClient 19:2e0811512ceb 227 result = (unsigned char*)handle->storage + (handle->elementSize * index);
Azure.IoT Build 0:fa2de1b79154 228 }
Azure.IoT Build 0:fa2de1b79154 229 }
Azure.IoT Build 0:fa2de1b79154 230 return result;
Azure.IoT Build 0:fa2de1b79154 231 }
Azure.IoT Build 0:fa2de1b79154 232
AzureIoTClient 19:2e0811512ceb 233 void* VECTOR_front(VECTOR_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 234 {
AzureIoTClient 19:2e0811512ceb 235 void* result;
AzureIoTClient 19:2e0811512ceb 236 if (handle == NULL)
AzureIoTClient 19:2e0811512ceb 237 {
AzureIoTClient 19:2e0811512ceb 238 /* Codes_SRS_VECTOR_10_022: [VECTOR_front shall fail and return NULL if handle is NULL.] */
AzureIoTClient 19:2e0811512ceb 239 LogError("invalid argument handle (NULL).");
AzureIoTClient 19:2e0811512ceb 240 result = NULL;
AzureIoTClient 19:2e0811512ceb 241 }
AzureIoTClient 19:2e0811512ceb 242 else
Azure.IoT Build 0:fa2de1b79154 243 {
AzureIoTClient 19:2e0811512ceb 244 if (handle->count == 0)
AzureIoTClient 19:2e0811512ceb 245 {
AzureIoTClient 19:2e0811512ceb 246 /* Codes_SRS_VECTOR_10_028: [VECTOR_front shall return NULL if the vector is empty.] */
AzureIoTClient 19:2e0811512ceb 247 LogError("vector is empty.");
AzureIoTClient 19:2e0811512ceb 248 result = NULL;
AzureIoTClient 19:2e0811512ceb 249 }
AzureIoTClient 19:2e0811512ceb 250 else
AzureIoTClient 19:2e0811512ceb 251 {
AzureIoTClient 19:2e0811512ceb 252 /* Codes_SRS_VECTOR_10_021: [VECTOR_front shall return a pointer to the element at index 0.] */
AzureIoTClient 19:2e0811512ceb 253 result = handle->storage;
AzureIoTClient 19:2e0811512ceb 254 }
Azure.IoT Build 0:fa2de1b79154 255 }
Azure.IoT Build 0:fa2de1b79154 256 return result;
Azure.IoT Build 0:fa2de1b79154 257 }
Azure.IoT Build 0:fa2de1b79154 258
AzureIoTClient 19:2e0811512ceb 259 void* VECTOR_back(VECTOR_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 260 {
AzureIoTClient 19:2e0811512ceb 261 void* result;
AzureIoTClient 19:2e0811512ceb 262 if (handle == NULL)
AzureIoTClient 19:2e0811512ceb 263 {
AzureIoTClient 19:2e0811512ceb 264 /* Codes_SRS_VECTOR_10_024: [VECTOR_back shall fail and return NULL if handle is NULL.] */
AzureIoTClient 19:2e0811512ceb 265 LogError("invalid argument handle (NULL).");
AzureIoTClient 19:2e0811512ceb 266 result = NULL;
AzureIoTClient 19:2e0811512ceb 267 }
AzureIoTClient 19:2e0811512ceb 268 else
Azure.IoT Build 0:fa2de1b79154 269 {
AzureIoTClient 19:2e0811512ceb 270 if (handle->count == 0)
AzureIoTClient 19:2e0811512ceb 271 {
AzureIoTClient 19:2e0811512ceb 272 /* Codes_SRS_VECTOR_10_029: [VECTOR_back shall return NULL if the vector is empty.] */
AzureIoTClient 19:2e0811512ceb 273 LogError("vector is empty.");
AzureIoTClient 19:2e0811512ceb 274 result = NULL;
AzureIoTClient 19:2e0811512ceb 275 }
AzureIoTClient 19:2e0811512ceb 276 else
AzureIoTClient 19:2e0811512ceb 277 {
AzureIoTClient 19:2e0811512ceb 278 /* Codes_SRS_VECTOR_10_023: [VECTOR_front shall return the last element of the vector.] */
AzureIoTClient 19:2e0811512ceb 279 result = (unsigned char*)handle->storage + (handle->elementSize * (handle->count - 1));
AzureIoTClient 19:2e0811512ceb 280 }
Azure.IoT Build 0:fa2de1b79154 281 }
Azure.IoT Build 0:fa2de1b79154 282 return result;
Azure.IoT Build 0:fa2de1b79154 283 }
Azure.IoT Build 0:fa2de1b79154 284
AzureIoTClient 19:2e0811512ceb 285 void* VECTOR_find_if(VECTOR_HANDLE handle, PREDICATE_FUNCTION pred, const void* value)
Azure.IoT Build 0:fa2de1b79154 286 {
AzureIoTClient 19:2e0811512ceb 287 void* result;
AzureIoTClient 19:2e0811512ceb 288 if (handle == NULL || pred == NULL)
Azure.IoT Build 0:fa2de1b79154 289 {
AzureIoTClient 19:2e0811512ceb 290 /* Codes_SRS_VECTOR_10_030: [VECTOR_find_if shall fail and return NULL if `handle` is NULL.] */
AzureIoTClient 19:2e0811512ceb 291 /* Codes_SRS_VECTOR_10_036: [VECTOR_find_if shall fail and return NULL if `pred` is NULL.] */
AzureIoTClient 19:2e0811512ceb 292 LogError("invalid argument - handle(%p), pred(%p)", handle, pred);
AzureIoTClient 19:2e0811512ceb 293 result = NULL;
AzureIoTClient 19:2e0811512ceb 294 }
AzureIoTClient 19:2e0811512ceb 295 else
AzureIoTClient 19:2e0811512ceb 296 {
AzureIoTClient 19:2e0811512ceb 297 size_t i;
AzureIoTClient 19:2e0811512ceb 298 for (i = 0; i < handle->count; ++i)
Azure.IoT Build 0:fa2de1b79154 299 {
AzureIoTClient 19:2e0811512ceb 300 if (true == pred((unsigned char*)handle->storage + (handle->elementSize * i), value))
Azure.IoT Build 0:fa2de1b79154 301 {
AzureIoTClient 19:2e0811512ceb 302 /* Codes_SRS_VECTOR_10_031: [VECTOR_find_if shall return the first element in the vector that matches `pred`.] */
Azure.IoT Build 0:fa2de1b79154 303 break;
Azure.IoT Build 0:fa2de1b79154 304 }
Azure.IoT Build 0:fa2de1b79154 305 }
AzureIoTClient 19:2e0811512ceb 306
AzureIoTClient 19:2e0811512ceb 307 if (i == handle->count)
AzureIoTClient 19:2e0811512ceb 308 {
AzureIoTClient 19:2e0811512ceb 309 /* Codes_SRS_VECTOR_10_032: [VECTOR_find_if shall return NULL if no matching element is found.] */
AzureIoTClient 19:2e0811512ceb 310 result = NULL;
AzureIoTClient 19:2e0811512ceb 311 }
AzureIoTClient 19:2e0811512ceb 312 else
AzureIoTClient 19:2e0811512ceb 313 {
AzureIoTClient 19:2e0811512ceb 314 /* Codes_SRS_VECTOR_10_031: [VECTOR_find_if shall return the first element in the vector that matches `pred`.]*/
AzureIoTClient 19:2e0811512ceb 315 result = (unsigned char*)handle->storage + (handle->elementSize * i);
AzureIoTClient 19:2e0811512ceb 316 }
Azure.IoT Build 0:fa2de1b79154 317 }
Azure.IoT Build 0:fa2de1b79154 318 return result;
Azure.IoT Build 0:fa2de1b79154 319 }
Azure.IoT Build 0:fa2de1b79154 320
Azure.IoT Build 0:fa2de1b79154 321 /* capacity */
Azure.IoT Build 0:fa2de1b79154 322
AzureIoTClient 19:2e0811512ceb 323 size_t VECTOR_size(VECTOR_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 324 {
AzureIoTClient 19:2e0811512ceb 325 size_t result;
AzureIoTClient 19:2e0811512ceb 326 if (handle == NULL)
Azure.IoT Build 0:fa2de1b79154 327 {
AzureIoTClient 19:2e0811512ceb 328 /* Codes_SRS_VECTOR_10_026: [**VECTOR_size shall return 0 if the given handle is NULL.] */
AzureIoTClient 19:2e0811512ceb 329 LogError("invalid argument handle(NULL).");
AzureIoTClient 19:2e0811512ceb 330 result = 0;
AzureIoTClient 19:2e0811512ceb 331 }
AzureIoTClient 19:2e0811512ceb 332 else
AzureIoTClient 19:2e0811512ceb 333 {
AzureIoTClient 19:2e0811512ceb 334 /* Codes_SRS_VECTOR_10_025: [VECTOR_size shall return the number of elements stored with the given handle.] */
AzureIoTClient 19:2e0811512ceb 335 result = handle->count;
Azure.IoT Build 0:fa2de1b79154 336 }
Azure.IoT Build 0:fa2de1b79154 337 return result;
Azure.IoT Build 0:fa2de1b79154 338 }