⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 array.c

📁 Android 一些工具
💻 C
字号:
/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */#include <cutils/array.h>#include <assert.h>#include <stdlib.h>#include <string.h>#define INITIAL_CAPACITY (4)struct Array {    void** contents;    int size;    int capacity;};Array* arrayCreate() {    return calloc(1, sizeof(struct Array));}void arrayFree(Array* array) {    assert(array != NULL);    // Free internal array.    free(array->contents);    // Free the Array itself.    free(array);}/** Returns 0 if successful, < 0 otherwise.. */static int ensureCapacity(Array* array, int capacity) {    int oldCapacity = array->capacity;    if (capacity > oldCapacity) {        int newCapacity = (oldCapacity == 0) ? INITIAL_CAPACITY : oldCapacity * 2;            // Keep doubling capacity until we surpass necessary capacity.         while (newCapacity < capacity) {            newCapacity *= 2;        }            void** newContents;        if (array->contents == NULL) {            // Allocate new array.            newContents = malloc(newCapacity * sizeof(void*));            if (newContents == NULL) {                return -1;            }        } else {            // Expand existing array.            newContents = realloc(array->contents, sizeof(void*) * newCapacity);            if (newContents == NULL) {                return -1;            }        }        array->capacity = newCapacity;        array->contents = newContents;    }    return 0;}int arrayAdd(Array* array, void* pointer) {    assert(array != NULL);    int size = array->size;    int result = ensureCapacity(array, size + 1);    if (result < 0) {        return result;    }    array->contents[size] = pointer;    array->size++;    return 0;}static inline void checkBounds(Array* array, int index) {    assert(array != NULL);    assert(index < array->size);    assert(index >= 0);}void* arrayGet(Array* array, int index) {    checkBounds(array, index);    return array->contents[index];}void* arrayRemove(Array* array, int index) {    checkBounds(array, index);    void* pointer = array->contents[index];        int newSize = array->size - 1;        // Shift entries left.    if (index != newSize) {        memmove(array->contents + index, array->contents + index + 1,                 (sizeof(void*)) * (newSize - index));    }    array->size = newSize;    return pointer;}void* arraySet(Array* array, int index, void* pointer) {    checkBounds(array, index);    void* old = array->contents[index];    array->contents[index] = pointer;    return old;}int arraySetSize(Array* array, int newSize) {    assert(array != NULL);    assert(newSize >= 0);       int oldSize = array->size;        if (newSize > oldSize) {        // Expand.        int result = ensureCapacity(array, newSize);        if (result < 0) {            return result;        }        // Zero out new entries.        memset(array->contents + sizeof(void*) * oldSize, 0,                sizeof(void*) * (newSize - oldSize));    }    array->size = newSize;    return 0;}int arraySize(Array* array) {    assert(array != NULL);    return array->size;}const void** arrayUnwrap(Array* array) {    return array->contents;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -