Advertisement
Guest User

Untitled

a guest
Apr 26th, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.76 KB | None | 0 0
  1. #include <iostream>
  2. #include <memory>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <list>
  6. #pragma comment(linker, "/STACK:1488228666")
  7.  
  8. constexpr std::size_t size_of_block_allocation = (1 << 9);
  9.  
  10. class Block_Allocation
  11. {
  12. public:
  13.     char* begin_place;
  14.     std::size_t count_free_memory;
  15.     std::size_t count_used_memory;
  16.     using size_type = std::size_t;
  17.     using pointer = char*;
  18.     Block_Allocation* prev;
  19.  
  20.     Block_Allocation()
  21.     {
  22.         prev = nullptr;
  23.     }
  24.     Block_Allocation(const size_type count_memory, Block_Allocation* prev_)
  25.     {
  26.         begin_place = new char[count_memory];
  27.         count_free_memory = count_memory;
  28.         count_used_memory = 0;
  29.         prev = prev_;
  30.     }
  31.     ~Block_Allocation()
  32.     {
  33.         if (prev != nullptr)
  34.         {
  35.             delete prev;
  36.         }
  37.         delete[] begin_place;
  38.     }
  39.     pointer get_current_place()
  40.     {
  41.         return begin_place + count_used_memory;
  42.     }
  43.     pointer allocate(size_type cnt)
  44.     {
  45.         pointer ptr = get_current_place();
  46.         count_free_memory -= cnt;
  47.         count_used_memory += cnt;
  48.         return ptr;
  49.     }
  50.     void deallocate(size_type cnt)
  51.     {
  52.  
  53.     }
  54. };
  55.  
  56. class Universal_Allocator
  57. {
  58. public:
  59.     Block_Allocation* head;
  60.     //std::vector<Block_Allocation*> blocks;
  61. public:
  62.     typedef std::size_t size_type;
  63.     Universal_Allocator()
  64.     {
  65.         head = nullptr;
  66.     }
  67.     ~Universal_Allocator()
  68.     {
  69.         delete head;
  70.         //for (auto block : blocks)
  71.         //{
  72.         //  delete block;
  73.         //}
  74.     }
  75.     template < typename T >
  76.     T* allocate(const size_type count_object)
  77.     {
  78.         if (head != nullptr && (head->count_free_memory) >= count_object * sizeof(T))
  79.         {
  80.             return reinterpret_cast<T*>(head->allocate(count_object * sizeof(T)));
  81.         }
  82.         else
  83.         {
  84.             Block_Allocation* new_block = new Block_Allocation(std::max(count_object * sizeof(T), size_of_block_allocation), head);
  85.             head = new_block;
  86.             //blocks.push_back(new_block);
  87.             return reinterpret_cast<T*>(head->allocate(count_object * sizeof(T)));
  88.         }
  89.         /*pointer ptr = blocks.back()->get_current_place();
  90.         if (blocks.back()->count_free_memory < size_of(T))
  91.         {
  92.         Block_Allocation* block = new Block_Allocation;
  93.         //ptr = &block;
  94.         blocks.push_back(*block);
  95.         ptr = &blocks.back()->;
  96.         }
  97.         while (count_object > 0)
  98.         {
  99.         size_type can_write = std::min(count_object, (blocks.back()->count_free_memory) / size_of(T));
  100.         blocks.back()->allocate(can_write * size_of(T));
  101.         count_object -= can_write;
  102.         if (count_object != 0)
  103.         {
  104.         Block_Allocation* block = new Block_Allocation;
  105.         blocks.push_back(*block);
  106.         }
  107.         }
  108.         return ptr;
  109.         */
  110.     }
  111. };
  112.  
  113. template < typename T >
  114. class Stack_Allocator
  115. {
  116. public:
  117.     std::shared_ptr<Universal_Allocator> allocator;
  118. public:
  119.     using pointer = T*;
  120.     using size_type = std::size_t;
  121.     using value_type = T;
  122.     template <typename U>
  123.     struct rebind
  124.     {
  125.         typedef Stack_Allocator<U> other;
  126.     };
  127.  
  128.  
  129.     //template <typename U>
  130.     //using rebind = Stack_Allocator<U>;
  131.  
  132.     Stack_Allocator() : allocator(std::make_shared<Universal_Allocator>())
  133.     {
  134.     }
  135.     template < class U >
  136.     Stack_Allocator(const Stack_Allocator<U>& other) : allocator(other.allocator) {};
  137.     ~Stack_Allocator()
  138.     {
  139.  
  140.     }
  141.     pointer allocate(size_type count_object)
  142.     {
  143.         return allocator->allocate<T>(count_object);
  144.     }
  145.     void deallocate(pointer ptr, size_type object)
  146.     {
  147.  
  148.     }
  149. };
  150.  
  151. template <typename T>
  152. T* get_xor_address(T* first, T* second)
  153. {
  154.     return reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(first) ^ reinterpret_cast<uintptr_t>(second));
  155. }
  156.  
  157.  
  158. template <typename T>
  159. class node
  160. {
  161. private:
  162.     node<T>* xor_neighbours;
  163.     T val;
  164. public:
  165.     node<T>(T value)
  166.     {
  167.         val = value;
  168.     }
  169.     node<T>(T value, node<T>* prev_value = nullptr, node* next_value = nullptr)
  170.     {
  171.         val = value;
  172.         xor_neighbours = get_xor_address(prev_value, next_value);
  173.     }
  174.     node<T>* get_next(node<T>* pred)
  175.     {
  176.         return xor_address(pred, xor_neighbours);
  177.     }
  178.     node<T>* get_prev(node<T>* next)
  179.     {
  180.         return xor_address(next, xor_neighbours);
  181.     }
  182.     void update(node<T>* other)
  183.     {
  184.         if (this != nullptr)
  185.         {
  186.             xor_neighbours ^= other;
  187.         }
  188.     }
  189.  
  190. };
  191.  
  192. template <typename T>
  193. class Xor_List_iterator : public std::iterator < std::bidirectional_iterator_tag, T>
  194. {
  195. private:
  196.     node<T>* current_node;
  197.     node<T>* prev_node;
  198. public:
  199.     Xor_List_iterator(const node<T>* current_node_, const node<T>* prev_node_) : current_node(current_node_), prev_node(prev_node_)
  200.     {
  201.  
  202.     }
  203.     Xor_List_iterator& operator=(const Xor_List_iterator& it)
  204.     {
  205.         current_node = it.current_node;
  206.         prev_node = it.prev_node;
  207.         return (*this);
  208.     }
  209.     bool operator==(const Xor_List_iterator& it) const
  210.     {
  211.         return (current_node == it.current_node && prev_node == it.prev_node);
  212.     }
  213.     bool operator!=(const Xor_List_iterator& it) const
  214.     {
  215.         return !(current_node == it.current_node && prev_node == it.prev_node);
  216.     }
  217.     T& operator*()
  218.     {
  219.         return (*current_node);
  220.     }
  221.     T* operator->()
  222.     {
  223.         return current_node;
  224.     }
  225.     // a b c d e  
  226.     Xor_List_iterator& operator++()
  227.     {
  228.         node<T>* new_current_code = get_xor_address<node<T>>(current_node->xor_neighbours, prev_node);
  229.         node<T>* new_current_node = reinterpret_cast<node<T>*>(reinterpret_cast<uintptr_t>(current_node->xor_neighbours)
  230.             ^ (reinterpret_cast<uintptr_t>(prev_node)));
  231.         prev_node = current_node;
  232.         current_node = new_current_node;
  233.         return (*this);
  234.     }
  235.  
  236.     Xor_List_iterator operator++(int)
  237.     {
  238.         Xor_List_iterator it = *this;
  239.         (*this).operator++();
  240.         return it;
  241.     }
  242.     Xor_List_iterator& operator--()
  243.     {
  244.         node<T>* new_prev_node = get_xor_address<node>(current_node, prev_node->xor_neighbours);
  245.         current_node = prev_node;
  246.         prev_node = new_prev_node;
  247.         return (*this);
  248.     }
  249.     Xor_List_iterator operator--(int)
  250.     {
  251.         Xor_List_iterator it = *this;
  252.         (*this).operator--();
  253.         return it;
  254.     }
  255. };
  256.  
  257. //std::list<int, Stack_Allocator<int>>
  258.  
  259. //template <typename T>
  260. //T* get_xor_address(T* first, T* second)
  261. //{
  262. //  return reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(first) ^ reinterpret_cast<uintptr_t>(second));
  263. //}
  264.  
  265. template < typename T, typename Allocator>
  266. class Xor_List
  267. {
  268. public:
  269.     using size_type = std::size_t;
  270.     //using size_type = std::size;
  271.     using iterator = Xor_List_iterator<T>;
  272.     using const_iterator = Xor_List_iterator<const T>;
  273.     using reverse_iterator = std::reverse_iterator<iterator>;
  274.     using const_reverse_iterator = std::reverse_iterator<const_iterator>;
  275.  
  276.     typename Allocator::template rebind<node>::other allocator;
  277.     node<T>* it_begin;
  278.     node<T>* it_end;
  279.     size_type size_list;
  280.  
  281.     explicit Xor_List(const Allocator& alloc = Allocator()) : allocator(alloc), it_begin(nullptr), it_end(nullptr), size_list(0) {};
  282.     iterator begin()
  283.     {
  284.         return iterator(begin, nullptr);
  285.     }
  286.     iterator end()
  287.     {
  288.         return iterator(nullptr, end);
  289.     }
  290.     const_iterator begin() const
  291.     {
  292.         return const_iterator(begin, nullptr);
  293.     }
  294.     const_iterator cbegin() const
  295.     {
  296.         return const_iterator(begin, nullptr);
  297.     }
  298.     const_iterator end() const
  299.     {
  300.         return const_iterator(nullptr, end);
  301.     }
  302.     const_iterator cend() const
  303.     {
  304.         return const_iterator(nullptr, end);
  305.     }
  306.     reverse_iterator rbegin()
  307.     {
  308.         return reverse_iterator(end());
  309.     }
  310.     reverse_iterator rend()
  311.     {
  312.         return reverse_iterator(begin());
  313.     }
  314.     const const_reverse_iterator rbegin() const
  315.     {
  316.         return const_reverse_iterator(end());
  317.     }
  318.     const const_reverse_iterator crbegin() const
  319.     {
  320.         return const_reverse_iterator(end());
  321.     }
  322.     const const_reverse_iterator rend() const
  323.     {
  324.         return const_reverse_iterator(begin());
  325.     }
  326.     const const_reverse_iterator crend() const
  327.     {
  328.         return const_reverse_iterator(begin());
  329.     }
  330.     Xor_List(size_type count, const T& value = T(), const Allocator& alloc = Allocator()) : allocator(alloc), size_list(count)
  331.     {
  332.         it_end = nullptr;
  333.         it_begin = nullptr;
  334.         for (size_type i = 0; i < count; i++)
  335.         {
  336.             push_back(value);
  337.         }
  338.     }
  339.     Xor_List(const Xor_List& other)
  340.     {
  341.         allocator = other.allocator;
  342.         it_begin = other.it_begin;
  343.         it_end = other.it_end;
  344.         size = other.size;
  345.     }
  346.     Xor_List(const Xor_List&& other)
  347.     {
  348.         allocator = std::move(other.allocator);
  349.         it_begin = std::move(other.it_begin);
  350.         it_end = std::move(other.it_end);
  351.         size = std::move(other.size);
  352.     }
  353.     ~Xor_List()
  354.     {
  355.         for (size_type i = 0; i < size_list; i++)
  356.         {
  357.             erase(begin);
  358.         }
  359.     }
  360.     node<T>* create_new_node(T value, node<T>* prev_value = nullptr, node<T>* next_value = nullptr)
  361.     {
  362.         return placement_new(allocator->allocate(1), node<T>(value, prev_value, next_value));
  363.     }
  364.     void delete_node(node<T>* current_node)
  365.     {
  366.         placement_delete(current_node);
  367.         allocator->deallocate(current_node);
  368.     }
  369.     Xor_List& operator=(const Xor_List& other)
  370.     {
  371.         allocator = other.allocator;
  372.         it_begin = other.it_begin;
  373.         it_end = other.it_end;
  374.         size = other.size;
  375.         return (*this);
  376.     }
  377.     Xor_List&& operator=(const Xor_List&& other)
  378.     {
  379.         allocator = std::move(other.allocator);
  380.         it_begin = std::move(other.it_begin);
  381.         it_end = std::move(other.it_end);
  382.         size = std::move(other.size);
  383.         return (*this);
  384.     }
  385.     size_type size()
  386.     {
  387.         return size_list;
  388.     }
  389.     void push_back(const T& value)
  390.     {
  391.         insert_after(--end(), value);
  392.     }
  393.     void push_back(T&& value)
  394.     {
  395.         insert_after(--end(), value);
  396.     }
  397.     void push_front(const T& value)
  398.     {
  399.         insert_before(begin(), value);
  400.     }
  401.     void push_front(T&& value)
  402.     {
  403.         insert_before(begin(), value);
  404.     }
  405.     void pop_back()
  406.     {
  407.         erase(--end());
  408.     }
  409.     void pop_front()
  410.     {
  411.         erase(begin());
  412.     }
  413.     void insert_before(iterator it, const T& value)
  414.     {
  415.         if (it == nullptr)
  416.         {
  417.             node<T>* current = create_new_node(value, nullptr, nullptr);
  418.             it_begin = current;
  419.             it_end = current;
  420.             size_list++;
  421.             return;
  422.         }
  423.         iterator it1 = --it;
  424.         it++;
  425.         node<T>* prev = *it1;
  426.         node<T>* next = *it;
  427.         node<T>* current = create_new_node(value, prev, next);
  428.         prev->update(current);
  429.         next->update(current);
  430.         if (it_begin == next)
  431.         {
  432.             it_begin = current;
  433.         }
  434.         size_list++;
  435.     }
  436.     void insert_before(iterator it, T&& value)
  437.     {
  438.         if (it == nullptr)
  439.         {
  440.             node<T>* current = create_new_node(std::move(value), nullptr, nullptr);
  441.             it_begin = current;
  442.             it_end = current;
  443.             size_list++;
  444.             return;
  445.         }
  446.         iterator it1 = --it;
  447.         it++;
  448.         node<T>* prev = *it1;
  449.         node<T>* next = *it;
  450.         node<T>* current = create_new_node(std::move(value), prev, next);
  451.         prev->update(current);
  452.         next->update(current);
  453.         if (it_begin == next)
  454.         {
  455.             it_begin = current;
  456.         }
  457.         size_list++;
  458.     }
  459.     void insert_after(iterator it, const T& value)
  460.     {
  461.         if (it == nullptr)
  462.         {
  463.             node<T>* current = create_new_node(value, nullptr, nullptr);
  464.             it_begin = current;
  465.             it_end = current;
  466.             size_list++;
  467.             return;
  468.         }
  469.         iterator it1 = ++it;
  470.         it--;
  471.         node<T>* next = *it1;
  472.         node<T>* prev = *it;
  473.         node<T>* current = create_new_node(value, prev, next);
  474.         prev->update(current);
  475.         next->update(current);
  476.         if (it_end == prev)
  477.         {
  478.             it_end = current;
  479.         }
  480.         size_list++;
  481.     }
  482.     void insert_after(iterator it, T&& value)
  483.     {
  484.         if (it == nullptr)
  485.         {
  486.             node<T>* current = create_new_node(std::move(value), nullptr, nullptr);
  487.             it_begin = current;
  488.             it_end = current;
  489.             size_list++;
  490.             return;
  491.         }
  492.         iterator it1 = ++it;
  493.         it--;
  494.         node<T>* next = *it1;
  495.         node<T>* prev = *it;
  496.         node<T>* current = create_new_node(std::move(value), prev, next);
  497.         prev->update(current);
  498.         next->update(current);
  499.         if (it_end == prev)
  500.         {
  501.             it_end = current;
  502.         }
  503.         size_list++;
  504.     }
  505.     void erase(iterator it)
  506.     {
  507.         node<T>* prev = *(--it);
  508.         it++;
  509.         node<T>* next = *(++it);
  510.         node<T>* current = *(--it);
  511.         node<T>* prev1 = prev;
  512.         prev.update(current);
  513.         prev.update(next);
  514.         next.update(current);
  515.         next.update(prev1);
  516.         size_list--;
  517.         if (it == it_begin)
  518.         {
  519.             it_begin = next;
  520.         }
  521.         if (it == it_end)
  522.         {
  523.             it_end = prev;
  524.         }
  525.         delete_node(current);
  526.     }
  527. };
  528.  
  529.  int main()
  530.  {
  531. //     Stack_Allocator<int> allocator;
  532. //     allocator.allocate(10000);
  533. //     std::list<int, Stack_Allocator<int>> list1;
  534. //     //for (int i = 1; i <= 600000; i++)
  535. //     //{
  536. //     //  list1.push_back(5);
  537. //     //}
  538.      return 0;
  539.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement