CDC/ECM driver for mbed, based on USBDevice by mbed-official. Uses PicoTCP to access Ethernet USB device. License: GPLv2
Fork of USB_Ethernet by
include/heap.h@2:540f6e142d59, 2013-08-03 (annotated)
- Committer:
- daniele
- Date:
- Sat Aug 03 13:16:14 2013 +0000
- Revision:
- 2:540f6e142d59
Moved to single package
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
daniele | 2:540f6e142d59 | 1 | /********************************************************************* |
daniele | 2:540f6e142d59 | 2 | PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved. |
daniele | 2:540f6e142d59 | 3 | See LICENSE and COPYING for usage. |
daniele | 2:540f6e142d59 | 4 | |
daniele | 2:540f6e142d59 | 5 | *********************************************************************/ |
daniele | 2:540f6e142d59 | 6 | |
daniele | 2:540f6e142d59 | 7 | #define DECLARE_HEAP(type, orderby) \ |
daniele | 2:540f6e142d59 | 8 | struct heap_##type { \ |
daniele | 2:540f6e142d59 | 9 | uint32_t size; \ |
daniele | 2:540f6e142d59 | 10 | uint32_t n; \ |
daniele | 2:540f6e142d59 | 11 | type *top; \ |
daniele | 2:540f6e142d59 | 12 | }; \ |
daniele | 2:540f6e142d59 | 13 | typedef struct heap_##type heap_##type; \ |
daniele | 2:540f6e142d59 | 14 | static inline int heap_insert(struct heap_##type *heap, type *el) \ |
daniele | 2:540f6e142d59 | 15 | { \ |
daniele | 2:540f6e142d59 | 16 | int i; \ |
daniele | 2:540f6e142d59 | 17 | type * newTop; \ |
daniele | 2:540f6e142d59 | 18 | if (++heap->n >= heap->size) { \ |
daniele | 2:540f6e142d59 | 19 | newTop = pico_zalloc((heap->n + 1) * sizeof(type)); \ |
daniele | 2:540f6e142d59 | 20 | if(!newTop) \ |
daniele | 2:540f6e142d59 | 21 | return -1; \ |
daniele | 2:540f6e142d59 | 22 | if (heap->top) {\ |
daniele | 2:540f6e142d59 | 23 | memcpy(newTop,heap->top,heap->n*sizeof(type)); \ |
daniele | 2:540f6e142d59 | 24 | pico_free(heap->top); \ |
daniele | 2:540f6e142d59 | 25 | } \ |
daniele | 2:540f6e142d59 | 26 | heap->top = newTop; \ |
daniele | 2:540f6e142d59 | 27 | heap->size++; \ |
daniele | 2:540f6e142d59 | 28 | } \ |
daniele | 2:540f6e142d59 | 29 | if (heap->n == 1) { \ |
daniele | 2:540f6e142d59 | 30 | memcpy(&heap->top[1], el, sizeof(type)); \ |
daniele | 2:540f6e142d59 | 31 | return 0; \ |
daniele | 2:540f6e142d59 | 32 | } \ |
daniele | 2:540f6e142d59 | 33 | for (i = heap->n; ((i > 1) && (heap->top[i / 2].orderby > el->orderby)); i /= 2) { \ |
daniele | 2:540f6e142d59 | 34 | memcpy(&heap->top[i], &heap->top[i / 2], sizeof(type)); \ |
daniele | 2:540f6e142d59 | 35 | } \ |
daniele | 2:540f6e142d59 | 36 | memcpy(&heap->top[i], el, sizeof(type)); \ |
daniele | 2:540f6e142d59 | 37 | return 0; \ |
daniele | 2:540f6e142d59 | 38 | } \ |
daniele | 2:540f6e142d59 | 39 | static inline int heap_peek(struct heap_##type *heap, type *first) \ |
daniele | 2:540f6e142d59 | 40 | { \ |
daniele | 2:540f6e142d59 | 41 | type *last; \ |
daniele | 2:540f6e142d59 | 42 | int i, child; \ |
daniele | 2:540f6e142d59 | 43 | if(heap->n == 0) { \ |
daniele | 2:540f6e142d59 | 44 | return -1; \ |
daniele | 2:540f6e142d59 | 45 | } \ |
daniele | 2:540f6e142d59 | 46 | memcpy(first, &heap->top[1], sizeof(type)); \ |
daniele | 2:540f6e142d59 | 47 | last = &heap->top[heap->n--]; \ |
daniele | 2:540f6e142d59 | 48 | for(i = 1; (i * 2) <= heap->n; i = child) { \ |
daniele | 2:540f6e142d59 | 49 | child = 2 * i; \ |
daniele | 2:540f6e142d59 | 50 | if ((child != heap->n) && \ |
daniele | 2:540f6e142d59 | 51 | (heap->top[child + 1]).orderby \ |
daniele | 2:540f6e142d59 | 52 | < (heap->top[child]).orderby) \ |
daniele | 2:540f6e142d59 | 53 | child++; \ |
daniele | 2:540f6e142d59 | 54 | if (last->orderby > \ |
daniele | 2:540f6e142d59 | 55 | heap->top[child].orderby) \ |
daniele | 2:540f6e142d59 | 56 | memcpy(&heap->top[i], &heap->top[child],\ |
daniele | 2:540f6e142d59 | 57 | sizeof(type)); \ |
daniele | 2:540f6e142d59 | 58 | else \ |
daniele | 2:540f6e142d59 | 59 | break; \ |
daniele | 2:540f6e142d59 | 60 | } \ |
daniele | 2:540f6e142d59 | 61 | memcpy(&heap->top[i], last, sizeof(type)); \ |
daniele | 2:540f6e142d59 | 62 | return 0; \ |
daniele | 2:540f6e142d59 | 63 | } \ |
daniele | 2:540f6e142d59 | 64 | static inline type *heap_first(heap_##type *heap) \ |
daniele | 2:540f6e142d59 | 65 | { \ |
daniele | 2:540f6e142d59 | 66 | if (heap->n == 0) \ |
daniele | 2:540f6e142d59 | 67 | return NULL; \ |
daniele | 2:540f6e142d59 | 68 | return &heap->top[1]; \ |
daniele | 2:540f6e142d59 | 69 | } \ |
daniele | 2:540f6e142d59 | 70 | static inline heap_##type *heap_init(void) \ |
daniele | 2:540f6e142d59 | 71 | { \ |
daniele | 2:540f6e142d59 | 72 | heap_##type *p = (heap_##type *)pico_zalloc(sizeof(heap_##type)); \ |
daniele | 2:540f6e142d59 | 73 | return p; \ |
daniele | 2:540f6e142d59 | 74 | } \ |
daniele | 2:540f6e142d59 | 75 | static inline void heap_destroy(heap_##type *h) \ |
daniele | 2:540f6e142d59 | 76 | { \ |
daniele | 2:540f6e142d59 | 77 | pico_free(h->top); \ |
daniele | 2:540f6e142d59 | 78 | pico_free(h); \ |
daniele | 2:540f6e142d59 | 79 | } \ |
daniele | 2:540f6e142d59 | 80 | |
daniele | 2:540f6e142d59 | 81 |