Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
221 lines
6.2 KiB
C++
221 lines
6.2 KiB
C++
// Copyright (C) 2000, 2001 Stephen Cleary (shammah@voyager.net)
|
|
//
|
|
// This file can be redistributed and/or modified under the terms found
|
|
// in "copyright.html"
|
|
// This software and its documentation is provided "as is" without express or
|
|
// implied warranty, and with no claim as to its suitability for any purpose.
|
|
//
|
|
// See http://www.boost.org for updates, documentation, and revision history.
|
|
|
|
#ifndef BOOST_POOL_ALLOC_HPP
|
|
#define BOOST_POOL_ALLOC_HPP
|
|
|
|
// std::numeric_limits
|
|
#include <boost/limits.hpp>
|
|
// new, std::bad_alloc
|
|
#include <new>
|
|
|
|
#include <boost/pool/poolfwd.hpp>
|
|
|
|
// boost::singleton_pool
|
|
#include <boost/pool/singleton_pool.hpp>
|
|
|
|
// The following code will be put into Boost.Config in a later revision
|
|
#if defined(_RWSTD_VER) || defined(__SGI_STL_PORT)
|
|
// Needed, as of bcc 5.5 and STLPort 4.5b8
|
|
#define BOOST_NO_PROPER_STL_DEALLOCATE
|
|
#endif
|
|
|
|
namespace boost {
|
|
|
|
struct pool_allocator_tag { };
|
|
|
|
template <typename T,
|
|
typename UserAllocator,
|
|
typename Mutex,
|
|
unsigned NextSize>
|
|
class pool_allocator
|
|
{
|
|
public:
|
|
typedef T value_type;
|
|
typedef UserAllocator user_allocator;
|
|
typedef Mutex mutex;
|
|
BOOST_STATIC_CONSTANT(unsigned, next_size = NextSize);
|
|
|
|
typedef value_type * pointer;
|
|
typedef const value_type * const_pointer;
|
|
typedef value_type & reference;
|
|
typedef const value_type & const_reference;
|
|
typedef typename pool<UserAllocator>::size_type size_type;
|
|
typedef typename pool<UserAllocator>::difference_type difference_type;
|
|
|
|
template <typename U>
|
|
struct rebind
|
|
{
|
|
typedef pool_allocator<U, UserAllocator, Mutex, NextSize> other;
|
|
};
|
|
|
|
public:
|
|
pool_allocator() { }
|
|
|
|
// default copy constructor
|
|
|
|
// default assignment operator
|
|
|
|
// not explicit, mimicking std::allocator [20.4.1]
|
|
template <typename U>
|
|
pool_allocator(const pool_allocator<U, UserAllocator, Mutex, NextSize> &)
|
|
{ }
|
|
|
|
// default destructor
|
|
|
|
static pointer address(reference r)
|
|
{ return &r; }
|
|
static const_pointer address(const_reference s)
|
|
{ return &s; }
|
|
static size_type max_size()
|
|
{ return std::numeric_limits<size_type>::max(); }
|
|
static void construct(const pointer ptr, const value_type & t)
|
|
{ new (ptr) T(t); }
|
|
static void destroy(const pointer ptr)
|
|
{
|
|
ptr->~T();
|
|
(void) ptr; // avoid unused variable warning
|
|
}
|
|
|
|
bool operator==(const pool_allocator &) const
|
|
{ return true; }
|
|
bool operator!=(const pool_allocator &) const
|
|
{ return false; }
|
|
|
|
static pointer allocate(const size_type n)
|
|
{
|
|
const pointer ret = static_cast<pointer>(
|
|
singleton_pool<pool_allocator_tag, sizeof(T), UserAllocator, Mutex,
|
|
NextSize>::ordered_malloc(n) );
|
|
if (ret == 0)
|
|
throw std::bad_alloc();
|
|
return ret;
|
|
}
|
|
static pointer allocate(const size_type n, const void * const)
|
|
{ return allocate(n); }
|
|
static void deallocate(const pointer ptr, const size_type n)
|
|
{
|
|
#ifdef BOOST_NO_PROPER_STL_DEALLOCATE
|
|
if (ptr == 0 || n == 0)
|
|
return;
|
|
#endif
|
|
singleton_pool<pool_allocator_tag, sizeof(T), UserAllocator, Mutex,
|
|
NextSize>::ordered_free(ptr, n);
|
|
}
|
|
};
|
|
|
|
struct fast_pool_allocator_tag { };
|
|
|
|
template <typename T,
|
|
typename UserAllocator,
|
|
typename Mutex,
|
|
unsigned NextSize>
|
|
class fast_pool_allocator
|
|
{
|
|
public:
|
|
typedef T value_type;
|
|
typedef UserAllocator user_allocator;
|
|
typedef Mutex mutex;
|
|
BOOST_STATIC_CONSTANT(unsigned, next_size = NextSize);
|
|
|
|
typedef value_type * pointer;
|
|
typedef const value_type * const_pointer;
|
|
typedef value_type & reference;
|
|
typedef const value_type & const_reference;
|
|
typedef typename pool<UserAllocator>::size_type size_type;
|
|
typedef typename pool<UserAllocator>::difference_type difference_type;
|
|
|
|
template <typename U>
|
|
struct rebind
|
|
{
|
|
typedef fast_pool_allocator<U, UserAllocator, Mutex, NextSize> other;
|
|
};
|
|
|
|
public:
|
|
fast_pool_allocator() { }
|
|
|
|
// default copy constructor
|
|
|
|
// default assignment operator
|
|
|
|
// not explicit, mimicking std::allocator [20.4.1]
|
|
template <typename U>
|
|
fast_pool_allocator(
|
|
const fast_pool_allocator<U, UserAllocator, Mutex, NextSize> &)
|
|
{ }
|
|
|
|
// default destructor
|
|
|
|
static pointer address(reference r)
|
|
{ return &r; }
|
|
static const_pointer address(const_reference s)
|
|
{ return &s; }
|
|
static size_type max_size()
|
|
{ return std::numeric_limits<size_type>::max(); }
|
|
void construct(const pointer ptr, const value_type & t)
|
|
{ new (ptr) T(t); }
|
|
void destroy(const pointer ptr)
|
|
{
|
|
ptr->~T();
|
|
(void) ptr; // avoid unused variable warning
|
|
}
|
|
|
|
bool operator==(const fast_pool_allocator &) const
|
|
{ return true; }
|
|
bool operator!=(const fast_pool_allocator &) const
|
|
{ return false; }
|
|
|
|
static pointer allocate(const size_type n)
|
|
{
|
|
const pointer ret = (n == 1) ?
|
|
static_cast<pointer>(
|
|
singleton_pool<fast_pool_allocator_tag, sizeof(T),
|
|
UserAllocator, Mutex, NextSize>::malloc() ) :
|
|
static_cast<pointer>(
|
|
singleton_pool<fast_pool_allocator_tag, sizeof(T),
|
|
UserAllocator, Mutex, NextSize>::ordered_malloc(n) );
|
|
if (ret == 0)
|
|
throw std::bad_alloc();
|
|
return ret;
|
|
}
|
|
static pointer allocate(const size_type n, const void * const)
|
|
{ return allocate(n); }
|
|
static pointer allocate()
|
|
{
|
|
const pointer ret = static_cast<pointer>(
|
|
singleton_pool<fast_pool_allocator_tag, sizeof(T),
|
|
UserAllocator, Mutex, NextSize>::malloc() );
|
|
if (ret == 0)
|
|
throw std::bad_alloc();
|
|
return ret;
|
|
}
|
|
static void deallocate(const pointer ptr, const size_type n)
|
|
{
|
|
#ifdef BOOST_NO_PROPER_STL_DEALLOCATE
|
|
if (ptr == 0 || n == 0)
|
|
return;
|
|
#endif
|
|
if (n == 1)
|
|
singleton_pool<fast_pool_allocator_tag, sizeof(T),
|
|
UserAllocator, Mutex, NextSize>::free(ptr);
|
|
else
|
|
singleton_pool<fast_pool_allocator_tag, sizeof(T),
|
|
UserAllocator, Mutex, NextSize>::free(ptr, n);
|
|
}
|
|
static void deallocate(const pointer ptr)
|
|
{
|
|
singleton_pool<fast_pool_allocator_tag, sizeof(T),
|
|
UserAllocator, Mutex, NextSize>::free(ptr);
|
|
}
|
|
};
|
|
|
|
} // namespace boost
|
|
|
|
#endif
|