1b8e80941Smrg/* 2b8e80941Smrg * Copyright © 2015 Intel Corporation 3b8e80941Smrg * 4b8e80941Smrg * Permission is hereby granted, free of charge, to any person obtaining a 5b8e80941Smrg * copy of this software and associated documentation files (the "Software"), 6b8e80941Smrg * to deal in the Software without restriction, including without limitation 7b8e80941Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8b8e80941Smrg * and/or sell copies of the Software, and to permit persons to whom the 9b8e80941Smrg * Software is furnished to do so, subject to the following conditions: 10b8e80941Smrg * 11b8e80941Smrg * The above copyright notice and this permission notice (including the next 12b8e80941Smrg * paragraph) shall be included in all copies or substantial portions of the 13b8e80941Smrg * Software. 14b8e80941Smrg * 15b8e80941Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16b8e80941Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17b8e80941Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18b8e80941Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19b8e80941Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20b8e80941Smrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21b8e80941Smrg * IN THE SOFTWARE. 22b8e80941Smrg */ 23b8e80941Smrg 24b8e80941Smrg/* 25b8e80941Smrg * u_vector is a vector based queue for storing arbitrary 26b8e80941Smrg * sized arrays of objects without using a linked list. 27b8e80941Smrg */ 28b8e80941Smrg 29b8e80941Smrg#ifndef U_VECTOR_H 30b8e80941Smrg#define U_VECTOR_H 31b8e80941Smrg 32b8e80941Smrg#include <stdint.h> 33b8e80941Smrg#include <stdlib.h> 34b8e80941Smrg#include "util/macros.h" 35b8e80941Smrg 36b8e80941Smrg/* TODO - move to u_math.h - name it better etc */ 37b8e80941Smrgstatic inline uint32_t 38b8e80941Smrgu_align_u32(uint32_t v, uint32_t a) 39b8e80941Smrg{ 40b8e80941Smrg assert(a != 0 && a == (a & -((int32_t) a))); 41b8e80941Smrg return (v + a - 1) & ~(a - 1); 42b8e80941Smrg} 43b8e80941Smrg 44b8e80941Smrgstruct u_vector { 45b8e80941Smrg uint32_t head; 46b8e80941Smrg uint32_t tail; 47b8e80941Smrg uint32_t element_size; 48b8e80941Smrg uint32_t size; 49b8e80941Smrg void *data; 50b8e80941Smrg}; 51b8e80941Smrg 52b8e80941Smrgint u_vector_init(struct u_vector *queue, uint32_t element_size, uint32_t size); 53b8e80941Smrgvoid *u_vector_add(struct u_vector *queue); 54b8e80941Smrgvoid *u_vector_remove(struct u_vector *queue); 55b8e80941Smrg 56b8e80941Smrgstatic inline int 57b8e80941Smrgu_vector_length(struct u_vector *queue) 58b8e80941Smrg{ 59b8e80941Smrg return (queue->head - queue->tail) / queue->element_size; 60b8e80941Smrg} 61b8e80941Smrg 62b8e80941Smrgstatic inline void * 63b8e80941Smrgu_vector_head(struct u_vector *vector) 64b8e80941Smrg{ 65b8e80941Smrg assert(vector->tail < vector->head); 66b8e80941Smrg return (void *)((char *)vector->data + 67b8e80941Smrg ((vector->head - vector->element_size) & 68b8e80941Smrg (vector->size - 1))); 69b8e80941Smrg} 70b8e80941Smrg 71b8e80941Smrgstatic inline void * 72b8e80941Smrgu_vector_tail(struct u_vector *vector) 73b8e80941Smrg{ 74b8e80941Smrg return (void *)((char *)vector->data + (vector->tail & (vector->size - 1))); 75b8e80941Smrg} 76b8e80941Smrg 77b8e80941Smrgstatic inline void 78b8e80941Smrgu_vector_finish(struct u_vector *queue) 79b8e80941Smrg{ 80b8e80941Smrg free(queue->data); 81b8e80941Smrg} 82b8e80941Smrg 83b8e80941Smrg#ifndef __GNUC__ 84b8e80941Smrg#define __builtin_types_compatible_p(t1, t2) 1 85b8e80941Smrg#endif 86b8e80941Smrg 87b8e80941Smrg#define u_vector_foreach(elem, queue) \ 88b8e80941Smrg STATIC_ASSERT(__builtin_types_compatible_p(__typeof__(queue), struct u_vector *)); \ 89b8e80941Smrg for (uint32_t __u_vector_offset = (queue)->tail; \ 90b8e80941Smrg elem = (void *)((char *)(queue)->data + (__u_vector_offset & ((queue)->size - 1))), __u_vector_offset < (queue)->head; \ 91b8e80941Smrg __u_vector_offset += (queue)->element_size) 92b8e80941Smrg 93b8e80941Smrg 94b8e80941Smrg#endif 95b8e80941Smrg 96