⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 object_pool.hpp

📁 CGAL is a collaborative effort of several sites in Europe and Israel. The goal is to make the most i
💻 HPP
字号:
// Copyright (C) 2000, 2001 Stephen Cleary//// Distributed under the Boost Software License, Version 1.0. (See// accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)//// See http://www.boost.org for updates, documentation, and revision history.#ifndef BOOST_OBJECT_POOL_HPP#define BOOST_OBJECT_POOL_HPP#include <boost/pool/poolfwd.hpp>// boost::pool#include <boost/pool/pool.hpp>// The following code will be put into Boost.Config in a later revision#if defined(BOOST_MSVC) || defined(__KCC)# define BOOST_NO_TEMPLATE_CV_REF_OVERLOADS#endif// The following code might be put into some Boost.Config header in a later revision#ifdef __BORLANDC__# pragma option push -w-inl#endif// There are a few places in this file where the expression "this->m" is used.// This expression is used to force instantiation-time name lookup, which I am//   informed is required for strict Standard compliance.  It's only necessary//   if "m" is a member of a base class that is dependent on a template//   parameter.// Thanks to Jens Maurer for pointing this out!namespace boost {// T must have a non-throwing destructortemplate <typename T, typename UserAllocator>class object_pool: protected pool<UserAllocator>{  public:    typedef T element_type;    typedef UserAllocator user_allocator;    typedef typename pool<UserAllocator>::size_type size_type;    typedef typename pool<UserAllocator>::difference_type difference_type;  protected:    pool<UserAllocator> & store() { return *this; }    const pool<UserAllocator> & store() const { return *this; }    // for the sake of code readability :)    static void * & nextof(void * const ptr)    { return *(static_cast<void **>(ptr)); }  public:    // This constructor parameter is an extension!    explicit object_pool(const size_type next_size = 32)    :pool<UserAllocator>(sizeof(T), next_size) { }    ~object_pool();    // Returns 0 if out-of-memory    element_type * malloc()    { return static_cast<element_type *>(store().ordered_malloc()); }    void free(element_type * const chunk)    { store().ordered_free(chunk); }    bool is_from(element_type * const chunk) const    { return store().is_from(chunk); }    element_type * construct()    {      element_type * const ret = malloc();      if (ret == 0)        return ret;      try { new (ret) element_type(); }      catch (...) { free(ret); throw; }      return ret;    }    // Include automatically-generated file for family of template construct()    //  functions#ifndef BOOST_NO_TEMPLATE_CV_REF_OVERLOADS#   include <boost/pool/detail/pool_construct.inc>#else#   include <boost/pool/detail/pool_construct_simple.inc>#endif    void destroy(element_type * const chunk)    {      chunk->~T();      free(chunk);    }    // These functions are extensions!    size_type get_next_size() const { return store().get_next_size(); }    void set_next_size(const size_type x) { store().set_next_size(x); }};template <typename T, typename UserAllocator>object_pool<T, UserAllocator>::~object_pool(){  // handle trivial case  if (!this->list.valid())    return;  details::PODptr<size_type> iter = this->list;  details::PODptr<size_type> next = iter;  // Start 'freed_iter' at beginning of free list  void * freed_iter = this->first;  const size_type partition_size = this->alloc_size();  do  {    // increment next    next = next.next();    // delete all contained objects that aren't freed    // Iterate 'i' through all chunks in the memory block    for (char * i = iter.begin(); i != iter.end(); i += partition_size)    {      // If this chunk is free      if (i == freed_iter)      {        // Increment freed_iter to point to next in free list        freed_iter = nextof(freed_iter);        // Continue searching chunks in the memory block        continue;      }      // This chunk is not free (allocated), so call its destructor      static_cast<T *>(static_cast<void *>(i))->~T();      // and continue searching chunks in the memory block    }    // free storage    UserAllocator::free(iter.begin());    // increment iter    iter = next;  } while (iter.valid());  // Make the block list empty so that the inherited destructor doesn't try to  //  free it again.  this->list.invalidate();}} // namespace boost// The following code might be put into some Boost.Config header in a later revision#ifdef __BORLANDC__# pragma option pop#endif#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -