reallocator.h

Go to the documentation of this file.
00001 /*****************************************************************************
00002 * Copyright (c) 2001 - 2008 Marcus Boerger.  All rights reserved.
00003 *
00004 * This library is free software; you can redistribute it and/or
00005 * modify it under the terms of the GNU Lesser General Public
00006 * License as published by the Free Software Foundation; either
00007 * version 2.1 of the License, or (at your option) any later version.
00008 *
00009 * This library is distributed in the hope that it will be useful,
00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012 * Lesser General Public License for more details.
00013 *
00014 * You should have received a copy of the GNU Lesser General Public
00015 * License along with this library; if not, write to the Free Software
00016 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00017 * ========================================================================= */
00018 
00019 /* ------------------------------------------------------------------------ */
00020 /* Name:      reallocator.h
00021  *
00022  * Requires:  
00023  * - Mbo.h
00024  */
00034 /* ------------------------------------------------------------------------ */
00035 
00036 #ifndef _REALLOCATOR_H_
00037 #define _REALLOCATOR_H_
00038 
00039 #include "Mbo.h"
00040 
00041 #include "string.h"  /* for memmove() */
00042 #include <new>
00043 #include <memory>
00044 
00045 #if defined(_MSC_VER)
00046 # pragma warning(push)
00047 # pragma warning(disable: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
00048 #endif
00049 
00050 namespace mbo
00051 {
00052 
00057 template< class __ValueType, class __ReferenceType = __ValueType>
00058 class allocator: public std::allocator<__ValueType>
00059 {
00060 public:
00061 
00062     typedef std::allocator<__ValueType>             __Allocator;      
00063     typedef typename __Allocator::size_type         size_type;        
00064     typedef typename __Allocator::value_type        value_type;       
00065     typedef typename __Allocator::pointer           pointer;          
00066     typedef typename __Allocator::const_pointer     const_pointer;    
00067     typedef typename __Allocator::difference_type   difference_type;  
00069     typedef __ReferenceType &        reference;        
00070     typedef const __ReferenceType &  const_reference;  
00074     pointer address(reference ref)
00075     {
00076         return &ref;
00077     }
00078 
00081     const_pointer address(const_reference ref)
00082     {
00083         return &ref;
00084     }
00085 
00094     pointer allocate(size_type size, std::allocator<void>::const_pointer hint = 0L)
00095     {
00096         return size ? reinterpret_cast<pointer>(new char [size * sizeof(value_type)]) : 0L;
00097     }
00098 
00106     void deallocate(pointer ptr, size_type size)
00107     {
00108         delete [] reinterpret_cast<char*>(ptr);
00109     }
00110 
00118     void construct(pointer ptr, const_reference oth)
00119     {
00120 #if _MSC_VER >= 1300
00121 # pragma push_macro("new")
00122 # undef new
00123 #endif
00124         new (ptr) value_type(oth);
00125 #if _MSC_VER >= 1300
00126 # pragma pop_macro("new")
00127 #endif
00128     }
00129 
00133     size_type max_size() const
00134     {
00135         return static_cast<size_type>(~0) / sizeof(value_type);
00136     }
00137 
00138 #if MBO_0
00139     allocator()
00140     {
00141     }
00142 
00143     template< class __Other>
00144     allocator(const allocator<__Other> &)
00145     {
00146     }
00147 #endif
00148 
00152     template<class __Other>
00153     struct rebind
00154     {
00155         typedef allocator<__Other> other;
00156     };
00157 };
00158 
00168 template< class __ValueType>
00169 class reallocator: public allocator<__ValueType>
00170 {
00171 public:
00172 
00181     pointer reallocate(pointer ptr, size_type old_size, size_type new_size) __THROWS(bad_alloc)
00182     {
00183         pointer dst = allocate(new_size);
00184 
00185         mbo_throw_if_not(bad_alloc, dst || !new_size);
00186         if (dst && ptr)
00187         {
00188             move(dst, ptr, min(new_size, old_size));
00189         }
00190         if (ptr && (dst || !new_size))
00191         {
00192             deallocate(ptr, old_size);
00193         }
00194         return dst;
00195     }
00196 
00212     void move(pointer dst, pointer src, size_type size)
00213     {
00214         //std::uninitialized_copy(src, src + size, dst);
00215         memmove(dst, src, size * sizeof(value_type));
00216     }
00217 };
00218 
00231 template< class __ValueType>
00232 class mem_reallocator: public reallocator<__ValueType>
00233 {
00234 public:
00235 
00242     pointer allocate(size_type size, std::allocator<void>::const_pointer hint = 0L)
00243     {
00244         return static_cast<pointer>(mbo_malloc(size * sizeof(value_type)));
00245     }
00246 
00254     void deallocate(pointer ptr, size_type)
00255     {
00256         free(ptr);
00257     }
00258 
00269     pointer reallocate(pointer ptr, size_type, size_type new_size)
00270     {
00271         return static_cast<pointer>(mbo_realloc(ptr, new_size * sizeof(value_type)));
00272     }
00273 
00282     void move(pointer dst, pointer src, size_type size)
00283     {
00284         memmove(dst, src, size * sizeof(value_type));
00285     }
00286 };
00287 
00288 }; // namespace mbo
00289 
00290 #if defined(_MSC_VER)
00291 # pragma warning(pop)
00292 #endif
00293 
00294 #endif // _REALLOCATOR_H_

  Hosted on code.google.com  
© Marcus Börger
Generated on Fri Jan 18 21:21:08 2008 for MBO-lib by doxygen 1.5.4