source:
proiecte/swift/trunk/lib/hoard-371/src/heaplayers/bins64k.h
@
176
Last change on this file since 176 was 176, checked in by , 14 years ago | |
---|---|
File size: 4.0 KB |
Line | |
---|---|
1 | // -*- C++ -*- |
2 | |
3 | #if !defined(_BINS64K_H_) |
4 | #define _BINS64K_H_ |
5 | |
6 | #include <stdlib.h> |
7 | #include <assert.h> |
8 | |
9 | #include "bins.h" |
10 | #include "sassert.h" |
11 | |
12 | namespace HL { |
13 | |
14 | template <class Header> |
15 | class bins<Header, 65536> { |
16 | public: |
17 | |
18 | bins (void) |
19 | { |
20 | #ifndef NDEBUG |
21 | for (int i = sizeof(double); i < BIG_OBJECT; i++) { |
22 | int sc = getSizeClass(i); |
23 | assert (getClassSize(sc) >= i); |
24 | assert (getClassSize(sc-1) < i); |
25 | assert (getSizeClass(getClassSize(sc)) == sc); |
26 | } |
27 | #endif |
28 | } |
29 | |
30 | enum { BIG_OBJECT = 65536 / 2 - sizeof(Header) }; |
31 | |
32 | enum { NUM_BINS = 55, |
33 | NUM_LOOKUP = 508 }; |
34 | |
35 | static const size_t _bins[NUM_BINS]; |
36 | static const int _sizeclasses[NUM_LOOKUP]; |
37 | |
38 | static inline int getSizeClass (size_t sz) { |
39 | assert (sz <= BIG_OBJECT); |
40 | sz = (sz < sizeof(double)) ? sizeof(double) : sz; |
41 | if (sz <= 80) { |
42 | return (sz - 1) >> 3; |
43 | } else { |
44 | return slowGetSizeClass (sz); |
45 | } |
46 | } |
47 | |
48 | static inline size_t getClassSize (const int i) { |
49 | assert (i >= 0); |
50 | assert (i < NUM_BINS); |
51 | assert (getSizeClass(_bins[i]) == i); |
52 | return _bins[i]; |
53 | } |
54 | |
55 | private: |
56 | |
57 | static inline size_t slowGetSizeClass (size_t sz) { |
58 | int ind = 0; |
59 | while (sz > _bins[ind]) { |
60 | ind++; |
61 | assert (ind < NUM_BINS); |
62 | } |
63 | return ind; |
64 | } |
65 | |
66 | sassert<(BIG_OBJECT > 0)> verifyHeaderSize; |
67 | }; |
68 | |
69 | } |
70 | |
71 | |
72 | template <class Header> |
73 | const size_t HL::bins<Header, 65536>::_bins[NUM_BINS] = |
74 | { 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 96, 112, 128, 152, 176, 208, 248, 296, 352, 416, 496, 592, 704, 840, 1008, 1208, 1448, 1736, 2080, 2496, 2992, 3584, 4096 - sizeof(Header), 4912, 5888, 7064, 8192 - sizeof(Header), 9824, 11784, 12288 - sizeof(Header), 14744, 16384 - sizeof(Header), 19656, 20480 - sizeof(Header), 24576 - sizeof(Header), 28672 - sizeof(Header), 32768 - sizeof(Header), 36864 - sizeof(Header), 40960 - sizeof(Header), 45056 - sizeof(Header), 49152 - sizeof(Header), 53248 - sizeof(Header), 57344 - sizeof(Header), 61440 - sizeof(Header), 65536 - sizeof(Header) }; |
75 | |
76 | template <class Header> |
77 | const int HL::bins<Header, 65536>::_sizeclasses[NUM_LOOKUP] = |
78 | {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32 }; |
79 | |
80 | #endif |
Note: See TracBrowser
for help on using the repository browser.