Advertisement
Guest User

Untitled

a guest
Oct 18th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.12 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cassert>
  3. #include <cstddef>
  4. #include <cstring>
  5. #include <iostream>
  6. #include <memory>
  7.  
  8. template<class T>
  9. struct RawMemory {
  10.     T* data = nullptr;
  11.     size_t cp = 0;
  12.  
  13.     RawMemory(size_t n = 0) {
  14.         data = static_cast<T*>(::operator new(n * sizeof(T)));
  15.         cp = n;
  16.     }
  17.     RawMemory(const RawMemory&) = delete;
  18.     RawMemory(const RawMemory&& other) {
  19.         swap(other);
  20.     }
  21.     ~RawMemory() {
  22.         ::operator delete(data);
  23.     }
  24.  
  25.     void swap(RawMemory& other) noexcept {
  26.         std::swap(data, other.data);
  27.         std::swap(cp, other.cp);
  28.     }
  29. };
  30.  
  31. template<class T>
  32. class Vector {
  33. private:
  34.     size_t sz = 0;
  35.     RawMemory<T> raw;
  36.  
  37. public:
  38.     Vector(size_t size = 0) : sz(size), raw(size) {
  39.         std::uninitialized_default_construct_n(raw.data, sz);
  40.     }
  41.     Vector(const Vector& other) : sz(other.sz), raw(other.sz) {
  42.         std::uninitialized_copy_n(other.raw.data, sz, raw.data);
  43.     }
  44.     Vector(Vector&& other) noexcept {
  45.         swap(other);
  46.     }
  47.     ~Vector() {
  48.         for (size_t i = 0; i < sz; ++i)
  49.             raw.data[i].~T();
  50.     }
  51.  
  52.     size_t size() const {
  53.         return sz;
  54.     }
  55.  
  56.     size_t capacity() const {
  57.         return raw.cp;
  58.     }
  59.  
  60.     void swap(Vector& other) {
  61.         std::swap(other.sz, sz);
  62.         raw.swap(other.raw);
  63.     }
  64.  
  65.     T* begin() const {
  66.         return raw.data;
  67.     }
  68.  
  69.     T* end() const {
  70.         return raw.data + sz;
  71.     }
  72.  
  73.     Vector& operator=(Vector&& other) {
  74.         swap(other);
  75.         return *this;
  76.     }
  77.  
  78.     Vector& operator=(const Vector& other) { // нужно исправить?
  79.         auto tmp(other);
  80.         swap(tmp);
  81.         return *this;
  82.     }
  83.  
  84.     void reserve(size_t cp) {
  85.         if (raw.cp < cp) {
  86.             try {
  87.                 size_t i = 0;
  88.                 RawMemory<T> tmp(cp);
  89.  
  90.                 try {
  91.                     for (; i < sz; ++i)
  92.                         new (tmp.data + i) T(raw.data[i]);
  93.                     for (size_t j = 0; j < sz; ++j)
  94.                         raw.data[j].~T();
  95.                     raw.swap(tmp);
  96.                 }
  97.                 catch (...) {
  98.                     for (size_t j = 0; j < i; ++j)
  99.                         raw.data[j].~T();
  100.                     throw;
  101.                 }
  102.             }
  103.             catch (...) {
  104.                 throw;
  105.             }
  106.         }
  107.     }
  108.  
  109.     void resize(size_t new_sz) {
  110.         if (new_sz >= raw.cp) {
  111.             try {
  112.                 size_t i = 0;
  113.                 RawMemory<T> tmp(new_sz);
  114.  
  115.                 try {
  116.                     for (; i < sz; ++i)
  117.                         new (tmp.data + i) T(raw.data[i]);
  118.                     for (size_t i = sz; i < new_sz; ++i)
  119.                         new (tmp.data + i) T();
  120.                     for (size_t i = new_sz; i < sz; ++i)
  121.                         raw.data[i].~T();
  122.                     for (size_t j = 0; j < sz; ++j)
  123.                         raw.data[j].~T();
  124.                     raw.swap(tmp);
  125.                 }
  126.                 catch (...) {
  127.                     for (size_t j = 0; j < i; ++j)
  128.                         raw.data[j].~T();
  129.                     throw;
  130.                 }
  131.             }
  132.             catch (...) {
  133.                 throw;
  134.             }
  135.         }
  136.         else {
  137.             for (size_t i = sz; i < new_sz; ++i)
  138.                 new (raw.data + i) T();
  139.             for (size_t i = new_sz; i < sz; ++i)
  140.                 raw.data[i].~T();
  141.         }
  142.  
  143.         sz = new_sz;
  144.     }
  145.  
  146.     void pop_back() {
  147.         raw.data[--sz].~T();
  148.     }
  149.  
  150.     void push_back(const T& elem) {
  151.         if (raw.cp == sz)
  152.             reserve(std::max<size_t>(1, 2 * sz));
  153.         new (raw.data + sz++) T(elem);
  154.     }
  155.  
  156.     void push_back(T&& elem) {
  157.         if (raw.cp == sz)
  158.             reserve(std::max<size_t>(1, 2 * sz));
  159.         new (raw.data + sz++) T(std::move(elem));
  160.     }
  161.  
  162.     T operator[](size_t i) const {
  163.         return raw.data[i];
  164.     }
  165.  
  166.     T& operator[](size_t i) {
  167.         return raw.data[i];
  168.     }
  169.  
  170.     void clear() {
  171.         Vector<T> tmp;
  172.         swap(tmp);
  173.     }
  174. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement