Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
c-utility/src/vector.c@0:f7f1f0d76dd6, 2018-08-23 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |