1/*
2 *
3 * Copyright (c) 1994
4 * Hewlett-Packard Company
5 *
6 * Permission to use, copy, modify, distribute and sell this software
7 * and its documentation for any purpose is hereby granted without fee,
8 * provided that the above copyright notice appear in all copies and
9 * that both that copyright notice and this permission notice appear
10 * in supporting documentation.  Hewlett-Packard Company makes no
11 * representations about the suitability of this software for any
12 * purpose.  It is provided "as is" without express or implied warranty.
13 *
14 */
15
16// Inclusion of this file is DEPRECATED.  This is the original HP
17// default allocator.  It is provided only for backward compatibility.
18// This file WILL BE REMOVED in a future release.
19//
20// DO NOT USE THIS FILE unless you have an old container implementation
21// that requires an allocator with the HP-style interface.
22//
23// Standard-conforming allocators have a very different interface.  The
24// standard default allocator is declared in the header <memory>.
25
26#ifndef DEFALLOC_H
27#define DEFALLOC_H
28
29#include <new.h>
30#include <stddef.h>
31#include <stdlib.h>
32#include <limits.h>
33#if (defined(__BEOS__) || defined(__HAIKU__))
34# include <stdio.h>
35#else
36#include <iostream.h>
37#endif
38#include <algobase.h>
39
40
41template <class T>
42inline T* allocate(ptrdiff_t size, T*) {
43    set_new_handler(0);
44    T* tmp = (T*)(::operator new((size_t)(size * sizeof(T))));
45    if (tmp == 0) {
46#if (defined(__BEOS__) || defined(__HAIKU__))
47	fprintf(stderr, "out of memory\n");
48#else
49	cerr << "out of memory" << endl;
50#endif
51	exit(1);
52    }
53    return tmp;
54}
55
56
57template <class T>
58inline void deallocate(T* buffer) {
59    ::operator delete(buffer);
60}
61
62template <class T>
63class allocator {
64public:
65    typedef T value_type;
66    typedef T* pointer;
67    typedef const T* const_pointer;
68    typedef T& reference;
69    typedef const T& const_reference;
70    typedef size_t size_type;
71    typedef ptrdiff_t difference_type;
72    pointer allocate(size_type n) {
73	return ::allocate((difference_type)n, (pointer)0);
74    }
75    void deallocate(pointer p) { ::deallocate(p); }
76    pointer address(reference x) { return (pointer)&x; }
77    const_pointer const_address(const_reference x) {
78	return (const_pointer)&x;
79    }
80    size_type init_page_size() {
81	return max(size_type(1), size_type(4096/sizeof(T)));
82    }
83    size_type max_size() const {
84	return max(size_type(1), size_type(UINT_MAX/sizeof(T)));
85    }
86};
87
88class allocator<void> {
89public:
90    typedef void* pointer;
91};
92
93
94
95#endif
96