diff options
| author | MenTaLguY <mental@rydia.net> | 2006-01-16 02:36:01 +0000 |
|---|---|---|
| committer | mental <mental@users.sourceforge.net> | 2006-01-16 02:36:01 +0000 |
| commit | 179fa413b047bede6e32109e2ce82437c5fb8d34 (patch) | |
| tree | a5a6ac2c1708bd02288fbd8edb2ff500ff2e0916 /src/gc-alloc.h | |
| download | inkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.tar.gz inkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.zip | |
moving trunk for module inkscape
(bzr r1)
Diffstat (limited to 'src/gc-alloc.h')
| -rw-r--r-- | src/gc-alloc.h | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/gc-alloc.h b/src/gc-alloc.h new file mode 100644 index 000000000..83811c0b3 --- /dev/null +++ b/src/gc-alloc.h @@ -0,0 +1,89 @@ +/* + * Inkscape::GC::Alloc - GC-aware STL allocator + * + * Copyright 2004 MenTaLguY <mental@rydia.net> + * + * 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 <limits> +#include "gc-core.h" + +namespace Inkscape { + +namespace GC { + +template <typename T, CollectionPolicy collect> +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 <typename U> + struct rebind { typedef Alloc<U, collect> other; }; + + Alloc() {} + template <typename U> Alloc(Alloc<U, collect> const &) {} + + pointer address(reference r) { return &r; } + const_pointer address(const_reference r) { return &r; } + + size_type max_size() const { + return std::numeric_limits<std::size_t>::max() / sizeof(T); + } + + pointer allocate(size_type count, void const * =NULL) { + return static_cast<pointer>(::operator new(count * sizeof(T), SCANNED, collect)); + } + + void construct(pointer p, const_reference value) { + new (static_cast<void *>(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 <typename T1, typename T2, + CollectionPolicy collect1, CollectionPolicy collect2> +bool operator==(Alloc<T1, collect1> const &, Alloc<T2, collect2> const &) { + return collect1 == collect2; +} + +template <typename T1, typename T2, + CollectionPolicy collect1, CollectionPolicy collect2> +bool operator!=(Alloc<T1, collect1> const &, Alloc<T2, collect2> 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:encoding=utf-8:textwidth=99 : |
