Advertisement
Guest User

MikelSV Core / Unlimited Matrix

a guest
Jun 17th, 2015
284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.32 KB | None | 0 0
  1. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  3. // NEW UNLIMITED MATRIX///////////////////////////////////////////////////////////////////////////////////////////////////////////
  4. class LString; // your class Index
  5.  
  6. // Defines
  7. //#define DLString_sz sizeof(DData) // General data size
  8.  
  9.  
  10.  
  11. #ifndef LString_minmem
  12. #define LString_minmem  1024
  13. #endif
  14. #define LString_minel   16
  15.  
  16. //class LString_um{ char*n; unsigned int sz; char data[0]; };
  17.  
  18. class LString{// Unlimited Matrix
  19. protected:
  20. unsigned int allsize, usedsize, bufsize, blocks;
  21. UMX_data *data, *edata, *cdata; unsigned int cblockfn, esz;
  22. const char nullel;
  23. bool isdel;
  24. public:
  25. LString(unsigned int buf=LString_minmem) : nullel(){ Init(); bufsize=buf; }
  26. ~LString(){Clear();}
  27.  
  28. void operator=(const char *s){ Clear(); add(s, (unsigned int)strlen(s)); }
  29. void operator=(const MString& s){ Clear(); add(s, s); }
  30. void operator=(const VString& s){ Clear(); add(s, s); }
  31. //void operator+=(const MString &s){ add(s, s); }
  32. void operator+=(const char *s){ add(s, strlen(s)); }
  33. void operator+=(const char s){ add((char*)&s, 1); }
  34. void operator+=(const VString &s){ add(s, s); }
  35. void resize(unsigned int s){ usedsize=s; }
  36.  
  37.  
  38. void String(MString &ret){
  39.     ret.Reserv(usedsize*sizeof(char));
  40.     unsigned int pos=0, sz;
  41.     UMX_data *dt=data;
  42.  
  43.     while(dt){
  44.         if(dt->sz+pos<ret.size()) sz=dt->sz; else { sz=ret.size()-pos; }
  45.         memcpy(ret.pos(pos), dt->data, sz*sizeof(char)); pos+=sz;
  46.         dt=dt->n;
  47.     }  
  48. }
  49.  
  50.  
  51. const LString& operator+=(LString& lst){
  52. unsigned int dsz, asz=lst.usedsize; UMX_data*dt=lst.data;
  53.  
  54. if(lst.data) while(dt){
  55.     dsz=dt->sz; if(dsz<asz){ asz-=dsz; }else{ dsz=asz; }
  56.     add((char*)&dt->data, dsz);
  57.     dt=dt->n;
  58.     }
  59.     return *this;
  60. }
  61.  
  62. int Send(SOCKET sock){
  63. int ret=1, sz, rets=0; cdata=data; cblockfn=0;
  64.     while(cdata){
  65.         if(usedsize-cblockfn>cdata->sz) sz=cdata->sz; else sz=usedsize-cblockfn;
  66.         ret=send(sock, (char*)(&cdata->data), sz, 0); if(ret>0) rets+=ret; else return 0;
  67.         cblockfn+=cdata->sz; cdata=cdata->n;
  68.     }
  69. return rets;
  70. }
  71.  
  72. inline const unsigned int addnf(const char *s, const unsigned int sz=1){ if(allsize-usedsize<sz) usedsize=allsize; return add(s, sz); } // no frag
  73. inline char* addnfv(const unsigned int sz){ return &el(addnf(0, sz)); } // no frag, virtual
  74.  
  75. // NOTE!! Modify new(e)char  => *e=0;
  76.  
  77.  
  78. void Init(){ memset(this, 0, sizeof(LString)); }
  79.  
  80. void NewBlockSz(unsigned int buf){ if(buf>=sizeof(char)) bufsize=buf; }
  81. void NewBlockESz(unsigned int buf){ if(buf>0) bufsize=buf*sizeof(char); }
  82. unsigned int size()const {return usedsize;}
  83.  
  84. //const LString& operator+=(char *s){ return add(s, strlen(s)/sizeof(char));}
  85. //const LString& operator+=(MString &s){ return add(s, s);}
  86.  
  87. const char& operator[](const unsigned int e){ return getelement(e); }
  88. const char& operator[](const int e){ return getelement(e); }
  89.  
  90. char& el(const unsigned int e){ return getelement(e); }
  91.  
  92. char& getelement(unsigned int e){
  93. if(!cdata || e<cblockfn){ cdata=data; cblockfn=0; }
  94.     while(cdata){
  95.         if(e<cblockfn+cdata->sz) return *((char*)(&cdata->data)+(e-cblockfn));
  96.         cblockfn+=cdata->sz; cdata=cdata->n;
  97.     }
  98. return (char&)nullel;
  99. }
  100.  
  101. void *GetBuffer(int sz){
  102.     void *d = malloc(sz);
  103.     memset(d, 0, sz);
  104.     return d;
  105. }
  106.  
  107. void DelBuffer(void *p){
  108.     free(p);
  109. }
  110.  
  111. inline const unsigned int add(const char &s){ return add(&s, sizeof(char)); }
  112. //inline char& inserta(){return (char&)*insert();}
  113.  
  114. inline const unsigned int add(const char *s, const unsigned int sz=1){ if(!sz) return -1;
  115.     if(!bufsize) bufsize=LString_minmem; unsigned int ret=usedsize;
  116.     unsigned int frs=allsize-usedsize, ws;
  117.     if(frs && edata){ ws=sz; if(ws>frs) ws=frs;
  118.         if(s){ memcpy((char*)&edata->data+esz-frs, s, ws*sizeof(char)); }      
  119.         usedsize+=ws;
  120.         if(ws==sz) return ret;
  121.     }
  122.     ws=bufsize/sizeof(char); if(ws<1) ws=1; if(sz>ws) ws=sz;
  123.     UMX_data *ndata=(UMX_data*)GetBuffer(ws*sizeof(char)+UMSZ+(isdel ? (sizeof(mbool)+ws/8 + (ws%8>0 ? 1 : 0)) : 0)); blocks++;
  124.     if(isdel) {*((mbool*)((char*)ndata)+ws*sizeof(char)+UMSZ)=(bool*)(((char*)ndata)+ws*sizeof(char)+UMSZ+sizeof(mbool));}
  125.     allsize+=ws; usedsize+=sz-frs; //ws=bufsize; if(sz-frs>ws) ws=sz-frs;
  126.     ndata->sz=ws; esz=ws; //*(unsigned int*)((char*)ndata)=ws; esz=ws;// ndata+=UMSZ;
  127.     if(edata){ edata->n=ndata; }
  128.     edata=ndata; if(!data) data=edata;
  129.     if(s) memcpy(edata->data, s+frs, (sz-frs)*sizeof(char));
  130. return ret;
  131. }
  132.  
  133. inline char& inserta(){ return (char&)getelement(insert()); }
  134. inline char* vinsert(){ return (char*)&getelement(insert()); }
  135. inline char& repaira(){ return (char&)getelement(repair()); }
  136. inline char* vrepair(){ return (char*)&getelement(repair()); }
  137.  
  138. inline unsigned int insert(){ char tm[sizeof(char)]; memset(&tm, 0, sizeof(char)); unsigned int ed=add((char*)&tm, 1); char*e=&getelement(ed); memset(e, 0, sizeof(*e)); return ed; }
  139.  
  140. bool del(unsigned int e){
  141. if(!cdata || e<cblockfn){ cdata=data; cblockfn=0; }
  142.     while(cdata){
  143.         if(e<cblockfn+cdata->sz){
  144.                 #ifdef DLString_constructor
  145.             ((char*)cdata.data+(e-cblockfn))->~char();
  146.                 #endif
  147.              if(isdel) ((mbool*)(cdata+cdata->sz))->set(e-cblockfn, 0);
  148.              return 1;
  149.         }
  150.         cdata=cdata->n; cblockfn+=cdata->sz;
  151.     }
  152. return 0;
  153. }
  154.  
  155. unsigned int repair(){ if(!isdel) return insert();
  156. int s; mbool *mb; if(!cdata || 0<cblockfn){ cdata=data; cblockfn=0; }
  157.     while(cdata){
  158.         //s=*(unsigned int*)((char*)cdata-UMSZ);
  159.         int i=0; mb=(mbool*)(cdata->data+s);
  160.  
  161.         for(i; i<s; i++){ if(i%8==0 && mb->isbyte(i/8)==255){ i+=8; continue; }
  162.         if(!mb->get(i)){// if(cblockfn+i<usedsize) return insert();
  163.          mb->set(i, 1);
  164. #ifdef DLString_constructor
  165.         new((char*)cdata->data+i)char;
  166. #endif
  167.         return cblockfn+i;
  168.     }}
  169.         cdata=cdata->n; cblockfn+=s;
  170.     }
  171.  return insert();
  172. }
  173.  
  174. bool is(unsigned int e){ if(!isdel) return 1;
  175.     if(!cdata || e<cblockfn){ cdata=data; cblockfn=0; }
  176.     while(cdata){
  177.         if(e<cblockfn+cdata->sz){
  178.              return ((mbool*)((char*)cdata->data+cdata->sz))->get(e-cblockfn);
  179.         }
  180.         cdata=cdata->n; cblockfn+=cdata->sz;
  181.     }
  182. return 0;
  183. }
  184.  
  185. unsigned int getpos(const char *pos){
  186.     cdata=data; cblockfn=0;
  187.     while(cdata){
  188.         if((char*)&cdata->data<=pos && pos<(char*)&cdata->data+cdata->sz){
  189.              return cblockfn+(pos-(char*)(&cdata->data));
  190.         }
  191.         cdata=cdata->n; cblockfn+=cdata->sz;
  192.     }
  193. return -1;
  194. }
  195.  
  196. // SP
  197. unsigned int GetFreeBuffer(char**data){
  198.     if(allsize==usedsize){ add((char*)&nullel, 1); usedsize--; }
  199.     unsigned int fs=allsize-usedsize;
  200.     *data=(char*)&edata->data+esz-fs;
  201.     return fs;
  202. }
  203.  
  204. void SetFreeBuffer(unsigned int add){ usedsize+=esz-add; }
  205.  
  206. //const LString& operator=(char *s){Clear(); return add(s, strlen(s));}
  207. //const LString& operator=(MString s){Clear(); return add(s, s);}
  208.  
  209. operator MString(){
  210.     MString ret; ret.Reserv(usedsize*sizeof(char));
  211.     unsigned int pos=0, sz;
  212.     UMX_data*dt=data;
  213.  
  214.     if(data) while(dt){
  215.         if(dt->sz+pos<ret.size()) sz=dt->sz;
  216.         else{ sz=ret.size()-pos; }
  217.         memcpy(ret.pos(pos), &dt->data, sz*sizeof(char)); pos+=sz;
  218.         dt=dt->n;  
  219.     }
  220.     return ret;
  221. }
  222.  
  223. char* pos(){ if(!data) return 0; return (char*)data->data; }
  224. operator char*(){ if(!data) return 0; return (char*)data->data; }
  225. char* nomov(){ return oneline(); }
  226.  
  227. char* oneline(bool delfree=1){
  228.     if(!data) return 0; if(data==edata) return (char*)data->data;
  229.     if(delfree) esz=usedsize; else esz=allsize;
  230.     UMX_data *ndata=(UMX_data*)GetBuffer(esz*sizeof(char)+UMSZ);
  231.     //*(unsigned int*)((char*)ndata)=esz; ndata+=UMSZ;
  232.     ndata->sz=esz;
  233.     unsigned int pos=0, sz;
  234.  
  235.     UMX_data *dt=data, *dd;
  236.     while(dt){
  237.         if(dt->sz+pos<usedsize) sz=dt->sz; else{ sz=usedsize-pos; }
  238.         memcpy(ndata->data+pos*sizeof(char), dt->data, sz*sizeof(char)); pos+=sz;
  239. //memcpy(&dd, (char*)(dt-4), 4);
  240. //*(long*)(char*)&dt=*(long*)((char*)dt-UMCSZ);
  241.         dd=dt; dt=dt->n; DelBuffer(dd);
  242.     }
  243.     data=ndata; edata=data; cdata=0; blocks=1; allsize=usedsize;
  244.     return (char*)data->data;
  245. }
  246.  
  247. void Clear(){ if(!data) return ;
  248.     UMX_data *dt=data, *dd;
  249.     unsigned int pos=0, dsz, msz;
  250.  
  251.     while(dt){
  252.         dsz=dt->sz; msz=dsz; if(dsz+pos>usedsize) msz=usedsize-pos;
  253. #ifdef DLString_destructor
  254.         for(unsigned int i=0; i<msz; i++){
  255.             ((char*)dt->data+i)->~char();
  256.         }
  257. #endif
  258.         dd=dt; dt=dt->n;       
  259.         DelBuffer(dd);
  260.     }
  261.     data=0; edata=0; cdata=0; allsize=0; usedsize=0;
  262. }
  263.  
  264. // Add Func
  265.     void i_want_mod_usedsize(int pos){ usedsize=pos; }
  266.  
  267. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement