আমি সি-তে এই জাতীয় জিনিসটি করতাম, ওওপ কী তা জানার আগে।
নিম্নলিখিতটি একটি উদাহরণ, যা একটি ডেটা-বাফার প্রয়োগ করে যা চাহিদা অনুযায়ী বৃদ্ধি পায়, সর্বনিম্ন আকার, বৃদ্ধি এবং সর্বোচ্চ আকার দেওয়া হয় given এই নির্দিষ্ট প্রয়োগটি "এলিমেন্ট" ভিত্তিক ছিল, যার অর্থ এটি কেবলমাত্র একটি চলক দৈর্ঘ্যের বাইট-বাফার নয়, কোনও সি টাইপের তালিকা-জাতীয় সংগ্রহের অনুমতি দেওয়ার জন্য ডিজাইন করা হয়েছিল।
ধারণাটি হ'ল অবজেক্টটি xxx_crt () ব্যবহার করে তাত্ক্ষণিকভাবে xX_dlt () ব্যবহার করে মুছে ফেলা হয়। প্রতিটি "সদস্য" পদ্ধতি চালানোর জন্য একটি বিশেষভাবে টাইপ করা পয়েন্টার নেয়।
আমি এই পদ্ধতিতে একটি লিঙ্কযুক্ত তালিকা, চক্রীয় বাফার এবং অন্যান্য অনেকগুলি জিনিস কার্যকর করেছি।
আমাকে অবশ্যই স্বীকার করতে হবে, এই পদ্ধতির মাধ্যমে উত্তরাধিকার কীভাবে প্রয়োগ করা যায় সে সম্পর্কে আমি কখনই চিন্তাভাবনা করি নি। আমি কল্পনা করেছিলাম যে কিভেলির প্রস্তাবিত কিছু সংমিশ্রণটি একটি ভাল পথ হতে পারে।
dtb.c:
#include <limits.h>
#include <string.h>
#include <stdlib.h>
static void dtb_xlt(void *dst, const void *src, vint len, const byte *tbl);
DTABUF *dtb_crt(vint minsiz,vint incsiz,vint maxsiz) {
DTABUF *dbp;
if(!minsiz) { return NULL; }
if(!incsiz) { incsiz=minsiz; }
if(!maxsiz || maxsiz<minsiz) { maxsiz=minsiz; }
if(minsiz+incsiz>maxsiz) { incsiz=maxsiz-minsiz; }
if((dbp=(DTABUF*)malloc(sizeof(*dbp))) == NULL) { return NULL; }
memset(dbp,0,sizeof(*dbp));
dbp->min=minsiz;
dbp->inc=incsiz;
dbp->max=maxsiz;
dbp->siz=minsiz;
dbp->cur=0;
if((dbp->dta=(byte*)malloc((vuns)minsiz)) == NULL) { free(dbp); return NULL; }
return dbp;
}
DTABUF *dtb_dlt(DTABUF *dbp) {
if(dbp) {
free(dbp->dta);
free(dbp);
}
return NULL;
}
vint dtb_adddta(DTABUF *dbp,const byte *xlt256,const void *dtaptr,vint dtalen) {
if(!dbp) { errno=EINVAL; return -1; }
if(dtalen==-1) { dtalen=(vint)strlen((byte*)dtaptr); }
if((dbp->cur + dtalen) > dbp->siz) {
void *newdta;
vint newsiz;
if((dbp->siz+dbp->inc)>=(dbp->cur+dtalen)) { newsiz=dbp->siz+dbp->inc; }
else { newsiz=dbp->cur+dtalen; }
if(newsiz>dbp->max) { errno=ETRUNC; return -1; }
if((newdta=realloc(dbp->dta,(vuns)newsiz))==NULL) { return -1; }
dbp->dta=newdta; dbp->siz=newsiz;
}
if(dtalen) {
if(xlt256) { dtb_xlt(((byte*)dbp->dta+dbp->cur),dtaptr,dtalen,xlt256); }
else { memcpy(((byte*)dbp->dta+dbp->cur),dtaptr,(vuns)dtalen); }
dbp->cur+=dtalen;
}
return 0;
}
static void dtb_xlt(void *dst,const void *src,vint len,const byte *tbl) {
byte *sp,*dp;
for(sp=(byte*)src,dp=(byte*)dst; len; len--,sp++,dp++) { *dp=tbl[*sp]; }
}
vint dtb_addtxt(DTABUF *dbp,const byte *xlt256,const byte *format,...) {
byte textÝ501¨;
va_list ap;
vint len;
va_start(ap,format); len=sprintf_len(format,ap)-1; va_end(ap);
if(len<0 || len>=sizeof(text)) { sprintf_safe(text,sizeof(text),"STRTOOLNG: %s",format); len=(int)strlen(text); }
else { va_start(ap,format); vsprintf(text,format,ap); va_end(ap); }
return dtb_adddta(dbp,xlt256,text,len);
}
vint dtb_rmvdta(DTABUF *dbp,vint len) {
if(!dbp) { errno=EINVAL; return -1; }
if(len > dbp->cur) { len=dbp->cur; }
dbp->cur-=len;
return 0;
}
vint dtb_reset(DTABUF *dbp) {
if(!dbp) { errno=EINVAL; return -1; }
dbp->cur=0;
if(dbp->siz > dbp->min) {
byte *newdta;
if((newdta=(byte*)realloc(dbp->dta,(vuns)dbp->min))==NULL) {
free(dbp->dta); dbp->dta=null; dbp->siz=0;
return -1;
}
dbp->dta=newdta; dbp->siz=dbp->min;
}
return 0;
}
void *dtb_elmptr(DTABUF *dbp,vint elmidx,vint elmlen) {
if(!elmlen || (elmidx*elmlen)>=dbp->cur) { return NULL; }
return ((byte*)dbp->dta+(elmidx*elmlen));
}
dtb.h
typedef _Packed struct {
vint min; /* initial size */
vint inc; /* increment size */
vint max; /* maximum size */
vint siz; /* current size */
vint cur; /* current data length */
void *dta; /* data pointer */
} DTABUF;
#define dtb_dtaptr(mDBP) (mDBP->dta)
#define dtb_dtalen(mDBP) (mDBP->cur)
DTABUF *dtb_crt(vint minsiz,vint incsiz,vint maxsiz);
DTABUF *dtb_dlt(DTABUF *dbp);
vint dtb_adddta(DTABUF *dbp,const byte *xlt256,const void *dtaptr,vint dtalen);
vint dtb_addtxt(DTABUF *dbp,const byte *xlt256,const byte *format,...);
vint dtb_rmvdta(DTABUF *dbp,vint len);
vint dtb_reset(DTABUF *dbp);
void *dtb_elmptr(DTABUF *dbp,vint elmidx,vint elmlen);
পিএস: ভিন্টটি কেবল ইনট টাইপফ ছিল - আমি এটির স্মরণ করিয়ে দিতে এটি ব্যবহার করেছি যে এটির দৈর্ঘ্য প্ল্যাটফর্ম থেকে প্ল্যাটফর্মের (পোর্টিংয়ের জন্য) পরিবর্তনশীল ছিল।