13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Memory Pool Library
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * --------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Memory pool heap class.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "dePoolHeap.h"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deInt32.h"
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <stdlib.h>
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <string.h>
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytypedef struct HeapItem_s
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int		priority;
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int		value;
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} HeapItem;
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
363c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDE_INLINE HeapItem HeapItem_create (int priority, int value)
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	HeapItem h;
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	h.priority	= priority;
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	h.value		= value;
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return h;
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
443c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDE_INLINE int HeapItem_cmp (HeapItem a, HeapItem b)
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (a.priority < b.priority)
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return -1;
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (a.priority > b.priority)
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return +1;
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return 0;
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
533c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDE_DECLARE_POOL_HEAP(TestHeap, HeapItem, HeapItem_cmp);
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \internal
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Test heap functionality.
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid dePoolHeap_selfTest (void)
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deMemPool*		pool	= deMemPool_createRoot(DE_NULL, 0);
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestHeap*		heap	= TestHeap_create(pool);
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int				i;
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestHeap_push(heap, HeapItem_create(10, 10));
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestHeap_push(heap, HeapItem_create(0, 10));
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestHeap_push(heap, HeapItem_create(20, 10));
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_TEST_ASSERT(TestHeap_getNumElements(heap) == 3);
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_TEST_ASSERT(TestHeap_popMin(heap).priority == 0);
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_TEST_ASSERT(TestHeap_popMin(heap).priority == 10);
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_TEST_ASSERT(TestHeap_popMin(heap).priority == 20);
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_TEST_ASSERT(TestHeap_getNumElements(heap) == 0);
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	/* Push items -1000..1000 into heap. */
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (i = -1000; i < 1000; i++)
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		/* Dummy alloc to try to break alignments. */
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		deMemPool_alloc(pool, 1);
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestHeap_push(heap, HeapItem_create(i, -i));
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_TEST_ASSERT(TestHeap_getNumElements(heap) == 2000);
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	/* Push items -2500..-3000 into heap. */
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (i = -2501; i >= -3000; i--)
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestHeap_push(heap, HeapItem_create(i, -i));
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_TEST_ASSERT(TestHeap_getNumElements(heap) == 2500);
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	/* Push items 6000..7500 into heap. */
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (i = 6000; i < 7500; i++)
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestHeap_push(heap, HeapItem_create(i, -i));
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_TEST_ASSERT(TestHeap_getNumElements(heap) == 4000);
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	/* Pop -3000..-2500 from heap. */
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (i = -3000; i < -2500; i++)
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		HeapItem h = TestHeap_popMin(heap);
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_TEST_ASSERT(h.priority == i);
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_TEST_ASSERT(h.value == -h.priority);
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_TEST_ASSERT(TestHeap_getNumElements(heap) == 3500);
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	/* Pop -1000..1000 from heap. */
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (i = -1000; i < 1000; i++)
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		HeapItem h = TestHeap_popMin(heap);
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_TEST_ASSERT(h.priority == i);
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_TEST_ASSERT(h.value == -h.priority);
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_TEST_ASSERT(TestHeap_getNumElements(heap) == 1500);
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	/* Pop 6000..7500 from heap. */
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (i = 6000; i < 7500; i++)
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		HeapItem h = TestHeap_popMin(heap);
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_TEST_ASSERT(h.priority == i);
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_TEST_ASSERT(h.value == -h.priority);
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_TEST_ASSERT(TestHeap_getNumElements(heap) == 0);
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deMemPool_destroy(pool);
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
123