25 wassertrv(size
> 0, NULL
);
27 bag
= wmalloc(sizeof(WMBag
));
29 bag
->items
= wmalloc(sizeof(void*) * size
);
39 WMGetBagItemCount(WMBag
*bag
)
47 WMAppendBag(WMBag
*bag
, WMBag
*appendedBag
)
49 bag
->items
= wrealloc(bag
->items
,
50 sizeof(void*) * (bag
->size
+appendedBag
->count
));
52 memcpy(bag
->items
+ bag
->count
, appendedBag
->items
, appendedBag
->count
);
54 bag
->count
+= appendedBag
->count
;
60 WMPutInBag(WMBag
*bag
, void *item
)
62 WMInsertInBag(bag
, bag
->count
, item
);
68 WMInsertInBag(WMBag
*bag
, int index
, void *item
)
70 if (bag
->count
== bag
->size
) {
72 bag
->items
= wrealloc(bag
->items
, sizeof(void*) * bag
->size
);
75 bag
->items
[bag
->count
++] = item
;
80 WMGetFirstInBag(WMBag
*bag
, void *item
)
84 for (i
= 0; i
< bag
->count
; i
++) {
85 if (bag
->items
[i
] == item
) {
94 WMGetLastInBag(WMBag
*bag
, void *item
)
98 for (i
= bag
->count
-1; i
>= 0; i
--) {
99 if (bag
->items
[i
] == item
) {
108 WMRemoveFromBag(WMBag
*bag
, void *item
)
112 i
= WMGetFirstInBag(bag
, item
);
114 WMDeleteFromBag(bag
, i
);
121 WMDeleteFromBag(WMBag
*bag
, int index
)
123 if (index
< 0 || index
>= bag
->count
)
126 if (index
< bag
->count
-1) {
127 memmove(&bag
->items
[index
], &bag
->items
[index
+ 1],
128 (bag
->count
- index
- 1) * sizeof(void*));
135 WMGetFromBag(WMBag
*bag
, int index
)
137 if (index
< 0 || index
>= bag
->count
) {
141 return bag
->items
[index
];
146 WMCountInBag(WMBag
*bag
, void *item
)
150 for (j
= 0, i
= 0; j
< bag
->count
; j
++) {
151 if (bag
->items
[j
] == item
)
160 WMSortBag(WMBag
*bag
, int (*comparer
)(void*, void*))
162 qsort(bag
->items
, bag
->count
, sizeof(void*), comparer
);
168 WMFreeBag(WMBag
*bag
)
176 WMEmptyBag(WMBag
*bag
)
184 WMMapBag(WMBag
*bag
, void *(*function
)(void *))
187 WMBag
*new = WMCreateBag(bag
->size
);
189 for (i
= 0; i
< bag
->count
; i
++) {
190 WMPutInBag(new, (*function
)(bag
->items
[i
]));