Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5564 serge 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