Advertisement
cartec

Discontiguous Allocator

Jul 26th, 2013
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.94 KB | None | 0 0
  1. #include <cstddef>
  2. #include <iostream>
  3. #include <iterator>
  4. #include <limits>
  5. #include <memory>
  6.  
  7. template <typename T>
  8. class ScaledPointer : public std::iterator<std::random_access_iterator_tag, T> {
  9.   T* ptr;
  10. public:
  11.   ScaledPointer() = default;
  12.   ScaledPointer(T* ptr) : ptr(ptr) {}
  13.   template <typename U>
  14.   explicit ScaledPointer(U* ptr) : ptr(static_cast<T*>(ptr)) {}
  15.   template <typename U>
  16.   explicit ScaledPointer(const ScaledPointer<U>& other) :
  17.     ptr(static_cast<T*>(other.ptr)) {}
  18.  
  19.   explicit operator bool () const { return bool{ptr}; }
  20.  
  21.   T& operator * () const {
  22.     return *ptr;
  23.   }
  24.   T* operator -> () const {
  25.     return ptr;
  26.   }
  27.  
  28.   T& operator [] (std::ptrdiff_t n) const {
  29.     return ptr[2 * n];
  30.   }
  31.  
  32.   ScaledPointer& operator ++ () {
  33.     ptr += 2;
  34.     return *this;
  35.   }
  36.   ScaledPointer operator ++ (int) {
  37.     ScaledPointer tmp(*this);
  38.     ++*this;
  39.     return tmp;
  40.   }
  41.  
  42.   ScaledPointer& operator -- () {
  43.     ptr -= 2;
  44.     return *this;
  45.   }
  46.   ScaledPointer operator -- (int) {
  47.     ScaledPointer tmp(*this);
  48.     --*this;
  49.     return tmp;
  50.   }
  51.  
  52.   template <typename U, typename V>
  53.   friend bool operator == (const ScaledPointer<U>& u, const ScaledPointer<V>& v) {
  54.     return u.ptr == v.ptr;
  55.   }
  56.   template <typename U, typename V>
  57.   friend bool operator != (const ScaledPointer<U>& u, const ScaledPointer<V>& v) {
  58.     return !(u == v);
  59.   }
  60.  
  61.   template <typename U, typename V>
  62.   friend bool operator < (const ScaledPointer<U>& u, const ScaledPointer<V>& v) {
  63.     return u.ptr < v.ptr;
  64.   }
  65.   template <typename U, typename V>
  66.   friend bool operator > (const ScaledPointer<U>& u, const ScaledPointer<V>& v) {
  67.     return v < u;
  68.   }
  69.   template <typename U, typename V>
  70.   friend bool operator <= (const ScaledPointer<U>& u, const ScaledPointer<V>& v) {
  71.     return !(v < u);
  72.   }
  73.   template <typename U, typename V>
  74.   friend bool operator >= (const ScaledPointer<U>& u, const ScaledPointer<V>& v) {
  75.     return !(u < v);
  76.   }
  77.  
  78.   ScaledPointer& operator += (std::ptrdiff_t n) {
  79.     ptr += 2 * n;
  80.     return *this;
  81.   }
  82.   friend ScaledPointer operator + (const ScaledPointer& u, std::ptrdiff_t n) {
  83.     ScaledPointer tmp = u;
  84.     tmp += n;
  85.     return tmp;
  86.   }
  87.  
  88.  
  89.   ScaledPointer& operator -= (std::ptrdiff_t n) {
  90.     ptr -= 2 * n;
  91.     return *this;
  92.   }
  93.   friend ScaledPointer operator - (const ScaledPointer& u, std::ptrdiff_t n) {
  94.     ScaledPointer tmp = u;
  95.     tmp -= n;
  96.     return tmp;
  97.   }
  98.  
  99.   friend std::ptrdiff_t operator - (const ScaledPointer& a, const ScaledPointer& b) {
  100.     return (a.ptr - b.ptr) / 2;
  101.   }
  102. };
  103.  
  104. template <typename T>
  105. class ScaledAllocator {
  106. public:
  107.   typedef ScaledPointer<T> pointer;
  108.   typedef T value_type;
  109.   typedef std::size_t size_type;
  110.  
  111.   pointer allocate(size_type n) {
  112.     const std::size_t size = (n * (2 * sizeof(T)));
  113.     void* p = ::operator new(size);
  114.     std::cout << __FUNCTION__ << '(' << n << ") = " << p << std::endl;
  115.     std::fill_n((unsigned*)p, size / sizeof(unsigned), 0xFEEDFACEU);
  116.     return pointer{p};
  117.   }
  118.  
  119.   void deallocate(pointer p, size_type n) {
  120.     std::cout << __FUNCTION__ << '(' << &*p << ", " << n << ')' << std::endl;
  121.     ::operator delete(&*p);
  122.   }
  123.  
  124.   static size_type max_size() {
  125.     return std::numeric_limits<size_type>::max() / 2;
  126.   }
  127.  
  128.   template <typename U, typename V>
  129.   friend bool operator == (const ScaledAllocator<U>&, const ScaledAllocator<V>&) {
  130.     return true;
  131.   }
  132.   template <typename U, typename V>
  133.   friend bool operator != (const ScaledAllocator<U>&, const ScaledAllocator<U>&) {
  134.     return false;
  135.   }
  136. };
  137.  
  138. #include <algorithm>
  139. #include <vector>
  140.  
  141. int main() {
  142.   using namespace std;
  143.   cout << hex << showbase;
  144.  
  145.   vector<unsigned, ScaledAllocator<unsigned>> vec = {0,1,2,3,4};
  146.   for_each(begin(vec), end(vec), [](unsigned i){ cout << i << ' '; });
  147.   cout << endl;
  148.  
  149.   auto p = vec.data();
  150.   for(auto i = decltype(vec.size()){0}, n = vec.size(); i < n; ++i)
  151.     cout << p[i] << ' ';
  152.   cout << endl;
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement