source: proiecte/swift/trunk/lib/hoard-371/src/heaplayers/bins64k.h @ 176

Last change on this file since 176 was 176, checked in by (none), 14 years ago
  • imported repo from "guagal"
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
12namespace HL {
13
14template <class Header>
15class bins<Header, 65536> {
16public:
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
55private:
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
72template <class Header>
73const 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
76template <class Header>
77const 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.