/* * Inkscape::GC::Alloc - GC-aware STL allocator * * Copyright 2004 MenTaLguY * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * See the file COPYING for details. * */ #ifndef SEEN_INKSCAPE_GC_ALLOC_H #define SEEN_INKSCAPE_GC_ALLOC_H #include #include #include "gc-core.h" namespace Inkscape { namespace GC { template class Alloc { public: typedef T value_type; typedef T *pointer; typedef T const *const_pointer; typedef T &reference; typedef T const &const_reference; typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; template struct rebind { typedef Alloc other; }; Alloc() {} template Alloc(Alloc const &) {} pointer address(reference r) { return &r; } const_pointer address(const_reference r) { return &r; } size_type max_size() const { return std::numeric_limits::max() / sizeof(T); } pointer allocate(size_type count, void const * =NULL) { return static_cast(::operator new(count * sizeof(T), SCANNED, collect)); } void construct(pointer p, const_reference value) { new (static_cast(p)) T(value); } void destroy(pointer p) { p->~T(); } void deallocate(pointer p, size_type) { ::operator delete(p, GC); } }; // allocators with the same collection policy are interchangable template bool operator==(Alloc const &, Alloc const &) { return collect1 == collect2; } template bool operator!=(Alloc const &, Alloc const &) { return collect1 != collect2; } } } #endif /* Local Variables: mode:c++ c-file-style:"stroustrup" c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) indent-tabs-mode:nil fill-column:99 End: */ // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :