00001 /* checkMoveListProvider.h 00002 */ 00003 #ifndef _CHECKMOVELISTPROVIDER_H 00004 #define _CHECKMOVELISTPROVIDER_H 00005 00006 #include "osl/checkmate/checkMove.h" 00007 #include <ext/slist> 00008 00009 namespace osl 00010 { 00011 namespace checkmate 00012 { 00013 class CheckMoveListProvider 00014 { 00015 typedef __gnu_cxx::slist<CheckMove*> list_t; 00016 list_t data; 00017 list_t::iterator cur; 00018 size_t index; 00019 #ifdef OSL_SMP 00020 enum { BucketSize = 128 }; 00021 #else 00022 enum { BucketSize = 2048*16 }; 00023 #endif 00024 public: 00025 CheckMoveListProvider(); 00026 ~CheckMoveListProvider(); 00027 private: 00028 void newBucket(size_t length); 00029 public: 00030 CheckMove* alloc(size_t length) 00031 { 00032 if (length == 0) 00033 return 0; 00034 if (index + length > BucketSize) 00035 newBucket(std::max(length, (size_t)BucketSize)); 00036 assert(cur != data.end()); 00037 assert(index + length <= BucketSize); 00038 CheckMove *result = &(*cur)[index]; 00039 index += length; 00040 return result; 00041 } 00042 void clear(); 00043 }; 00044 } 00045 } 00046 00047 00048 #endif /* _CHECKMOVELISTPROVIDER_H */ 00049 // ;;; Local Variables: 00050 // ;;; mode:c++ 00051 // ;;; c-basic-offset:2 00052 // ;;; End: