00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00020 #ifndef flc_genlist_H
00021 #define flc_genlist_H
00022
00023 #include <falcon/setup.h>
00024 #include <falcon/types.h>
00025 #include <falcon/traits.h>
00026 #include <falcon/basealloc.h>
00027
00028 namespace Falcon {
00029
00032 class FALCON_DYN_CLASS ListElement: public BaseAlloc
00033 {
00034 ListElement *m_next;
00035 ListElement *m_previous;
00036 union {
00037 const void *m_data;
00038 uint32 m_iData;
00039 } dt;
00040
00041 ListElement( const void *data )
00042 {
00043 dt.m_data = data;
00044 }
00045
00046 ListElement( uint32 d )
00047 {
00048 dt.m_iData = d;
00049 }
00050
00051 void data( const void *data ) { dt.m_data = data; }
00052 void prev( ListElement *elem ) { m_previous = elem; }
00053 void next( ListElement *elem ) { m_next = elem; }
00054
00055 friend class List;
00056
00057 public:
00058 const void *data() const { return dt.m_data; }
00059
00060 uint32 iData() const { return dt.m_iData; }
00061 void iData( uint32 d ) { dt.m_iData = d; }
00062
00063 ListElement *next() const { return m_next; }
00064 ListElement *prev() const { return m_previous; }
00065 };
00066
00069 class FALCON_DYN_CLASS List: public BaseAlloc
00070 {
00071 ListElement *m_head;
00072 ListElement *m_tail;
00073
00074 void (*m_deletor)( void *);
00075
00076 friend class ListTraits;
00077 public:
00078 List():
00079 m_head(0),
00080 m_tail(0),
00081 m_deletor(0)
00082 {
00083 }
00084
00085 List( void (*deletor)(void *) ):
00086 m_head(0),
00087 m_tail(0),
00088 m_deletor( deletor )
00089 {
00090 }
00091
00092 ~List()
00093 {
00094 clear();
00095 }
00096
00097 ListElement *begin() const { return m_head; }
00098 ListElement *end() const { return m_tail; }
00099 const void *front() const { return m_head->data(); }
00100 const void *back() const { return m_tail->data(); }
00101 bool empty() const { return m_head == 0; }
00102
00103 void pushFront( const void *data );
00104 void pushBack( const void *data );
00105 void pushFront( uint32 data );
00106 void pushBack( uint32 data );
00107 void popFront();
00108 void popBack();
00109 void insertAfter( ListElement *position, const void *data );
00110 void insertBefore( ListElement *position, const void *data );
00111
00112 ListElement *erase( ListElement *position );
00113 uint32 size() const;
00114 void clear();
00115
00116 void deletor( void (*del)( void * ) ) { m_deletor = del; }
00117 };
00118
00119 class ListTraits: public ElementTraits
00120 {
00121 public:
00122 virtual ~ListTraits() {}
00123
00124 virtual uint32 memSize() const;
00125 virtual void init( void *itemZone ) const;
00126 virtual void copy( void *targetZone, const void *sourceZone ) const;
00127 virtual int compare( const void *first, const void *second ) const;
00128 virtual void destroy( void *item ) const;
00129 virtual bool owning() const;
00130 };
00131
00132 namespace traits
00133 {
00134 extern FALCON_DYN_SYM ListTraits &t_List();
00135 }
00136
00137 }
00138
00139 #endif
00140
00141