Advertisement
Guest User

Untitled

a guest
Apr 8th, 2020
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.52 KB | None | 0 0
  1.  
  2. #include <cstddef>
  3. #include <iostream>
  4.  
  5. template <class T>
  6. void Copy(const T* buffer_from, size_t count, T* buffer_to) {
  7.     for (size_t i = 0; i < count; ++i) {
  8.         buffer_to[i] = buffer_from[i];
  9.     }
  10. }
  11.  
  12. template <class T>
  13. void Swap(T& a, T& b) {
  14.     T c = a;
  15.     a = b;
  16.     b = c;
  17. }
  18.  
  19. template <class T>
  20. class CircularBuffer {
  21.     T* buffer_;
  22.     size_t capacity_;
  23.     size_t begin_;
  24.     size_t end_;
  25.     size_t size_;
  26.  
  27.     const static int kIncreaseFactor = 2;
  28.  
  29.     void BufferReallocation(T* buffer, size_t new_cap) {
  30.         delete[] buffer_;
  31.         buffer_ = (new_cap == 0) ? nullptr : new T[new_cap];
  32.         capacity_ = new_cap;
  33.     }
  34.  
  35. public:
  36.     CircularBuffer()
  37.         : buffer_(nullptr),
  38.           capacity_(0),
  39.           begin_(0),
  40.           end_(0),
  41.           size_(0) {
  42.     }
  43.  
  44.     explicit CircularBuffer(size_t count) : CircularBuffer() {
  45.         capacity_ = count;
  46.         if (count != 0) {
  47.             buffer_ = new T[count];
  48.         }
  49.     }
  50.  
  51.     CircularBuffer(const CircularBuffer& other)
  52.         : begin_(other.begin_),
  53.           end_(other.end_),
  54.           size_(other.Size()) {
  55.         BufferReallocation(buffer_, other.Capacity());
  56.     }
  57.  
  58.     CircularBuffer& operator=(const CircularBuffer& other) {
  59.         if (this == &other) {
  60.             return *this;
  61.         }
  62.  
  63.         begin_ = other.begin_;
  64.         end_ = other.end_;
  65.         size_ = other.size_;
  66.  
  67.         BufferReallocation(other.capacity_);
  68.     }
  69.  
  70.     ~CircularBuffer() {
  71.         delete[] buffer_;
  72.     }
  73.  
  74.     T& operator[](size_t idx) {
  75.         return buffer_[(begin_ + idx) % Capacity()];
  76.     }
  77.  
  78.     const T& operator[](size_t idx) const {
  79.         return buffer_[(begin_ + idx) % Capacity()];
  80.     }
  81.  
  82.     const T& Front() const {
  83.         return buffer_[begin_];
  84.     }
  85.  
  86.     T& Front() {
  87.         return buffer_[begin_];
  88.     }
  89.  
  90.     const T& Back() const {
  91.         return buffer_[end_];
  92.     }
  93.  
  94.     T& Back() {
  95.         return buffer_[end_];
  96.     }
  97.  
  98.     size_t Size() const {
  99.         return size_;
  100.     }
  101.  
  102.     size_t Capacity() const {
  103.         return capacity_;
  104.     }
  105.  
  106.     bool Empty() const {
  107.         return Size() == 0;
  108.     }
  109.  
  110.     void PushFront(const T& val) {
  111.         if (Empty()) {
  112.             if (Capacity() == 0) {
  113.                 Reserve(1);
  114.             }
  115.             begin_ = 0;
  116.             end_ = 0;
  117.         } else {
  118.             if (Size() == Capacity()) {
  119.                 Reserve(Capacity() * kIncreaseFactor);
  120.             }
  121.             begin_ = (begin_ - 1 + Capacity()) % Capacity();
  122.         }
  123.  
  124.         buffer_[begin_] = val;
  125.         ++size_;
  126.     }
  127.  
  128.     void PushBack(const T& val) {
  129.         if (Empty()) {
  130.             if (Capacity() == 0) {
  131.                 Reserve(1);
  132.             }
  133.             begin_ = 0;
  134.             end_ = 0;
  135.         } else {
  136.             if (Size() == Capacity()) {
  137.                 Reserve(Capacity() * kIncreaseFactor);
  138.             }
  139.             end_ = (end_ + 1) % Capacity();
  140.         }
  141.  
  142.         buffer_[end_] = val;
  143.         ++size_;
  144.     }
  145.  
  146.     void PopBack() {
  147.         if (!Empty()) {
  148.             end_ = (end_ - 1 + Capacity()) % Capacity();
  149.             --size_;
  150.         }
  151.     }
  152.  
  153.     void PopFront() {
  154.         if (!Empty()) {
  155.             begin_ = (begin_ + 1) % Capacity();
  156.             --size_;
  157.         }
  158.     }
  159.  
  160.     void Clear() {
  161.         size_ = 0;
  162.         end_ = begin_;
  163.     }
  164.  
  165.     void Reserve(int new_cap) {
  166.         if (new_cap <= Capacity()) {
  167.             return;
  168.         }
  169.  
  170.         T* new_buffer = new T[new_cap];
  171.         for (size_t i = 0; i < Size(); ++i) {
  172.             new_buffer[i] = buffer_[(begin_ + i) % Capacity()];
  173.         }
  174.  
  175.         capacity_ = new_cap;
  176.         begin_ = 0;
  177.         end_ = begin_ + Size() - 1;
  178.  
  179.         delete[] buffer_;
  180.         buffer_ = new_buffer;
  181.     }
  182.  
  183.     void Swap(CircularBuffer<T>& other) {
  184.         ::Swap(buffer_, other.buffer_);
  185.         ::Swap(capacity_, other.capacity_);
  186.         ::Swap(begin_, other.begin_);
  187.         ::Swap(end_, other.end_);
  188.         ::Swap(size_, other.size_);
  189.     }
  190. };
  191.  
  192.  
  193. #include <cstddef>
  194.  
  195. template <class T, size_t N>
  196. class Page {
  197.     T buffer_[N];
  198.     size_t size_;
  199.     size_t begin_;
  200.  
  201. public:
  202.     Page() : size_(0), begin_(0) {
  203.     }
  204.  
  205.     Page(const Page& other) = default;
  206.     Page& operator=(const Page& other) = default;
  207.     ~Page() = default;
  208.  
  209.     T& operator[](size_t idx) {
  210.         return buffer_[begin_ + idx];
  211.     }
  212.  
  213.     const T& operator[](size_t idx) const {
  214.         return buffer_[begin_ + idx];
  215.     }
  216.  
  217.     const T& Front() const {
  218.         return buffer_[begin_];
  219.     }
  220.  
  221.     T& Front() {
  222.         return buffer_[begin_];
  223.     }
  224.  
  225.     const T& Back() const {
  226.         return buffer_[begin_ + size_ - 1];
  227.     }
  228.  
  229.     T& Back() {
  230.         return buffer_[begin_ + size_ - 1];
  231.     }
  232.  
  233.     bool Empty() const {
  234.         return Size() == 0;
  235.     }
  236.  
  237.     size_t Size() const {
  238.         return size_;
  239.     }
  240.  
  241.     bool Full() const {
  242.         return Size() == N;
  243.     }
  244.  
  245.     bool IsBack() const {
  246.         return Empty() || (begin_ == 0 && !Full());
  247.     }
  248.  
  249.     bool IsFront() const {
  250.         return Empty() || (begin_ != 0 && !Full());
  251.     }
  252.  
  253.     void PushBack(const T& val) {
  254.         if (!IsBack()) {
  255.             return;
  256.         }
  257.  
  258.         if (Empty()) {
  259.             begin_ = 0;
  260.         }
  261.  
  262.         buffer_[size_++] = val;
  263.     }
  264.  
  265.     void PushFront(const T& val) {
  266.         if (!IsFront()) {
  267.             return;
  268.         }
  269.  
  270.         if (Empty()) {
  271.             begin_ = N;
  272.         }
  273.  
  274.         buffer_[--begin_] = val;
  275.         ++size_;
  276.     }
  277.  
  278.     void PopBack() {
  279.         if (Empty()) {
  280.             return;
  281.         }
  282.  
  283.         --size_;
  284.     }
  285.  
  286.     void PopFront() {
  287.         if (Empty()) {
  288.             return;
  289.         }
  290.  
  291.         --size_;
  292.         ++begin_;
  293.     }
  294.  
  295.     void Clear() {
  296.         size_ = 0;
  297.     }
  298. };
  299.  
  300.  
  301. //deque
  302.  
  303.  
  304. template <class T>
  305. void swap(T& a, T& b) {
  306.     T tmp = a;
  307.     a = b;
  308.     b = tmp;
  309. }
  310.  
  311. template <class T>
  312. class Deque {
  313.     const static size_t kPageSize = 100;
  314.  
  315.     CircularBuffer<Page<T, kPageSize>*> cb_;
  316.  
  317. public:
  318.     Deque() : cb_() {
  319.     }
  320.  
  321.     Deque(const Deque& other) : cb_(other.cb_) {
  322.     }
  323.  
  324.     Deque& operator=(const Deque& other) {
  325.         if (&other == this) {
  326.             return *this;
  327.         }
  328.  
  329.         ~cb_();
  330.         cb_ = other.cb_;
  331.         return *this;
  332.     }
  333.  
  334.     ~Deque() {
  335.         for (size_t i = 0; i < cb_.Size(); ++i) {
  336.             delete cb_[i];
  337.         }
  338.     }
  339.  
  340.     T& operator[](size_t idx) {
  341.         if (idx < cb_.Front()->Size()) {
  342.             return (*cb_.Front())[idx];
  343.         }
  344.  
  345.         size_t page_idx = (idx - cb_.Front()->Size()) / kPageSize;
  346.         return (*cb_[page_idx + 1])[(idx - cb_.Front()->Size()) % kPageSize];
  347.     }
  348.  
  349.     const T& operator[](size_t idx) const {
  350.         if (idx < cb_.Front()->Size()) {
  351.             return (*cb_.Front())[idx];
  352.         } else {
  353.             size_t page_idx = (idx - cb_.Front()->Size()) / kPageSize;
  354.             return (*cb_[page_idx + 1])[(idx - cb_.Front()->Size()) % kPageSize];
  355.         }
  356.     }
  357.  
  358.     size_t Size() const {
  359.         size_t res = 0;
  360.         for (size_t i = 0; i < cb_.Size(); ++i) {
  361.             res += cb_[i]->Size();
  362.         }
  363.  
  364.         return res;
  365.     }
  366.  
  367.     void Swap(Deque& other) {
  368.         swap(cb_, other.cb_);
  369.     }
  370.  
  371.     void PushBack(const T& value) {
  372.         if (cb_.Empty() || !(cb_.Back()->IsBack())) {
  373.             cb_.PushBack(new Page<T, kPageSize>);
  374.         }
  375.  
  376.         cb_.Back()->PushBack(value);
  377.     }
  378.  
  379.     void PushFront(const T& value) {
  380.         if (cb_.Empty() || !(cb_.Front()->IsFront())) {
  381.             cb_.PushFront(new Page<T, kPageSize>);
  382.         }
  383.  
  384.         cb_.Front()->PushFront(value);
  385.     }
  386.  
  387.     void PopBack() {
  388.         if (cb_.Empty()) {
  389.             return;
  390.         }
  391.  
  392.         cb_.Back()->PopBack();
  393.         if (cb_.Back->Empty()) {
  394.             delete cb_.Back();
  395.             cb_.PopBack();
  396.         }
  397.     }
  398.  
  399.     void PopFront() {
  400.         if (cb_.Empty()) {
  401.             return;
  402.         }
  403.  
  404.         cb_.Front()->PopFront();
  405.         if (cb_.Front()->Empty()) {
  406.             delete cb_.Front();
  407.             cb_.PopFront();
  408.         }
  409.     }
  410.  
  411.     void Clear() {
  412.         for (size_t i = 0; i < Size(); ++i) {
  413.             delete cb_[i];
  414.         }
  415.  
  416.         cb_.Clear();
  417.     }
  418. };
  419.  
  420. #include <iostream>
  421.  
  422. using namespace std;
  423.  
  424. int main()
  425. {
  426.     Deque<int> a;
  427.    
  428.     a.PushFront(2);
  429.     a.PushFront(1);
  430.     a.PushBack(3);
  431.    
  432.     cout << a[0] << " " << a[1] << " " << a[2];
  433.    
  434.     return 0;
  435. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement