00001 #ifndef __UTILS_SLABS_H__
00002 #define __UTILS_SLABS_H__
00003
00004 #include <vector>
00005 #include <boost/cstdint.hpp>
00006
00007 namespace utilmm
00008 {
00009 namespace pools
00010 {
00011 template<typename T>
00012 class dynamic_auto;
00013
00023 class dynamic_pool
00024 {
00025 template<typename T>
00026 friend class dynamic_auto;
00027
00028 public:
00029 typedef boost::uint32_t size_t;
00030
00031 private:
00032 typedef boost::uint8_t byte_t;
00033
00034 struct item_t
00035 {
00036 size_t size;
00037 byte_t payload[];
00038 };
00039
00040 typedef std::vector<item_t*> Buffers;
00041
00042 static item_t* get_base(void* ptr);
00043
00044 size_t m_size;
00045 Buffers m_listpool, m_free;
00046
00047 public:
00048 dynamic_pool();
00049 ~dynamic_pool();
00050
00051 void* allocate(size_t size);
00052 void deallocate(void* vbuffer);
00053 };
00054
00055
00056 template<typename T>
00057 class dynamic_auto
00058 {
00059 T* m_ptr;
00060
00061 struct safe_bool_struct
00062 { void method(); };
00063 typedef void (safe_bool_struct::*safe_bool)();
00064
00065 public:
00066 dynamic_auto(T* t) throw()
00067 : m_ptr(t) {}
00068
00069 ~dynamic_auto()
00070 {
00071 if (m_ptr)
00072 delete[] dynamic_pool::get_base(m_ptr);
00073 }
00074
00075 dynamic_auto(dynamic_auto const& copy) throw()
00076 {
00077 m_ptr = copy.m_ptr;
00078 copy.m_ptr = 0;
00079 }
00080
00081 void reset(T* t) throw()
00082 { m_ptr = t; }
00083
00084 operator safe_bool() const throw()
00085 { return m_ptr ? &safe_bool_struct::method : 0; }
00086
00087 T* get() throw() { return m_ptr; }
00088 T const* get() const throw() { return m_ptr; }
00089 T* release() throw()
00090 {
00091 T* temp = m_ptr;
00092 m_ptr = 0;
00093 return temp;
00094 }
00095 };
00096
00097 }
00098 }
00099
00100 #endif
00101
00102