min_allocator.h revision 98760c18f85bafd98dde7a309e1b0e677abd47d8
1d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant//===----------------------------------------------------------------------===//
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
3bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//                     The LLVM Compiler Infrastructure
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
5bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#ifndef MIN_ALLOCATOR_H
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#define MIN_ALLOCATOR_H
12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#if __cplusplus >= 201103L
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <memory>
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
17d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnanttemplate <class T> class min_pointer;
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class T> class min_pointer<const T>;
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <> class min_pointer<void>;
20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <> class min_pointer<const void>;
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class T> class min_allocator;
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass min_pointer<const void>
25a535ffd99d3702ab065647e28e83c2b7d720be3dChris Lattner{
26a535ffd99d3702ab065647e28e83c2b7d720be3dChris Lattner    const void* ptr_;
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
2876e1ffc6036a7e772827228e4626280caddbc354Howard Hinnant    min_pointer() noexcept = default;
2976e1ffc6036a7e772827228e4626280caddbc354Howard Hinnant    min_pointer(std::nullptr_t) : ptr_(nullptr) {}
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class T>
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    min_pointer(min_pointer<T> p) : ptr_(p.ptr_) {}
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit operator bool() const {return ptr_ != nullptr;}
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    friend bool operator==(min_pointer x, min_pointer y) {return x.ptr_ == y.ptr_;}
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    friend bool operator!=(min_pointer x, min_pointer y) {return !(x == y);}
37d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant    template <class U> friend class min_pointer;
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
39af3473404e13e758ac482a1fd59d7dad2bb0d612Howard Hinnant
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
41f38bc6efc52ff2c773582d5b62dd53aaa92c186cChris Lattnerclass min_pointer<void>
42f38bc6efc52ff2c773582d5b62dd53aaa92c186cChris Lattner{
43f38bc6efc52ff2c773582d5b62dd53aaa92c186cChris Lattner    void* ptr_;
44d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnantpublic:
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    min_pointer() noexcept = default;
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    min_pointer(std::nullptr_t) : ptr_(nullptr) {}
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class T,
48d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant              class = typename std::enable_if
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                       <
50af3473404e13e758ac482a1fd59d7dad2bb0d612Howard Hinnant                            !std::is_const<T>::value
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                       >::type
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant             >
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    min_pointer(min_pointer<T> p) : ptr_(p.ptr_) {}
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit operator bool() const {return ptr_ != nullptr;}
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    friend bool operator==(min_pointer x, min_pointer y) {return x.ptr_ == y.ptr_;}
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    friend bool operator!=(min_pointer x, min_pointer y) {return !(x == y);}
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class U> friend class min_pointer;
60faa17162e91c615378c38d7dc4a22699cf4cf0cfMarshall Clow};
6124173b81dd527a38b32e037082f7d1578213d626Chris Lattner
62d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnanttemplate <class T>
6324173b81dd527a38b32e037082f7d1578213d626Chris Lattnerclass min_pointer
6424173b81dd527a38b32e037082f7d1578213d626Chris Lattner{
6524173b81dd527a38b32e037082f7d1578213d626Chris Lattner    T* ptr_;
6624173b81dd527a38b32e037082f7d1578213d626Chris Lattner
67d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant    explicit min_pointer(T* p) : ptr_(p) {}
6824173b81dd527a38b32e037082f7d1578213d626Chris Lattnerpublic:
6924173b81dd527a38b32e037082f7d1578213d626Chris Lattner    min_pointer() noexcept = default;
7024173b81dd527a38b32e037082f7d1578213d626Chris Lattner    min_pointer(std::nullptr_t) : ptr_(nullptr) {}
7124173b81dd527a38b32e037082f7d1578213d626Chris Lattner    explicit min_pointer(min_pointer<void> p) : ptr_(static_cast<T*>(p.ptr_)) {}
7224173b81dd527a38b32e037082f7d1578213d626Chris Lattner
7324173b81dd527a38b32e037082f7d1578213d626Chris Lattner    explicit operator bool() const {return ptr_ != nullptr;}
7424173b81dd527a38b32e037082f7d1578213d626Chris Lattner
75faa17162e91c615378c38d7dc4a22699cf4cf0cfMarshall Clow    typedef std::ptrdiff_t difference_type;
76a5058d9a0d5e60adcd9118dfe7f886effd6a6206Chris Lattner    typedef T& reference;
7724173b81dd527a38b32e037082f7d1578213d626Chris Lattner    typedef T* pointer;
7824173b81dd527a38b32e037082f7d1578213d626Chris Lattner    typedef T value_type;
79d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant    typedef std::random_access_iterator_tag iterator_category;
8024173b81dd527a38b32e037082f7d1578213d626Chris Lattner
8124173b81dd527a38b32e037082f7d1578213d626Chris Lattner    reference operator*() const {return *ptr_;}
82faa17162e91c615378c38d7dc4a22699cf4cf0cfMarshall Clow    pointer operator->() const {return ptr_;}
83f33824922812487c1e7f24852975b0e06792eb7eChris Lattner
84f33824922812487c1e7f24852975b0e06792eb7eChris Lattner    min_pointer& operator++() {++ptr_; return *this;}
85f33824922812487c1e7f24852975b0e06792eb7eChris Lattner    min_pointer operator++(int) {min_pointer tmp(*this); ++ptr_; return tmp;}
86f33824922812487c1e7f24852975b0e06792eb7eChris Lattner
8724173b81dd527a38b32e037082f7d1578213d626Chris Lattner    min_pointer& operator--() {--ptr_; return *this;}
8824173b81dd527a38b32e037082f7d1578213d626Chris Lattner    min_pointer operator--(int) {min_pointer tmp(*this); --ptr_; return tmp;}
8924173b81dd527a38b32e037082f7d1578213d626Chris Lattner
90faa17162e91c615378c38d7dc4a22699cf4cf0cfMarshall Clow    min_pointer& operator+=(difference_type n) {ptr_ += n; return *this;}
91af3473404e13e758ac482a1fd59d7dad2bb0d612Howard Hinnant    min_pointer& operator-=(difference_type n) {ptr_ -= n; return *this;}
9224173b81dd527a38b32e037082f7d1578213d626Chris Lattner
9324173b81dd527a38b32e037082f7d1578213d626Chris Lattner    min_pointer operator+(difference_type n) const
94bfa808e093b1bd53832a9aa245d27b1b95827bbfChris Lattner    {
95bfa808e093b1bd53832a9aa245d27b1b95827bbfChris Lattner        min_pointer tmp(*this);
96d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant        tmp += n;
9724173b81dd527a38b32e037082f7d1578213d626Chris Lattner        return tmp;
9824173b81dd527a38b32e037082f7d1578213d626Chris Lattner    }
9924173b81dd527a38b32e037082f7d1578213d626Chris Lattner
10024173b81dd527a38b32e037082f7d1578213d626Chris Lattner    friend min_pointer operator+(difference_type n, min_pointer x)
10124173b81dd527a38b32e037082f7d1578213d626Chris Lattner    {
10224173b81dd527a38b32e037082f7d1578213d626Chris Lattner        return x + n;
103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    min_pointer operator-(difference_type n) const
106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
107af3473404e13e758ac482a1fd59d7dad2bb0d612Howard Hinnant        min_pointer tmp(*this);
108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        tmp -= n;
109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return tmp;
110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    friend difference_type operator-(min_pointer x, min_pointer y)
113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return x.ptr_ - y.ptr_;
115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    reference operator[](difference_type n) const {return ptr_[n];}
118b0895ff8aee82d79986e1cc61e66870d48244d90Howard Hinnant
119db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer    friend bool operator< (min_pointer x, min_pointer y) {return x.ptr_ < y.ptr_;}
1205d4807742fbc1ee738ac5edc7fec98aef087949dMarshall Clow    friend bool operator> (min_pointer x, min_pointer y) {return y < x;}
1215d4807742fbc1ee738ac5edc7fec98aef087949dMarshall Clow    friend bool operator<=(min_pointer x, min_pointer y) {return !(y < x);}
1225d4807742fbc1ee738ac5edc7fec98aef087949dMarshall Clow    friend bool operator>=(min_pointer x, min_pointer y) {return !(x < y);}
1230cbb3a16e258e2cebcb827af310ffe43ecaee508Howard Hinnant
124ee7a0bf265499a87948e152e9d3a1bedcb9e896cHoward Hinnant    static min_pointer pointer_to(T& t) {return min_pointer(std::addressof(t));}
125ee7a0bf265499a87948e152e9d3a1bedcb9e896cHoward Hinnant
126ee7a0bf265499a87948e152e9d3a1bedcb9e896cHoward Hinnant    friend bool operator==(min_pointer x, min_pointer y) {return x.ptr_ == y.ptr_;}
1270cbb3a16e258e2cebcb827af310ffe43ecaee508Howard Hinnant    friend bool operator!=(min_pointer x, min_pointer y) {return !(x == y);}
1280cbb3a16e258e2cebcb827af310ffe43ecaee508Howard Hinnant    template <class U> friend class min_pointer;
129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class U> friend class min_allocator;
130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
132d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnanttemplate <class T>
1332481cba8b7eb98b939a0b36d85f552917a63816dHoward Hinnantclass min_pointer<const T>
1342481cba8b7eb98b939a0b36d85f552917a63816dHoward Hinnant{
1352481cba8b7eb98b939a0b36d85f552917a63816dHoward Hinnant    const T* ptr_;
136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
137d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant    explicit min_pointer(const T* p) : ptr_(p) {}
138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
1394b748953a2d51c34127aa9c593477966242e1898Chris Lattner    min_pointer() noexcept = default;
14065451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    min_pointer(std::nullptr_t) : ptr_(nullptr) {}
14165451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    min_pointer(min_pointer<T> p) : ptr_(p.ptr_) {}
142704f09b21245cee8a775fdb9962ed40de0f94b04Howard Hinnant    explicit min_pointer(min_pointer<const void> p) : ptr_(static_cast<const T*>(p.ptr_)) {}
14322b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant
144704f09b21245cee8a775fdb9962ed40de0f94b04Howard Hinnant    explicit operator bool() const {return ptr_ != nullptr;}
145271a1c03c309f20bb8cdbb0b0af7ad563bdc866dHoward Hinnant
146271a1c03c309f20bb8cdbb0b0af7ad563bdc866dHoward Hinnant    typedef std::ptrdiff_t difference_type;
147271a1c03c309f20bb8cdbb0b0af7ad563bdc866dHoward Hinnant    typedef const T& reference;
148704f09b21245cee8a775fdb9962ed40de0f94b04Howard Hinnant    typedef const T* pointer;
149704f09b21245cee8a775fdb9962ed40de0f94b04Howard Hinnant    typedef const T value_type;
15065451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    typedef std::random_access_iterator_tag iterator_category;
15165451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant
15265451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    reference operator*() const {return *ptr_;}
15365451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    pointer operator->() const {return ptr_;}
15465451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant
15565451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    min_pointer& operator++() {++ptr_; return *this;}
15665451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    min_pointer operator++(int) {min_pointer tmp(*this); ++ptr_; return tmp;}
15765451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant
15822b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant    min_pointer& operator--() {--ptr_; return *this;}
15965451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    min_pointer operator--(int) {min_pointer tmp(*this); --ptr_; return tmp;}
16065451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant
16165451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    min_pointer& operator+=(difference_type n) {ptr_ += n; return *this;}
16222b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant    min_pointer& operator-=(difference_type n) {ptr_ -= n; return *this;}
16322b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant
16422b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant    min_pointer operator+(difference_type n) const
16522b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant    {
16622b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant        min_pointer tmp(*this);
16722b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant        tmp += n;
16822b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant        return tmp;
16965451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    }
17065451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant
17165451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    friend min_pointer operator+(difference_type n, min_pointer x)
17222b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant    {
17322b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant        return x + n;
17465451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    }
17565451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant
17665451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    min_pointer operator-(difference_type n) const
17722b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant    {
17865451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant        min_pointer tmp(*this);
17965451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant        tmp -= n;
18065451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant        return tmp;
18122b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant    }
18222b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant
18322b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant    friend difference_type operator-(min_pointer x, min_pointer y)
18422b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant    {
185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return x.ptr_ - y.ptr_;
186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
18708a0b48c094ae76c3c9fb082bf0f17738a3fd7ceMarshall Clow
188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    reference operator[](difference_type n) const {return ptr_[n];}
189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1904b748953a2d51c34127aa9c593477966242e1898Chris Lattner    friend bool operator< (min_pointer x, min_pointer y) {return x.ptr_ < y.ptr_;}
191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    friend bool operator> (min_pointer x, min_pointer y) {return y < x;}
192f5d76a7afce1d593634004566066c8e593a14adeHoward Hinnant    friend bool operator<=(min_pointer x, min_pointer y) {return !(y < x);}
19322b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant    friend bool operator>=(min_pointer x, min_pointer y) {return !(x < y);}
19422b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant
195f5d76a7afce1d593634004566066c8e593a14adeHoward Hinnant    static min_pointer pointer_to(const T& t) {return min_pointer(std::addressof(t));}
196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    friend bool operator==(min_pointer x, min_pointer y) {return x.ptr_ == y.ptr_;}
19851065657aa5d421b8e41d16d66da707a7237adb0Howard Hinnant    friend bool operator!=(min_pointer x, min_pointer y) {return !(x == y);}
19951065657aa5d421b8e41d16d66da707a7237adb0Howard Hinnant    template <class U> friend class min_pointer;
20051065657aa5d421b8e41d16d66da707a7237adb0Howard Hinnant};
20151065657aa5d421b8e41d16d66da707a7237adb0Howard Hinnant
20251065657aa5d421b8e41d16d66da707a7237adb0Howard Hinnanttemplate <class T>
20351065657aa5d421b8e41d16d66da707a7237adb0Howard Hinnantinline
20451065657aa5d421b8e41d16d66da707a7237adb0Howard Hinnantbool
20551065657aa5d421b8e41d16d66da707a7237adb0Howard Hinnantoperator==(min_pointer<T> x, std::nullptr_t)
20651065657aa5d421b8e41d16d66da707a7237adb0Howard Hinnant{
207d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant    return !static_cast<bool>(x);
2088c21737c03f3b266d8679d56faa6b6d091e7f2f1Howard Hinnant}
2098c21737c03f3b266d8679d56faa6b6d091e7f2f1Howard Hinnant
21056f0d5be064ed82f439e1596a272237697077ec3Howard Hinnanttemplate <class T>
211db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencerinline
212db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencerbool
213db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spenceroperator==(std::nullptr_t, min_pointer<T> x)
214db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer{
215db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer    return !static_cast<bool>(x);
216db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer}
217db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer
218db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencertemplate <class T>
219db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencerinline
220db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencerbool
221db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spenceroperator!=(min_pointer<T> x, std::nullptr_t)
222db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer{
223db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer    return static_cast<bool>(x);
224db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer}
225db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer
226db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencertemplate <class T>
227db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencerinline
228db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencerbool
229db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spenceroperator!=(std::nullptr_t, min_pointer<T> x)
230db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer{
231db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer    return static_cast<bool>(x);
232db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer}
233db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer
234db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencertemplate <class T>
235db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencerclass min_allocator
236db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer{
237db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencerpublic:
238db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer    typedef T value_type;
239db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer    typedef min_pointer<T> pointer;
240db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer
241db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer    min_allocator() = default;
242db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer    template <class U>
243db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer    min_allocator(min_allocator<U>) {}
244db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer
245db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer    pointer allocate(std::ptrdiff_t n)
246db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer    {
247db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer        return pointer(static_cast<T*>(::operator new(n*sizeof(T))));
248db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer    }
249db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer
250db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer    void deallocate(pointer p, std::ptrdiff_t)
251db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer    {
252db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer        return ::operator delete(p.ptr_);
253db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer    }
254db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer
255db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer    friend bool operator==(min_allocator, min_allocator) {return true;}
256db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer    friend bool operator!=(min_allocator x, min_allocator y) {return !(x == y);}
257db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer};
258db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer
259db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer#endif  // __cplusplus >= 201103L
260db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer
261db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer#endif  // MIN_ALLOCATOR_H
262db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer