xref: /haiku/headers/os/support/List.h (revision 29e8fa5922c9f9a5eb09a2fcc92e7fb321d4cc59)
1087882c2SAxel Dörfler /*
2*29e8fa59SJohn Scipione  * Copyright 2001-2009 Haiku, Inc. All rights reserved.
3087882c2SAxel Dörfler  * Distributed under the terms of the MIT License.
4087882c2SAxel Dörfler  */
59bf6d51bSStefano Ceccherini #ifndef _BE_LIST_H
69bf6d51bSStefano Ceccherini #define _BE_LIST_H
752a38012Sejakowatz 
8087882c2SAxel Dörfler 
952a38012Sejakowatz #include <SupportDefs.h>
1052a38012Sejakowatz 
119bf6d51bSStefano Ceccherini 
12087882c2SAxel Dörfler class BList {
1352a38012Sejakowatz public:
1452a38012Sejakowatz 								BList(int32 count = 20);
15*29e8fa59SJohn Scipione 								BList(const BList& other);
1652a38012Sejakowatz 	virtual						~BList();
1752a38012Sejakowatz 
18b0850e9bSStephan Aßmus 			BList&				operator=(const BList& other);
19b0850e9bSStephan Aßmus 			bool				operator==(const BList& other) const;
20b0850e9bSStephan Aßmus 			bool				operator!=(const BList& other) const;
219bf6d51bSStefano Ceccherini 
22*29e8fa59SJohn Scipione 	// Adding and removing items
2352a38012Sejakowatz 			bool				AddItem(void* item, int32 index);
2452a38012Sejakowatz 			bool				AddItem(void* item);
259ecf9d1cSIngo Weinhold 			bool				AddList(const BList* list, int32 index);
269ecf9d1cSIngo Weinhold 			bool				AddList(const BList* list);
27b0850e9bSStephan Aßmus 
2852a38012Sejakowatz 			bool				RemoveItem(void* item);
2952a38012Sejakowatz 			void*				RemoveItem(int32 index);
3052a38012Sejakowatz 			bool				RemoveItems(int32 index, int32 count);
31*29e8fa59SJohn Scipione 			bool				ReplaceItem(int32 index, void* item);
32b0850e9bSStephan Aßmus 
339bf6d51bSStefano Ceccherini 			void				MakeEmpty();
3452a38012Sejakowatz 
35087882c2SAxel Dörfler 	// Reorder items
36b0850e9bSStephan Aßmus 			void				SortItems(int (*compareFunc)(const void*,
37b0850e9bSStephan Aßmus 									const void*));
389bf6d51bSStefano Ceccherini 			bool				SwapItems(int32 indexA, int32 indexB);
39*29e8fa59SJohn Scipione 			bool				MoveItem(int32 from, int32 to);
409bf6d51bSStefano Ceccherini 
41087882c2SAxel Dörfler 	// Retrieve items
429bf6d51bSStefano Ceccherini 			void*				ItemAt(int32 index) const;
439bf6d51bSStefano Ceccherini 			void*				FirstItem() const;
44b0850e9bSStephan Aßmus 			void*				ItemAtFast(int32 index) const;
45087882c2SAxel Dörfler 									// does not check the array bounds!
469bf6d51bSStefano Ceccherini 
479bf6d51bSStefano Ceccherini 			void*				LastItem() const;
489bf6d51bSStefano Ceccherini 			void*				Items() const;
499bf6d51bSStefano Ceccherini 
50087882c2SAxel Dörfler 	// Query
519bf6d51bSStefano Ceccherini 			bool				HasItem(void* item) const;
52b0850e9bSStephan Aßmus 			bool				HasItem(const void* item) const;
539bf6d51bSStefano Ceccherini 			int32				IndexOf(void* item) const;
54b0850e9bSStephan Aßmus 			int32				IndexOf(const void* item) const;
559bf6d51bSStefano Ceccherini 			int32				CountItems() const;
569bf6d51bSStefano Ceccherini 			bool				IsEmpty() const;
579bf6d51bSStefano Ceccherini 
58087882c2SAxel Dörfler 	// Iteration
59087882c2SAxel Dörfler 			void				DoForEach(bool (*func)(void* item));
60b0850e9bSStephan Aßmus 			void				DoForEach(bool (*func)(void* item,
61b0850e9bSStephan Aßmus 									void* arg2), void* arg2);
6252a38012Sejakowatz 
6352a38012Sejakowatz private:
6452a38012Sejakowatz 	virtual	void				_ReservedList1();
6552a38012Sejakowatz 	virtual	void				_ReservedList2();
6652a38012Sejakowatz 
670c8bdbafSRene Gollent 			bool				_ResizeArray(int32 count);
68b0850e9bSStephan Aßmus 
6952a38012Sejakowatz private:
7052a38012Sejakowatz 			void**				fObjectList;
710c8bdbafSRene Gollent 			int32				fPhysicalSize;
7252a38012Sejakowatz 			int32				fItemCount;
7352a38012Sejakowatz 			int32				fBlockSize;
740c8bdbafSRene Gollent 			int32				fResizeThreshold;
75b0850e9bSStephan Aßmus 
760c8bdbafSRene Gollent 			uint32				_reserved[1];
7752a38012Sejakowatz };
7852a38012Sejakowatz 
79*29e8fa59SJohn Scipione 
809bf6d51bSStefano Ceccherini #endif // _BE_LIST_H
81