Home | History | Annotate | Download | only in base
      1 /* Copyright (c) 2006, Google Inc.
      2  * All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are
      6  * met:
      7  *
      8  *     * Redistributions of source code must retain the above copyright
      9  * notice, this list of conditions and the following disclaimer.
     10  *     * Redistributions in binary form must reproduce the above
     11  * copyright notice, this list of conditions and the following disclaimer
     12  * in the documentation and/or other materials provided with the
     13  * distribution.
     14  *     * Neither the name of Google Inc. nor the names of its
     15  * contributors may be used to endorse or promote products derived from
     16  * this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  *
     30  * ---
     31  * Author: Maxim Lifantsev
     32  */
     33 
     34 
     35 #ifndef BASE_STL_ALLOCATOR_H_
     36 #define BASE_STL_ALLOCATOR_H_
     37 
     38 #include <config.h>
     39 
     40 #include <stddef.h>   // for ptrdiff_t
     41 #include <limits>
     42 
     43 #include "base/logging.h"
     44 
     45 // Generic allocator class for STL objects
     46 // that uses a given type-less allocator Alloc, which must provide:
     47 //   static void* Alloc::Allocate(size_t size);
     48 //   static void Alloc::Free(void* ptr, size_t size);
     49 //
     50 // STL_Allocator<T, MyAlloc> provides the same thread-safety
     51 // guarantees as MyAlloc.
     52 //
     53 // Usage example:
     54 //   set<T, less<T>, STL_Allocator<T, MyAlloc> > my_set;
     55 // CAVEAT: Parts of the code below are probably specific
     56 //         to the STL version(s) we are using.
     57 //         The code is simply lifted from what std::allocator<> provides.
     58 template <typename T, class Alloc>
     59 class STL_Allocator {
     60  public:
     61   typedef size_t     size_type;
     62   typedef ptrdiff_t  difference_type;
     63   typedef T*         pointer;
     64   typedef const T*   const_pointer;
     65   typedef T&         reference;
     66   typedef const T&   const_reference;
     67   typedef T          value_type;
     68 
     69   template <class T1> struct rebind {
     70     typedef STL_Allocator<T1, Alloc> other;
     71   };
     72 
     73   STL_Allocator() { }
     74   STL_Allocator(const STL_Allocator&) { }
     75   template <class T1> STL_Allocator(const STL_Allocator<T1, Alloc>&) { }
     76   ~STL_Allocator() { }
     77 
     78   pointer address(reference x) const { return &x; }
     79   const_pointer address(const_reference x) const { return &x; }
     80 
     81   pointer allocate(size_type n, const void* = 0) {
     82     RAW_DCHECK((n * sizeof(T)) / sizeof(T) == n, "n is too big to allocate");
     83     return static_cast<T*>(Alloc::Allocate(n * sizeof(T)));
     84   }
     85   void deallocate(pointer p, size_type n) { Alloc::Free(p, n * sizeof(T)); }
     86 
     87   size_type max_size() const { return size_t(-1) / sizeof(T); }
     88 
     89   void construct(pointer p, const T& val) { ::new(p) T(val); }
     90   void construct(pointer p) { ::new(p) T(); }
     91   void destroy(pointer p) { p->~T(); }
     92 
     93   // There's no state, so these allocators are always equal
     94   bool operator==(const STL_Allocator&) const { return true; }
     95 };
     96 
     97 #endif  // BASE_STL_ALLOCATOR_H_
     98