[Mesa-dev] [PATCH 09/12] nir: Add a simple growing array data structure
Connor Abbott
cwabbott0 at gmail.com
Wed Apr 22 15:03:46 PDT 2015
I think it would be better to call this "nir_vector" rather than
"nir_array," since this is essentially a poor man's version of
std::vector<>. Is this ok with you?
On Fri, Apr 10, 2015 at 8:48 PM, Jason Ekstrand <jason at jlekstrand.net> wrote:
> ---
> src/glsl/nir/nir_array.h | 96 ++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 96 insertions(+)
> create mode 100644 src/glsl/nir/nir_array.h
>
> diff --git a/src/glsl/nir/nir_array.h b/src/glsl/nir/nir_array.h
> new file mode 100644
> index 0000000..1db4e8c
> --- /dev/null
> +++ b/src/glsl/nir/nir_array.h
> @@ -0,0 +1,96 @@
> +/*
> + * Copyright © 2015 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + *
> + * Authors:
> + * Jason Ekstrand (jason at jlekstrand.net)
> + *
> + */
> +
> +#pragma once
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +typedef struct {
> + void *mem_ctx;
> + size_t size;
> + size_t alloc;
> + void *data;
> +} nir_array;
> +
> +static inline void
> +nir_array_init(nir_array *arr, void *mem_ctx)
> +{
> + arr->mem_ctx = mem_ctx;
> + arr->size = 0;
> + arr->alloc = 0;
> + arr->data = NULL;
> +}
> +
> +static inline void
> +nir_array_fini(nir_array *arr)
> +{
> + if (arr->mem_ctx)
> + ralloc_free(arr->data);
> + else
> + free(arr->data);
> +}
> +
> +#define NIR_ARRAY_INITIAL_SIZE 64
> +
> +/* Increments the size of the array by the given ammount and returns a
> + * pointer to the beginning of the newly added space.
> + */
> +static inline void *
> +nir_array_grow(nir_array *arr, size_t additional)
> +{
> + size_t new_size = arr->size + additional;
> + if (new_size > arr->alloc) {
> + if (arr->alloc == 0)
> + arr->alloc = NIR_ARRAY_INITIAL_SIZE;
> +
> + while (new_size > arr->alloc)
> + arr->alloc *= 2;
> +
> + if (arr->mem_ctx)
> + arr->data = reralloc_size(arr->mem_ctx, arr->data, arr->alloc);
> + else
> + arr->data = realloc(arr->data, arr->alloc);
> + }
> +
> + void *ptr = (void *)((char *)arr->data + arr->size);
> + arr->size = new_size;
> +
> + return ptr;
> +}
> +
> +#define nir_array_add(arr, type, elem) \
> + *(type *)nir_array_grow(arr, sizeof(type)) = (elem)
> +
> +#define nir_array_foreach(arr, type, elem) \
> + for (type *elem = (type *)(arr)->data; \
> + elem < (type *)((char *)(arr)->data + (arr)->size); elem++)
> +
> +#ifdef __cplusplus
> +} /* extern "C" */
> +#endif
> --
> 2.3.5
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list