Alien-SmokeQt
view release on metacpan or search on metacpan
generator/parser/rxx_allocator.h view on Meta::CPAN
static const size_type max_block_count = size_type(-1);
static const size_type _S_block_size = 1 << 16; // 64K
rxx_allocator() {
init();
}
rxx_allocator(const rxx_allocator &/*__o*/) {
init();
}
~rxx_allocator() {
for (size_type index = 0; index < _M_block_index + 1; ++index)
delete[] _M_storage[index];
::free(_M_storage);
}
pointer address(reference __val) { return &__val; }
const_pointer address(const_reference __val) const { return &__val; }
/**Allocates @p __n elements continuosly in the pool. Warning! no
check is done to check if the size of those @p __n elements
fit into the block. You should assure you do not allocate more
than the size of a block.*/
pointer allocate(size_type __n, const void* = 0) {
const size_type bytes = __n * sizeof(_Tp);
if (_M_current_block == 0
|| _S_block_size < _M_current_index + bytes)
{
++_M_block_index;
_M_storage = reinterpret_cast<char**>
(::realloc(_M_storage, sizeof(char*) * (1 + _M_block_index)));
_M_current_block = _M_storage[_M_block_index] = reinterpret_cast<char*>
(new char[_S_block_size]);
::memset(_M_current_block, 0, _S_block_size);
_M_current_index = 0;
}
pointer p = reinterpret_cast<pointer>
(_M_current_block + _M_current_index);
_M_current_index += bytes;
return p;
}
/**Deallocate does nothing in this implementation.*/
void deallocate(pointer /*__p*/, size_type /*__n*/) {}
size_type max_size() const { return size_type(-1) / sizeof(_Tp); }
void construct(pointer __p, const_reference __val) { new (__p) _Tp(__val); }
void destroy(pointer __p) { __p->~_Tp(); }
template <class _Tp1> struct rebind {
typedef rxx_allocator<_Tp1> other;
};
private:
void init()
{
_M_block_index = max_block_count;
_M_current_index = 0;
_M_storage = 0;
_M_current_block = 0;
}
template <class _Tp1> rxx_allocator(const rxx_allocator<_Tp1> &__o) {}
private:
size_type _M_block_index;
size_type _M_current_index;
char *_M_current_block;
char **_M_storage;
};
#endif // RXX_ALLOCATOR_H
( run in 1.119 second using v1.01-cache-2.11-cpan-2398b32b56e )