|
|
1.1 ! root 1: #include <Pool.h> ! 2: ! 3: static const round = 4; // most stringent alignment, in chars ! 4: ! 5: // offset in chars of the data part of a block ! 6: static const blockoff = (sizeof(Block_header)+round-1) & -round; ! 7: ! 8: Block_pool::Block_pool (unsigned n) ! 9: { ! 10: sz = n; ! 11: head = 0; ! 12: } ! 13: ! 14: Block_pool::~Block_pool() ! 15: { ! 16: while (head) { ! 17: Block_header* b = head; ! 18: head = head->next; ! 19: delete (char*) b; ! 20: } ! 21: } ! 22: ! 23: char* ! 24: Block_pool::expand() ! 25: { ! 26: Block_header* b = (Block_header*) new char[size()+blockoff]; ! 27: b->next = head; ! 28: head = b; ! 29: return ((char*) b) + blockoff; ! 30: } ! 31: ! 32: ! 33: // largest multiple of q that is <= p ! 34: static unsigned ! 35: floor (unsigned p, unsigned q) ! 36: { ! 37: return p - p % (q + (q==0)); ! 38: } ! 39: ! 40: // smallest multiple of q that is >= p ! 41: static unsigned ! 42: ceil (unsigned p, unsigned q) ! 43: { ! 44: return floor (p + q - 1, q); ! 45: } ! 46: ! 47: Pool::Pool(unsigned n): (ceil (1000, n)) ! 48: { ! 49: elsize = (n + (n == 0) + round - 1) & -round; ! 50: count = Block_pool::size()/elsize; ! 51: head = 0; ! 52: } ! 53: ! 54: void ! 55: Pool::grow() ! 56: { ! 57: register char* p = expand(); ! 58: register int n = count; ! 59: ! 60: while (--n >= 0) { ! 61: register Pool_element_header* ph = (Pool_element_header*) p; ! 62: ph->next = head; ! 63: head = ph; ! 64: p += elsize; ! 65: } ! 66: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.