123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- #include "mem_block.h"
- class ptr_list
- {
- private:
- mem_block_t<void *> data;
- int count;
-
- protected:
- void * get_raw_ptr() {return data.get_ptr();}
-
- public:
- ptr_list() {count=0;}
- int get_count() const {return count;}
- void * get_item(int n) const
- {
- if (n>=0 && n<count) return data[n];
- else return 0;
- }
- int add_item(void * ptr)//returns index
- {
- count++;
- data.check_size(count);
- data[count-1] = ptr;
- return count-1;
- }
- int find_item(void * ptr)//returns index, -1 if not found
- {
- int n;
- for(n=0;n<count;n++)
- {
- if (data[n] == ptr) return n;
- }
- return -1;
- }
- bool have_item(void * ptr) {return find_item(ptr)>=0;}
- void remove_item(void * ptr)
- {
- int idx = find_item(ptr);
- if (idx>=0) remove_by_idx(idx);
- }
- void * remove_by_idx(int idx)
- {
- void * ptr = 0;
- if (idx>=0 && idx<count)
- {
- ptr = data[idx];
- int n;
- count--;
- for(n=idx;n<count;n++)
- {
- data[n] = data[n+1];
- }
- }
- return ptr;
- }
- void remove_all()
- {
- count=0;
- }
- int insert_item(void * ptr,int idx) //returns index
- {
- if (idx>count || idx<0) idx = count;
-
- count++;
- data.check_size(count);
- int n;
- for(n=count-1;n>idx;n--)
- {
- data[n]=data[n-1];
- }
- data[idx] = ptr;
- return idx;
- }
-
- void * operator[](int idx) const {return get_item(idx);}
- };
- template<class T>
- class ptr_list_t : protected ptr_list
- {
- public:
- int get_count() const {return ptr_list::get_count();}
- T * get_item(int n) const {return static_cast<T*>(ptr_list::get_item(n));}
- int add_item(T * ptr) {return ptr_list::add_item(static_cast<void*>(ptr));}
- int find_item(T * ptr) {return ptr_list::find_item(static_cast<void*>(ptr));}
- bool have_item(T * ptr) {return ptr_list::have_item(static_cast<void*>(ptr));}
- void remove_item(T * ptr) {ptr_list::remove_item(static_cast<void*>(ptr));}
- T * remove_by_idx(int idx) {return static_cast<T*>(ptr_list::remove_by_idx(idx));}
- void remove_all() {ptr_list::remove_all();}
- void * operator[](int idx) const {return get_item(idx);}
- int insert_item(int idx,T* ptr) {return ptr_list::insert_item(idx,static_cast<void*>(ptr));}
- void delete_item(T * ptr)
- {
- remove_item(ptr);
- delete ptr;
- }
- void delete_by_idx(int idx)
- {
- T * ptr = remove_by_idx(idx);
- if (ptr) delete ptr;
- }
- void delete_all()
- {
- int n,max=get_count();
- for(n=0;n<max;n++)
- {
- T * ptr = get_item(n);
- if (ptr) delete ptr;
- }
- remove_all();
- }
- void sort(int (__cdecl *compare )(const T ** elem1, const T** elem2 ) )
- {
- qsort(get_raw_ptr(),get_count(),sizeof(void*),(int (__cdecl *)(const void *, const void *) )compare);
- }
- };
|