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