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 |
Rev | Line | |
---|---|---|
[176] | 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.