16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M/////////////////////////////////////////////////////////////////////////////////////// 26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// By downloading, copying, installing or using the software you agree to this license. 66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// If you do not agree to this license, do not download, install, 76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// copy or use the software. 86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Intel License Agreement 116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// For Open Source Computer Vision Library 126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved. 146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners. 156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification, 176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met: 186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * Redistribution's of source code must retain the above copyright notice, 206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this list of conditions and the following disclaimer. 216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * Redistribution's in binary form must reproduce the above copyright notice, 236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this list of conditions and the following disclaimer in the documentation 246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and/or other materials provided with the distribution. 256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * The name of Intel Corporation may not be used to endorse or promote products 276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// derived from this software without specific prior written permission. 286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and 306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied 316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed. 326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct, 336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages 346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services; 356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused 366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability, 376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of 386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage. 396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/ 416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifndef _CV_LIST_H_ 436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define _CV_LIST_H_ 446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <stdlib.h> 466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <assert.h> 476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_FORCE_INLINE CV_INLINE 496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if !defined(_LIST_INLINE) 516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define _LIST_INLINE CV_FORCE_INLINE 526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif /*_LIST_INLINE*/ 536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined DECLARE_LIST 556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined _MSC_VER && _MSC_VER >= 1200 566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn #pragma warning("DECLARE_LIST macro is already defined!") 576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif 586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif /*DECLARE_LIST*/ 596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic const long default_size = 10; 616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic const long default_inc_size = 10; 626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstruct _pos 646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void* m_pos; 666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifdef _DEBUG 676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn struct _list* m_list; 686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif /*_DEBUG*/ 696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}; 706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct _pos CVPOS; 716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstruct _list 726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void* m_buffer; 746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void* m_first_buffer; 756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn long m_buf_size; /* The size of the buffer */ 766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn long m_size; /* The number of elements */ 776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CVPOS m_head; 786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CVPOS m_tail; 796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CVPOS m_head_free; 806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}; 816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct _list _CVLIST; 836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define DECLARE_LIST(type, prefix)\ 856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn /* Basic element of a list*/\ 866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn struct prefix##element_##type\ 876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn struct prefix##element_##type* m_prev;\ 896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn struct prefix##element_##type* m_next;\ 906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn type m_data;\ 916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn };\ 926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn typedef struct prefix##element_##type ELEMENT_##type;\ 936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn /* Initialization and destruction*/\ 946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn _LIST_INLINE _CVLIST* prefix##create_list_##type(long);\ 956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn _LIST_INLINE void prefix##destroy_list_##type(_CVLIST*);\ 966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn /* Access functions*/\ 976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn _LIST_INLINE CVPOS prefix##get_head_pos_##type(_CVLIST*);\ 986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn _LIST_INLINE CVPOS prefix##get_tail_pos_##type(_CVLIST*);\ 996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn _LIST_INLINE type* prefix##get_next_##type(CVPOS*);\ 1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn _LIST_INLINE type* prefix##get_prev_##type(CVPOS*);\ 1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn /* Modification functions*/\ 1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn _LIST_INLINE void prefix##clear_list_##type(_CVLIST*);\ 1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn _LIST_INLINE CVPOS prefix##add_head_##type(_CVLIST*, type*);\ 1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn _LIST_INLINE CVPOS prefix##add_tail_##type(_CVLIST*, type*);\ 1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn _LIST_INLINE void prefix##remove_head_##type(_CVLIST*);\ 1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn _LIST_INLINE void prefix##remove_tail_##type(_CVLIST*);\ 1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn _LIST_INLINE CVPOS prefix##insert_before_##type(_CVLIST*, CVPOS, type*);\ 1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn _LIST_INLINE CVPOS prefix##insert_after_##type(_CVLIST*, CVPOS, type*);\ 1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn _LIST_INLINE void prefix##remove_at_##type(_CVLIST*, CVPOS);\ 1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn _LIST_INLINE void prefix##set_##type(CVPOS, type*);\ 1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn _LIST_INLINE type* prefix##get_##type(CVPOS);\ 1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn /* Statistics functions*/\ 1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn _LIST_INLINE int prefix##get_count_##type(_CVLIST*); 1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* This macro finds a space for a new element and puts in into 'element' pointer */ 1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define INSERT_NEW(element_type, l, element)\ 1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_size++;\ 1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(l->m_head_free.m_pos != NULL)\ 1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn element = (element_type*)(l->m_head_free.m_pos);\ 1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(element->m_next != NULL)\ 1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn element->m_next->m_prev = NULL;\ 1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_head_free.m_pos = element->m_next;\ 1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }\ 1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else\ 1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_head_free.m_pos = NULL;\ 1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }\ 1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }\ 1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else\ 1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(l->m_buf_size < l->m_size && l->m_head_free.m_pos == NULL)\ 1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *(void**)l->m_buffer = cvAlloc(l->m_buf_size*sizeof(element_type) + sizeof(void*));\ 1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_buffer = *(void**)l->m_buffer;\ 1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *(void**)l->m_buffer = NULL;\ 1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn element = (element_type*)((char*)l->m_buffer + sizeof(void*));\ 1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }\ 1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else\ 1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn element = (element_type*)((char*)l->m_buffer + sizeof(void*)) + l->m_size - 1;\ 1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }\ 1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* This macro adds 'element' to the list of free elements*/ 1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define INSERT_FREE(element_type, l, element)\ 1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(l->m_head_free.m_pos != NULL)\ 1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ((element_type*)l->m_head_free.m_pos)->m_prev = element;\ 1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }\ 1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn element->m_next = ((element_type*)l->m_head_free.m_pos);\ 1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_head_free.m_pos = element; 1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*#define GET_FIRST_FREE(l) ((ELEMENT_##type*)(l->m_head_free.m_pos))*/ 1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IMPLEMENT_LIST(type, prefix)\ 1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_CVLIST* prefix##create_list_##type(long size)\ 1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{\ 1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn _CVLIST* pl = (_CVLIST*)cvAlloc(sizeof(_CVLIST));\ 1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn pl->m_buf_size = size > 0 ? size : default_size;\ 1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn pl->m_first_buffer = cvAlloc(pl->m_buf_size*sizeof(ELEMENT_##type) + sizeof(void*));\ 1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn pl->m_buffer = pl->m_first_buffer;\ 1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *(void**)pl->m_buffer = NULL;\ 1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn pl->m_size = 0;\ 1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn pl->m_head.m_pos = NULL;\ 1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn pl->m_tail.m_pos = NULL;\ 1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn pl->m_head_free.m_pos = NULL;\ 1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return pl;\ 1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}\ 1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid prefix##destroy_list_##type(_CVLIST* l)\ 1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{\ 1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void* cur = l->m_first_buffer;\ 1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void* next;\ 1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn while(cur)\ 1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn next = *(void**)cur;\ 1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvFree(&cur);\ 1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cur = next;\ 1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }\ 1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvFree(&l);\ 1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}\ 1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCVPOS prefix##get_head_pos_##type(_CVLIST* l)\ 1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{\ 1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return l->m_head;\ 1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}\ 1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCVPOS prefix##get_tail_pos_##type(_CVLIST* l)\ 1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{\ 1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return l->m_tail;\ 1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}\ 1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntype* prefix##get_next_##type(CVPOS* pos)\ 1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{\ 1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(pos->m_pos)\ 1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ELEMENT_##type* element = (ELEMENT_##type*)(pos->m_pos);\ 1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn pos->m_pos = element->m_next;\ 1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return &element->m_data;\ 1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }\ 2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else\ 2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return NULL;\ 2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }\ 2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}\ 2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntype* prefix##get_prev_##type(CVPOS* pos)\ 2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{\ 2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(pos->m_pos)\ 2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ELEMENT_##type* element = (ELEMENT_##type*)(pos->m_pos);\ 2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn pos->m_pos = element->m_prev;\ 2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return &element->m_data;\ 2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }\ 2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else\ 2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return NULL;\ 2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }\ 2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}\ 2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennint prefix##is_pos_##type(CVPOS pos)\ 2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{\ 2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return !!pos.m_pos;\ 2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}\ 2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid prefix##clear_list_##type(_CVLIST* l)\ 2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{\ 2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_head.m_pos = NULL;\ 2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_tail.m_pos = NULL;\ 2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_size = 0;\ 2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_head_free.m_pos = NULL;\ 2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}\ 2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCVPOS prefix##add_head_##type(_CVLIST* l, type* data)\ 2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{\ 2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ELEMENT_##type* element;\ 2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn INSERT_NEW(ELEMENT_##type, l, element);\ 2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn element->m_prev = NULL;\ 2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn element->m_next = (ELEMENT_##type*)(l->m_head.m_pos);\ 2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn memcpy(&(element->m_data), data, sizeof(*data));\ 2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(element->m_next)\ 2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn element->m_next->m_prev = element;\ 2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }\ 2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else\ 2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_tail.m_pos = element;\ 2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }\ 2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_head.m_pos = element;\ 2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return l->m_head;\ 2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}\ 2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCVPOS prefix##add_tail_##type(_CVLIST* l, type* data)\ 2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{\ 2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ELEMENT_##type* element;\ 2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn INSERT_NEW(ELEMENT_##type, l, element);\ 2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn element->m_next = NULL;\ 2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn element->m_prev = (ELEMENT_##type*)(l->m_tail.m_pos);\ 2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn memcpy(&(element->m_data), data, sizeof(*data));\ 2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(element->m_prev)\ 2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn element->m_prev->m_next = element;\ 2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }\ 2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else\ 2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_head.m_pos = element;\ 2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }\ 2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_tail.m_pos = element;\ 2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return l->m_tail;\ 2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}\ 2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid prefix##remove_head_##type(_CVLIST* l)\ 2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{\ 2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ELEMENT_##type* element = ((ELEMENT_##type*)(l->m_head.m_pos));\ 2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(element->m_next != NULL)\ 2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn element->m_next->m_prev = NULL;\ 2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }\ 2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_head.m_pos = element->m_next;\ 2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn INSERT_FREE(ELEMENT_##type, l, element);\ 2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_size--;\ 2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}\ 2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid prefix##remove_tail_##type(_CVLIST* l)\ 2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{\ 2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ELEMENT_##type* element = ((ELEMENT_##type*)(l->m_tail.m_pos));\ 2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(element->m_prev != NULL)\ 2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn element->m_prev->m_next = NULL;\ 2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }\ 2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_tail.m_pos = element->m_prev;\ 2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn INSERT_FREE(ELEMENT_##type, l, element);\ 2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_size--;\ 2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}\ 2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCVPOS prefix##insert_after_##type(_CVLIST* l, CVPOS pos, type* data)\ 2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{\ 2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ELEMENT_##type* element;\ 2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ELEMENT_##type* before;\ 2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CVPOS newpos;\ 2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn INSERT_NEW(ELEMENT_##type, l, element);\ 2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn memcpy(&(element->m_data), data, sizeof(*data));\ 2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn before = (ELEMENT_##type*)pos.m_pos;\ 2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn element->m_prev = before;\ 2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn element->m_next = before->m_next;\ 2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn before->m_next = element;\ 2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(element->m_next != NULL)\ 2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn element->m_next->m_prev = element;\ 3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else\ 3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_tail.m_pos = element;\ 3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn newpos.m_pos = element;\ 3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return newpos;\ 3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}\ 3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCVPOS prefix##insert_before_##type(_CVLIST* l, CVPOS pos, type* data)\ 3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{\ 3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ELEMENT_##type* element;\ 3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ELEMENT_##type* after;\ 3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CVPOS newpos;\ 3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn INSERT_NEW(ELEMENT_##type, l, element);\ 3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn memcpy(&(element->m_data), data, sizeof(*data));\ 3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn after = (ELEMENT_##type*)pos.m_pos;\ 3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn element->m_prev = after->m_prev;\ 3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn element->m_next = after;\ 3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn after->m_prev = element;\ 3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(element->m_prev != NULL)\ 3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn element->m_prev->m_next = element;\ 3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else\ 3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_head.m_pos = element;\ 3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn newpos.m_pos = element;\ 3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return newpos;\ 3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}\ 3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid prefix##remove_at_##type(_CVLIST* l, CVPOS pos)\ 3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{\ 3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ELEMENT_##type* element = ((ELEMENT_##type*)pos.m_pos);\ 3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(element->m_prev != NULL)\ 3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn element->m_prev->m_next = element->m_next;\ 3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }\ 3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else\ 3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_head.m_pos = element->m_next;\ 3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }\ 3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(element->m_next != NULL)\ 3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn element->m_next->m_prev = element->m_prev;\ 3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }\ 3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else\ 3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {\ 3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_tail.m_pos = element->m_prev;\ 3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }\ 3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn INSERT_FREE(ELEMENT_##type, l, element);\ 3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn l->m_size--;\ 3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}\ 3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid prefix##set_##type(CVPOS pos, type* data)\ 3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{\ 3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ELEMENT_##type* element = ((ELEMENT_##type*)(pos.m_pos));\ 3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn memcpy(&(element->m_data), data, sizeof(data));\ 3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}\ 3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntype* prefix##get_##type(CVPOS pos)\ 3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{\ 3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ELEMENT_##type* element = ((ELEMENT_##type*)(pos.m_pos));\ 3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return &(element->m_data);\ 3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}\ 3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennint prefix##get_count_##type(_CVLIST* list)\ 3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{\ 3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return list->m_size;\ 3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define DECLARE_AND_IMPLEMENT_LIST(type, prefix)\ 3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn DECLARE_LIST(type, prefix)\ 3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IMPLEMENT_LIST(type, prefix) 3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct __index 3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int value; 3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn float rho, theta; 3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_index; 3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennDECLARE_LIST( _index, h_ ) 3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif/*_CV_LIST_H_*/ 374