| // Copyright 2015 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef COMPONENTS_METRICS_LEAK_DETECTOR_STL_ALLOCATOR_H_ | 
 | #define COMPONENTS_METRICS_LEAK_DETECTOR_STL_ALLOCATOR_H_ | 
 |  | 
 | #include <stddef.h> | 
 |  | 
 | #include <limits> | 
 | #include <memory> | 
 |  | 
 | #include "base/logging.h" | 
 |  | 
 | // Generic allocator class for STL objects. | 
 | // deallocate() to use the template class Alloc's allocation. | 
 | // that uses a given type-less allocator Alloc, which must provide: | 
 | //   static void* Alloc::Allocate(size_t size); | 
 | //   static void Alloc::Free(void* ptr, size_t size); | 
 | // | 
 | // Inherits from the default allocator, std::allocator. Overrides allocate() and | 
 | // deallocate() and some other functions. | 
 | // | 
 | // STLAllocator<T, MyAlloc> provides the same thread-safety guarantees as | 
 | // MyAlloc. | 
 | // | 
 | // Usage example: | 
 | //   set<T, less<T>, STLAllocator<T, MyAlloc> > my_set; | 
 |  | 
 | template <typename T, class Alloc> | 
 | class STLAllocator : public std::allocator<T> { | 
 |  public: | 
 |   typedef size_t size_type; | 
 |   typedef T* pointer; | 
 |  | 
 |   template <class T1> | 
 |   struct rebind { | 
 |     typedef STLAllocator<T1, Alloc> other; | 
 |   }; | 
 |  | 
 |   STLAllocator() {} | 
 |   explicit STLAllocator(const STLAllocator&) {} | 
 |   template <class T1> | 
 |   STLAllocator(const STLAllocator<T1, Alloc>&) {} | 
 |   ~STLAllocator() {} | 
 |  | 
 |   pointer allocate(size_type n, const void* = 0) { | 
 |     // Make sure the computation of the total allocation size does not cause an | 
 |     // integer overflow. | 
 |     RAW_CHECK(n < max_size()); | 
 |     return static_cast<T*>(Alloc::Allocate(n * sizeof(T))); | 
 |   } | 
 |  | 
 |   void deallocate(pointer p, size_type n) { Alloc::Free(p, n * sizeof(T)); } | 
 |  | 
 |   size_type max_size() const { | 
 |     return std::numeric_limits<size_t>::max() / sizeof(T); | 
 |   } | 
 | }; | 
 |  | 
 | #endif  // COMPONENTS_METRICS_LEAK_DETECTOR_STL_ALLOCATOR_H_ |