Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright © 2015 Intel Corporation
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a
  5.  * copy of this software and associated documentation files (the "Software"),
  6.  * to deal in the Software without restriction, including without limitation
  7.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8.  * and/or sell copies of the Software, and to permit persons to whom the
  9.  * Software is furnished to do so, subject to the following conditions:
  10.  *
  11.  * The above copyright notice and this permission notice (including the next
  12.  * paragraph) shall be included in all copies or substantial portions of the
  13.  * Software.
  14.  *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  21.  * IN THE SOFTWARE.
  22.  *
  23.  * Authors:
  24.  *    Jason Ekstrand (jason@jlekstrand.net)
  25.  *
  26.  */
  27.  
  28. #pragma once
  29.  
  30. #ifdef __cplusplus
  31. extern "C" {
  32. #endif
  33.  
  34. typedef struct {
  35.    void *mem_ctx;
  36.    size_t size;
  37.    size_t alloc;
  38.    void *data;
  39. } nir_array;
  40.  
  41. static inline void
  42. nir_array_init(nir_array *arr, void *mem_ctx)
  43. {
  44.    arr->mem_ctx = mem_ctx;
  45.    arr->size = 0;
  46.    arr->alloc = 0;
  47.    arr->data = NULL;
  48. }
  49.  
  50. static inline void
  51. nir_array_fini(nir_array *arr)
  52. {
  53.    if (arr->mem_ctx)
  54.       ralloc_free(arr->data);
  55.    else
  56.       free(arr->data);
  57. }
  58.  
  59. #define NIR_ARRAY_INITIAL_SIZE 64
  60.  
  61. /* Increments the size of the array by the given ammount and returns a
  62.  * pointer to the beginning of the newly added space.
  63.  */
  64. static inline void *
  65. nir_array_grow(nir_array *arr, size_t additional)
  66. {
  67.    size_t new_size = arr->size + additional;
  68.    if (new_size > arr->alloc) {
  69.       if (arr->alloc == 0)
  70.          arr->alloc = NIR_ARRAY_INITIAL_SIZE;
  71.  
  72.       while (new_size > arr->alloc)
  73.          arr->alloc *= 2;
  74.  
  75.       if (arr->mem_ctx)
  76.          arr->data = reralloc_size(arr->mem_ctx, arr->data, arr->alloc);
  77.       else
  78.          arr->data = realloc(arr->data, arr->alloc);
  79.    }
  80.  
  81.    void *ptr = (void *)((char *)arr->data + arr->size);
  82.    arr->size = new_size;
  83.  
  84.    return ptr;
  85. }
  86.  
  87. #define nir_array_add(arr, type, elem) \
  88.    *(type *)nir_array_grow(arr, sizeof(type)) = (elem)
  89.  
  90. #define nir_array_foreach(arr, type, elem) \
  91.    for (type *elem = (type *)(arr)->data; \
  92.         elem < (type *)((char *)(arr)->data + (arr)->size); elem++)
  93.  
  94. #ifdef __cplusplus
  95. } /* extern "C" */
  96. #endif
  97.