123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 |
- #ifndef __ODYNARR_H
- #define __ODYNARR_H
- #ifndef __ALL_H
- #include <ALL.h>
- #endif
- #ifndef __STRING_H
- #include <string.h>
- #endif
- #define DEF_DYNARRAY_BLOCK_SIZE 30
- enum { SORT_INT=1,
- SORT_SHORT,
- SORT_CHAR,
- SORT_CHAR_PTR,
- SORT_CHAR_STR };
- #pragma pack(1)
- class DynArray
- {
- public :
- int ele_num;
- int block_num;
- int cur_pos;
- int last_ele;
- int ele_size;
- int sort_offset;
- char sort_type;
- char* body_buf;
-
- public :
- DynArray(int,int=DEF_DYNARRAY_BLOCK_SIZE);
- ~DynArray();
- void resize(int);
- void linkin(void*);
- void linkin_unique(void*);
- void linkout(int= -1);
- void update(void*, int= -1);
- void insert(void*);
- void insert_at(int,void*);
- void add_blank(int);
- void init_sort(int,char);
- void linkin_sort_scan_from_bottom(void*);
- void* get();
- void* get(int);
- void* get_ptr();
- void* get_ptr(int);
- void read(void*);
- int check_pos();
- void push(void*);
- void pop(void* =0);
- void start();
- void end();
- int fwd();
- int bkwd();
- void jump(int);
- void go(int);
- int recno();
- int size();
- int is_start();
- int is_end();
- int scan_whole(void*);
- int scan(void*,int,char,int=0);
- int compare(void*,int,char);
- void quick_sort( int(*cmpFun)(const void*, const void*) );
- void clean_up(int* =0);
- void free_ptr(void*,int*);
- void zap(int resizeFlag=1);
- int write_file(File*);
- int read_file(File*);
- };
- #pragma pack()
- inline void* DynArray::get()
- {
- if( cur_pos == 0 )
- return NULL;
- return (void*) (body_buf+(cur_pos-1)*ele_size);
- }
- inline void* DynArray::get(int specRec)
- {
- if( specRec<1 || specRec>last_ele )
- return NULL;
- return (void*) (body_buf+(specRec-1)*ele_size);
- }
- inline void* DynArray::get_ptr()
- {
- if( cur_pos == 0 )
- return NULL;
- return (void*) *((char**)(body_buf+(cur_pos-1)*ele_size));
- }
- inline void* DynArray::get_ptr(int specRec)
- {
- if( specRec < 1 || specRec > last_ele )
- return NULL;
- return (void*) *((char**)(body_buf+(specRec-1)*ele_size));
- }
- inline void DynArray::read(void* ent)
- {
- if( ent )
- memcpy(ent, get(), ele_size );
- }
- inline void DynArray::push(void* ent)
- {
- linkin(ent);
- }
- inline void DynArray::pop(void* ent)
- {
- end();
- read(ent);
- linkout();
- }
- inline void DynArray::start()
- {
- cur_pos = min(1,last_ele);
- }
- inline void DynArray::end()
- {
- cur_pos = last_ele;
- }
- inline int DynArray::fwd()
- {
- if (cur_pos < last_ele )
- {
- cur_pos++;
- return 1;
- }
- else
- return 0;
- }
- inline int DynArray::bkwd()
- {
- if (cur_pos > 1)
- {
- cur_pos--;
- return 1;
- }
- else
- return 0;
- }
- inline void DynArray::jump(int step)
- {
- cur_pos+=step;
- if ( cur_pos < 0 )
- cur_pos = min(1,last_ele) ;
- if ( cur_pos > last_ele )
- cur_pos = last_ele;
- }
- inline void DynArray::go(int desPos)
- {
- if ( desPos >= 1 && desPos <= last_ele )
- cur_pos = desPos;
- }
- inline int DynArray::recno()
- {
- return cur_pos;
- }
- inline int DynArray::size()
- {
- return last_ele;
- }
- inline int DynArray::is_start()
- {
- return( cur_pos <= 1 );
- }
- inline int DynArray::is_end()
- {
- return( cur_pos >= last_ele );
- }
- #endif
|