|
|
1.1 ! root 1: typedef void* PV; ! 2: typedef void (*PF)(PV,int,int,int,int,int,int,int,int); ! 3: typedef void (*PFI)(PV,int ...); ! 4: /* ! 5: ERROR: cannot handle classes with more than 8 virtual bases ! 6: */ ! 7: ! 8: // functions that manage the map from arrays to their element counts ! 9: extern void __insert_new_array(PV key, int count); ! 10: // key is a pointer to a new array. It must ! 11: // be non-zero ! 12: // not already be in the table ! 13: // count is the number of elements in the array. May be zero ! 14: extern int __remove_old_array(PV key); ! 15: // removes an old array from the table. Returns the count or -1 if not found ! 16: ! 17: #ifdef __cplusplus ! 18: extern "C" ! 19: #endif ! 20: PV __vec_new(PV op, int n, int sz, PV f) ! 21: /* ! 22: allocate a vector of "n" elements of size "sz" ! 23: and initialize each by a call of "f" ! 24: */ ! 25: { ! 26: if (op == 0) { ! 27: op = PV( new char[n*sz] ); ! 28: if (op) __insert_new_array(op, n); ! 29: } ! 30: if (op && f) { ! 31: register char* p = (char*) op; ! 32: register char* lim = p + n*sz; ! 33: register PF fp = PF(f); ! 34: while (p < lim) { ! 35: (*fp) (PV(p),0,0,0,0,0,0,0,0); ! 36: p += sz; ! 37: } ! 38: } ! 39: return PV(op); ! 40: } ! 41: ! 42: #ifdef __cplusplus ! 43: extern "C" ! 44: #endif ! 45: void __vec_delete(PV op, int n, int sz, PV f, int del, int) ! 46: { ! 47: if (op) { ! 48: if (f) { ! 49: if (del && n == -1) ! 50: n = __remove_old_array(op); // -1 if not found ! 51: register char* cp = (char*) op; ! 52: register char* p = cp; ! 53: register PFI fp = PFI(f); ! 54: p += n*sz; ! 55: while (p > cp) { ! 56: p -= sz; ! 57: (*fp)(PV(p), 2); // destroy VBC, don't delete ! 58: } ! 59: } ! 60: if (del) delete op; ! 61: } ! 62: } ! 63:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.