Eneboo - Documentación para desarrolladores
|
00001 // -*- C++ -*- 00002 00003 #if !defined(_BINS64K_H_) 00004 #define _BINS64K_H_ 00005 00006 #include <cstdlib> 00007 #include <assert.h> 00008 00009 #include "bins.h" 00010 #include "sassert.h" 00011 00012 namespace HL { 00013 00014 template <class Header> 00015 class bins<Header, 65536> { 00016 public: 00017 00018 bins (void) 00019 { 00020 #ifndef NDEBUG 00021 for (int i = sizeof(double); i < BIG_OBJECT; i++) { 00022 int sc = getSizeClass(i); 00023 assert (getClassSize(sc) >= i); 00024 assert (getClassSize(sc-1) < i); 00025 assert (getSizeClass(getClassSize(sc)) == sc); 00026 } 00027 #endif 00028 } 00029 00030 enum { BIG_OBJECT = 65536 / 2 - sizeof(Header) }; 00031 00032 enum { NUM_BINS = 55, 00033 NUM_LOOKUP = 508 }; 00034 00035 static const size_t _bins[NUM_BINS]; 00036 static const int _sizeclasses[NUM_LOOKUP]; 00037 00038 static inline int getSizeClass (size_t sz) { 00039 assert (sz <= _bins[NUM_BINS-1]); 00040 sz = (sz < sizeof(double)) ? sizeof(double) : sz; 00041 if (sz <= 80) { 00042 return (int) ((sz - 1) >> 3); 00043 } else { 00044 return slowGetSizeClass (sz); 00045 } 00046 } 00047 00048 static inline size_t getClassSize (const int i) { 00049 assert (i >= 0); 00050 assert (i < NUM_BINS); 00051 assert (getSizeClass(_bins[i]) == i); 00052 return _bins[i]; 00053 } 00054 00055 private: 00056 00057 static inline int slowGetSizeClass (size_t sz) { 00058 int ind = 0; 00059 while (sz > _bins[ind]) { 00060 ind++; 00061 assert (ind < NUM_BINS); 00062 } 00063 return ind; 00064 } 00065 00066 sassert<(BIG_OBJECT > 0)> verifyHeaderSize; 00067 }; 00068 00069 } 00070 00071 00072 template <class Header> 00073 const size_t HL::bins<Header, 65536>::_bins[NUM_BINS] = 00074 { 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) }; 00075 00076 template <class Header> 00077 const int HL::bins<Header, 65536>::_sizeclasses[NUM_LOOKUP] = 00078 {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 }; 00079 00080 #endif