xref: /aosp_15_r20/external/deqp/framework/delibs/depool/dePoolHeap.c (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Memory Pool Library
3*35238bceSAndroid Build Coastguard Worker  * --------------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief Memory pool heap class.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "dePoolHeap.h"
25*35238bceSAndroid Build Coastguard Worker #include "deInt32.h"
26*35238bceSAndroid Build Coastguard Worker 
27*35238bceSAndroid Build Coastguard Worker #include <stdlib.h>
28*35238bceSAndroid Build Coastguard Worker #include <string.h>
29*35238bceSAndroid Build Coastguard Worker 
30*35238bceSAndroid Build Coastguard Worker typedef struct HeapItem_s
31*35238bceSAndroid Build Coastguard Worker {
32*35238bceSAndroid Build Coastguard Worker     int priority;
33*35238bceSAndroid Build Coastguard Worker     int value;
34*35238bceSAndroid Build Coastguard Worker } HeapItem;
35*35238bceSAndroid Build Coastguard Worker 
HeapItem_create(int priority,int value)36*35238bceSAndroid Build Coastguard Worker DE_INLINE HeapItem HeapItem_create(int priority, int value)
37*35238bceSAndroid Build Coastguard Worker {
38*35238bceSAndroid Build Coastguard Worker     HeapItem h;
39*35238bceSAndroid Build Coastguard Worker     h.priority = priority;
40*35238bceSAndroid Build Coastguard Worker     h.value    = value;
41*35238bceSAndroid Build Coastguard Worker     return h;
42*35238bceSAndroid Build Coastguard Worker }
43*35238bceSAndroid Build Coastguard Worker 
HeapItem_cmp(HeapItem a,HeapItem b)44*35238bceSAndroid Build Coastguard Worker DE_INLINE int HeapItem_cmp(HeapItem a, HeapItem b)
45*35238bceSAndroid Build Coastguard Worker {
46*35238bceSAndroid Build Coastguard Worker     if (a.priority < b.priority)
47*35238bceSAndroid Build Coastguard Worker         return -1;
48*35238bceSAndroid Build Coastguard Worker     if (a.priority > b.priority)
49*35238bceSAndroid Build Coastguard Worker         return +1;
50*35238bceSAndroid Build Coastguard Worker     return 0;
51*35238bceSAndroid Build Coastguard Worker }
52*35238bceSAndroid Build Coastguard Worker 
53*35238bceSAndroid Build Coastguard Worker DE_DECLARE_POOL_HEAP(TestHeap, HeapItem, HeapItem_cmp);
54*35238bceSAndroid Build Coastguard Worker 
55*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
56*35238bceSAndroid Build Coastguard Worker  * \internal
57*35238bceSAndroid Build Coastguard Worker  * \brief Test heap functionality.
58*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
dePoolHeap_selfTest(void)59*35238bceSAndroid Build Coastguard Worker void dePoolHeap_selfTest(void)
60*35238bceSAndroid Build Coastguard Worker {
61*35238bceSAndroid Build Coastguard Worker     deMemPool *pool = deMemPool_createRoot(DE_NULL, 0);
62*35238bceSAndroid Build Coastguard Worker     TestHeap *heap  = TestHeap_create(pool);
63*35238bceSAndroid Build Coastguard Worker     int i;
64*35238bceSAndroid Build Coastguard Worker 
65*35238bceSAndroid Build Coastguard Worker     TestHeap_push(heap, HeapItem_create(10, 10));
66*35238bceSAndroid Build Coastguard Worker     TestHeap_push(heap, HeapItem_create(0, 10));
67*35238bceSAndroid Build Coastguard Worker     TestHeap_push(heap, HeapItem_create(20, 10));
68*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(TestHeap_getNumElements(heap) == 3);
69*35238bceSAndroid Build Coastguard Worker 
70*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(TestHeap_popMin(heap).priority == 0);
71*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(TestHeap_popMin(heap).priority == 10);
72*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(TestHeap_popMin(heap).priority == 20);
73*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(TestHeap_getNumElements(heap) == 0);
74*35238bceSAndroid Build Coastguard Worker 
75*35238bceSAndroid Build Coastguard Worker     /* Push items -1000..1000 into heap. */
76*35238bceSAndroid Build Coastguard Worker     for (i = -1000; i < 1000; i++)
77*35238bceSAndroid Build Coastguard Worker     {
78*35238bceSAndroid Build Coastguard Worker         /* Unused alloc to try to break alignments. */
79*35238bceSAndroid Build Coastguard Worker         deMemPool_alloc(pool, 1);
80*35238bceSAndroid Build Coastguard Worker         TestHeap_push(heap, HeapItem_create(i, -i));
81*35238bceSAndroid Build Coastguard Worker     }
82*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(TestHeap_getNumElements(heap) == 2000);
83*35238bceSAndroid Build Coastguard Worker 
84*35238bceSAndroid Build Coastguard Worker     /* Push items -2500..-3000 into heap. */
85*35238bceSAndroid Build Coastguard Worker     for (i = -2501; i >= -3000; i--)
86*35238bceSAndroid Build Coastguard Worker         TestHeap_push(heap, HeapItem_create(i, -i));
87*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(TestHeap_getNumElements(heap) == 2500);
88*35238bceSAndroid Build Coastguard Worker 
89*35238bceSAndroid Build Coastguard Worker     /* Push items 6000..7500 into heap. */
90*35238bceSAndroid Build Coastguard Worker     for (i = 6000; i < 7500; i++)
91*35238bceSAndroid Build Coastguard Worker         TestHeap_push(heap, HeapItem_create(i, -i));
92*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(TestHeap_getNumElements(heap) == 4000);
93*35238bceSAndroid Build Coastguard Worker 
94*35238bceSAndroid Build Coastguard Worker     /* Pop -3000..-2500 from heap. */
95*35238bceSAndroid Build Coastguard Worker     for (i = -3000; i < -2500; i++)
96*35238bceSAndroid Build Coastguard Worker     {
97*35238bceSAndroid Build Coastguard Worker         HeapItem h = TestHeap_popMin(heap);
98*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(h.priority == i);
99*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(h.value == -h.priority);
100*35238bceSAndroid Build Coastguard Worker     }
101*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(TestHeap_getNumElements(heap) == 3500);
102*35238bceSAndroid Build Coastguard Worker 
103*35238bceSAndroid Build Coastguard Worker     /* Pop -1000..1000 from heap. */
104*35238bceSAndroid Build Coastguard Worker     for (i = -1000; i < 1000; i++)
105*35238bceSAndroid Build Coastguard Worker     {
106*35238bceSAndroid Build Coastguard Worker         HeapItem h = TestHeap_popMin(heap);
107*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(h.priority == i);
108*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(h.value == -h.priority);
109*35238bceSAndroid Build Coastguard Worker     }
110*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(TestHeap_getNumElements(heap) == 1500);
111*35238bceSAndroid Build Coastguard Worker 
112*35238bceSAndroid Build Coastguard Worker     /* Pop 6000..7500 from heap. */
113*35238bceSAndroid Build Coastguard Worker     for (i = 6000; i < 7500; i++)
114*35238bceSAndroid Build Coastguard Worker     {
115*35238bceSAndroid Build Coastguard Worker         HeapItem h = TestHeap_popMin(heap);
116*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(h.priority == i);
117*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(h.value == -h.priority);
118*35238bceSAndroid Build Coastguard Worker     }
119*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(TestHeap_getNumElements(heap) == 0);
120*35238bceSAndroid Build Coastguard Worker 
121*35238bceSAndroid Build Coastguard Worker     deMemPool_destroy(pool);
122*35238bceSAndroid Build Coastguard Worker }
123