⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 list.h

📁 This Source-Navigator, an IDE for C/C++/Fortran/Java/Tcl/PHP/Python and a host of other languages.
💻 H
字号:
// $Header: /cvsroot/sourcenav/src/snavigator/demo/c++_demo/glish/include/Glish/List.h,v 1.1.1.1 2002/04/18 23:35:27 mdejong Exp $#ifndef list_h#define list_h// BaseList.h --//	Interface for class BaseList, current implementation is as an//	array of ent's.  This implementation was chosen to optimize//	getting to the ent's rather than inserting and deleting.//	Also pairs of append's and get's act like push's and pop's//	and are very efficient.  The only really expensive operations//	are inserting (but not appending), which requires pushing every//	element up, and resizing the list, which involves getting new space//	and moving the data.  Resizing occurs automatically when inserting//	more elements than the list can currently hold.  Automatic//	resizing is done one "chunk_size" of elements at a time and//	always increases the size of the list.  Resizing to zero//	(or to less than the current value of num_entries)//	will decrease the size of the list to the current number of//	elements.  Resize returns the new max_entries.////	Entries must be either a pointer to the data or nonzero data with//	sizeof(data) <= sizeof(void*).#include <generic.h>#include <stdarg.h>typedef void* ent;typedef void (*PFC)(char*);	// mostly for error handling     class BaseList {    public:	~BaseList()		{ clear(); }	void clear();		// remove all entries	int length() const	{ return num_entries; }	int resize(int = 0);	// 0 => size to fit current number of entries    protected:	BaseList(int = 0, PFC = 0);	BaseList(BaseList&);	void insert(ent);	// add at head of list	void append(ent);	// add to end of list	ent remove(ent);	// delete entry from list	ent remove_nth(int);	// delete nth entry from list	ent get();		// return and remove ent at end of list	// Return 0 if ent is not in the list, ent otherwise.	ent is_member(ent) const;	PFC set_error_handler(PFC = 0);	//reset to default handler if null arg	ent replace(int, ent);	// replace entry #i with a new value	// return nth ent of list (do not remove).	ent operator[](int) const;	void operator=(BaseList&);	ent* entry;	int chunk_size;		// increase size by this amount when necessary	int max_entries;	int num_entries;	PFC error_handler;	friend class BaseListIterator;	};class BaseListIterator {    public:	BaseListIterator(BaseList& l)	{ lp = &l; pos = 0; }	void reset()			{ pos = 0; }	ent operator()()			{		return (pos < lp->num_entries) ? lp->entry[pos++] : 0;		}    protected:	BaseList* lp;	int pos;	};// List.h -- interface for class List//	Use:	to get a list of pointers to class foo you should://		1) typedef foo* Pfoo; (the macros don't like explicit pointers)//		2) declare(List,Pfoo); (declare an interest in lists of Pfoo's)//		3) variables are declared like://				List(Pfoo) bar;	(bar is of type list of Pfoo's)//				ListIterator(Pfoo) next(bar);// For lists of "type".// InterViews 3.0 defines List ...#undef List#define List(type)			name2(type,List)#define ListIterator(type)	name2(type,ListIterator)// For lists of pointers to "type"#define PList(type)			name2(type,PList)#define PListIterator(type)	name2(type,PListIterator)#define Listdeclare(type)						\struct List(type) : BaseList						\	{								\	List(type)(type ...);						\	List(type)(PFC eh =0) : BaseList(0,eh) {}			\	List(type)(int sz, PFC eh =0) : BaseList(sz,eh) {}		\	List(type)(List(type)& l) : BaseList((BaseList&)l) {}		\									\	void operator=(List(type)& l)					\		{ BaseList::operator=((BaseList&)l); }			\	void insert(type a)	{ BaseList::insert(ent(a)); }		\	void append(type a)	{ BaseList::append(ent(a)); }		\	type remove(type a)						\			{ return type(BaseList::remove(ent(a))); }	\	type remove_nth(int n)	{ return type(BaseList::remove_nth(n)); }\	type get()		{ return type(BaseList::get()); }	\	type replace(int i, type new_type)				\		{ return type(BaseList::replace(i,ent(new_type))); }	\	type is_member(type e)						\		{ return type(BaseList::is_member(ent(e))); }		\	PFC set_error_handler(PFC eh =0)				\		{ return BaseList::set_error_handler(eh); }		\									\	type operator[](int i) const					\		{ return type(BaseList::operator[](i)); }		\	};								\									\struct ListIterator(type) : BaseListIterator				\	{								\	ListIterator(type)(List(type)& l)				\		: BaseListIterator((BaseList&)l) {}			\	void reset()		{ BaseListIterator::reset(); }		\	type operator()()						\		{ return type(BaseListIterator::operator()()); }	\	}#define Listimplement(type)						\List(type)::List(type)(type e1 ...) : BaseList()			\	{								\	append(e1);							\	va_list ap;							\	va_start(ap,e1);						\	for ( type e = va_arg(ap,type); e != 0; e = va_arg(ap,type) )	\		append(e);						\	resize();							\	}#define PListdeclare(type)						\struct PList(type) : BaseList						\	{								\	PList(type)(type* ...);						\	PList(type)(PFC eh =0) : BaseList(0,eh) {}			\	PList(type)(int sz, PFC eh =0) : BaseList(sz,eh) {}		\	PList(type)(PList(type)& l) : BaseList((BaseList&)l) {}		\									\	void operator=(PList(type)& l)					\		{ BaseList::operator=((BaseList&)l); }			\	void insert(type* a)	{ BaseList::insert(ent(a)); }		\	void append(type* a)	{ BaseList::append(ent(a)); }		\	type* remove(type* a)						\		{ return (type*)BaseList::remove(ent(a)); }		\	type* remove_nth(int n)	{ return (type*)(BaseList::remove_nth(n)); }\	type* get()		{ return (type*)BaseList::get(); }	\	type* operator[](int i) const					\		{ return (type*)(BaseList::operator[](i)); }		\	type* replace(int i, type* new_type)				\		{ return (type*)BaseList::replace(i,ent(new_type)); }	\	type* is_member(type* e)					\		{ return (type*)BaseList::is_member(ent(e)); }		\	PFC set_error_handler(PFC eh =0)				\		{ return BaseList::set_error_handler(eh); }		\	};								\									\struct PListIterator(type) : BaseListIterator				\	{								\	PListIterator(type)(PList(type)& l)				\		: BaseListIterator((BaseList&)l) {}			\	void reset()		{ BaseListIterator::reset(); }		\	type* operator()()						\		{ return (type*)(BaseListIterator::operator()()); }	\	}#define PListimplement(type)						\PList(type)::PList(type)(type* ep1 ...) : BaseList()			\	{								\	append(ep1);							\	va_list ap;							\	va_start(ap,ep1);						\	for ( type* ep = va_arg(ap,type*); ep != 0;			\	      ep = va_arg(ap,type*) )					\		append(ep);						\	resize();							\	}// Popular type of list: list of strings.declare(PList,char);typedef PList(char) name_list;#endif /* list_h */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -