summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/memory.h
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2009-05-16 00:19:13 +0000
committerKarl Berry <karl@freefriends.org>2009-05-16 00:19:13 +0000
commitbab45528d65eaafe68a705dbb2a57075c7b7cbd8 (patch)
tree10b4ae2b5195c8dede153ab89359ec00f55f325f /Build/source/utils/asymptote/memory.h
parent8643d90372e9c31e0f461c15c596b60a545bd7d3 (diff)
asymptote 1.72 sources (not integrated into build yet)
git-svn-id: svn://tug.org/texlive/trunk@13110 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/utils/asymptote/memory.h')
-rw-r--r--Build/source/utils/asymptote/memory.h177
1 files changed, 177 insertions, 0 deletions
diff --git a/Build/source/utils/asymptote/memory.h b/Build/source/utils/asymptote/memory.h
new file mode 100644
index 00000000000..63c5291b130
--- /dev/null
+++ b/Build/source/utils/asymptote/memory.h
@@ -0,0 +1,177 @@
+/****
+ * memory.h
+ *
+ * Interface to the Boehm Garbage Collector.
+ *****/
+
+#ifndef MEMORY_H
+#define MEMORY_H
+
+#include <list>
+#include <vector>
+#include <stack>
+#include <map>
+#include <string>
+#include <sstream>
+
+#ifndef NOHASH
+#ifndef __GNUC_PREREQ
+#define __GNUC_PREREQ(maj, min) (0)
+# endif
+#if __GNUC_PREREQ(4,3)
+#include <tr1/unordered_map>
+#define EXT std::tr1
+#else
+#define EXT __gnu_cxx
+#include <ext/hash_map>
+#define unordered_map hash_map
+#define unordered_multimap hash_multimap
+#endif
+#endif
+
+#ifdef __DECCXX_LIBCXX_RH70
+#define CONST
+#else
+#define CONST const
+#endif
+
+#ifdef USEGC
+
+#define GC_THREADS
+#include <gc.h>
+
+#ifdef GC_DEBUG
+extern "C" {
+#include <gc_backptr.h>
+}
+#endif
+
+inline void *asy_malloc(size_t n)
+{
+#ifdef GC_DEBUG
+ if(void *mem=GC_debug_malloc_ignore_off_page(n, GC_EXTRAS))
+#else
+ if(void *mem=GC_malloc_ignore_off_page(n))
+#endif
+ return mem;
+ throw std::bad_alloc();
+}
+
+inline void *asy_malloc_atomic(size_t n)
+{
+#ifdef GC_DEBUG
+ if(void *mem=GC_debug_malloc_atomic_ignore_off_page(n, GC_EXTRAS))
+#else
+ if(void *mem=GC_malloc_atomic_ignore_off_page(n))
+#endif
+ return mem;
+ throw std::bad_alloc();
+}
+
+#undef GC_MALLOC
+#undef GC_MALLOC_ATOMIC
+
+#define GC_MALLOC(sz) asy_malloc(sz)
+#define GC_MALLOC_ATOMIC(sz) asy_malloc_atomic(sz)
+
+#include <gc_allocator.h>
+#include <gc_cpp.h>
+
+#else // USEGC
+
+using std::allocator;
+#define gc_allocator allocator
+
+class gc {};
+class gc_cleanup {};
+
+enum GCPlacement {UseGC, NoGC, PointerFreeGC};
+
+inline void* operator new(size_t size, GCPlacement) {
+ return operator new(size);
+}
+
+inline void* operator new[](size_t size, GCPlacement) {
+ return operator new(size);
+}
+
+template<class T>
+struct GC_type_traits {};
+
+#define GC_DECLARE_PTRFREE(T) \
+ template<> struct GC_type_traits<T> {}
+
+#endif // USEGC
+
+namespace mem {
+
+#define GC_CONTAINER(KIND) \
+ template <typename T> \
+ struct KIND : public std::KIND<T, gc_allocator<T> >, public gc { \
+ KIND() : std::KIND<T, gc_allocator<T> >() {} \
+ KIND(size_t n) : std::KIND<T, gc_allocator<T> >(n) {} \
+ KIND(size_t n, const T& t) : std::KIND<T, gc_allocator<T> >(n,t) {} \
+ }
+
+GC_CONTAINER(list);
+GC_CONTAINER(vector);
+
+template <typename T, typename Container = vector<T> >
+struct stack : public std::stack<T, Container>, public gc {
+};
+
+#undef GC_CONTAINER
+
+#define GC_CONTAINER(KIND) \
+ template <typename Key, typename T, typename Compare = std::less<Key> > \
+ struct KIND : public \
+ std::KIND<Key,T,Compare,gc_allocator<std::pair<Key,T> > >, public gc { \
+ KIND() : std::KIND<Key,T,Compare,gc_allocator<std::pair<Key,T> > > () {} \
+ }
+
+GC_CONTAINER(map);
+GC_CONTAINER(multimap);
+
+#undef GC_CONTAINER
+
+#ifndef NOHASH
+#define GC_CONTAINER(KIND) \
+ template <typename Key, typename T, \
+ typename Hash = EXT::hash<Key>, \
+ typename Eq = std::equal_to<Key> > \
+ struct KIND : public \
+ EXT::KIND<Key,T,Hash,Eq,gc_allocator<std::pair<Key, T> > >, public gc { \
+ KIND() : EXT::KIND<Key,T,Hash,Eq,gc_allocator<std::pair<Key, T> > > () {} \
+ KIND(size_t n) \
+ : EXT::KIND<Key,T,Hash,Eq,gc_allocator<std::pair<Key, T> > > (n) {} \
+ }
+
+GC_CONTAINER(unordered_map);
+GC_CONTAINER(unordered_multimap);
+
+#undef GC_CONTAINER
+#undef EXT
+#endif
+
+#ifdef USEGC
+typedef std::basic_string<char,std::char_traits<char>,
+ gc_allocator<char> > string;
+typedef std::basic_stringstream<char,std::char_traits<char>,
+ gc_allocator<char> > stringstream;
+typedef std::basic_istringstream<char,std::char_traits<char>,
+ gc_allocator<char> > istringstream;
+typedef std::basic_ostringstream<char,std::char_traits<char>,
+ gc_allocator<char> > ostringstream;
+typedef std::basic_stringbuf<char,std::char_traits<char>,
+ gc_allocator<char> > stringbuf;
+#else
+typedef std::string string;
+typedef std::stringstream stringstream;
+typedef std::istringstream istringstream;
+typedef std::ostringstream ostringstream;
+typedef std::stringbuf stringbuf;
+#endif // USEGC
+
+} // namespace mem
+
+#endif