Xin Zhang / azure-iot-c-sdk-f767zi

Dependents:   samplemqtt

Committer:
XinZhangMS
Date:
Thu Aug 23 06:52:14 2018 +0000
Revision:
0:f7f1f0d76dd6
azure-c-sdk for mbed os supporting NUCLEO_F767ZI

Who changed what in which revision?

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