00001 #ifndef QPID_INLINEALLOCATOR_H
00002 #define QPID_INLINEALLOCATOR_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <memory>
00026
00027 namespace qpid {
00028
00033 template <class BaseAllocator, size_t Max>
00034 class InlineAllocator : public BaseAllocator {
00035 public:
00036 typedef typename BaseAllocator::pointer pointer;
00037 typedef typename BaseAllocator::size_type size_type;
00038 typedef typename BaseAllocator::value_type value_type;
00039
00040 InlineAllocator() : allocated(false) {}
00041
00042 pointer allocate(size_type n) {
00043 if (n <= Max && !allocated) {
00044 allocated=true;
00045 return store;
00046 }
00047 else
00048 return BaseAllocator::allocate(n, 0);
00049 }
00050
00051 void deallocate(pointer p, size_type n) {
00052 if (p == store) allocated=false;
00053 else BaseAllocator::deallocate(p, n);
00054 }
00055
00056 template<typename T1>
00057 struct rebind {
00058 typedef typename BaseAllocator::template rebind<T1>::other BaseOther;
00059 typedef InlineAllocator<BaseOther, Max> other;
00060 };
00061
00062 private:
00063 value_type store[Max];
00064 bool allocated;
00065 };
00066
00067 }
00068
00069 #endif