--sas

Untitled

Jun 6th, 2019
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.39 KB | None | 0 0
  1. //
  2. // Created by stas on 6/2/19.
  3. //
  4.  
  5. #pragma once
  6.  
  7. #include <iterator>
  8.  
  9. template <typename T>
  10. class FNode {
  11. public:
  12.     explicit FNode(const FNode* next = nullptr) : next_(next) {};
  13.     explicit FNode(const T& value, const FNode* next = nullptr) :
  14.             value_(value),
  15.             next_(next) {};
  16.  
  17.     FNode* next_;
  18.     T value_;
  19. };
  20.  
  21. template <typename T>
  22. class ForwardList {
  23. public:
  24.     ForwardList();
  25.     explicit ForwardList(unsigned int size);
  26.     ForwardList(unsigned int size, const T& value);
  27.     ForwardList(const ForwardList<T>& other);
  28.  
  29.     template <typename InputIt>
  30.     ForwardList(InputIt fst, InputIt lst);
  31.  
  32.     ~ForwardList();
  33.  
  34.     void clear();
  35.     FNode<T>* erase_after(FNode<T>* node);
  36.     ForwardList<T>& operator= (const ForwardList<T>& other);
  37.  
  38.     void assign(unsigned int size, const T& value);
  39.  
  40.     template <typename InputIt>
  41.     void assign(InputIt fst, InputIt lst);
  42.  
  43.     unsigned int size() const;
  44.  
  45. private:
  46.     FNode<T>* before_top_;
  47. };
  48.  
  49. template <typename T>
  50. unsigned int ForwardList<T>::size() const {
  51.     unsigned size = 0;
  52.     FNode<T>* node = before_top_;
  53.     for (; node->next_ != nullptr; node = node->next_)
  54.         ++size;
  55.     return size;
  56. }
  57.  
  58. template <typename T>
  59. ForwardList<T>::ForwardList() {
  60.     before_top_ = new FNode<T>;
  61.     before_top_->next_ = nullptr;
  62. }
  63.  
  64. template <typename T>
  65. ForwardList<T>::ForwardList(unsigned int size) {
  66.     before_top_ = new FNode<T>[size + 1];
  67.     for (unsigned i = 0; i < size; ++i) {
  68.         before_top_[i].next_ = before_top_ + i + 1;
  69.     }
  70.     before_top_[size].next_ = nullptr;
  71. }
  72.  
  73. template <typename T>
  74. ForwardList<T>::ForwardList(unsigned int size, const T& value) :
  75.     ForwardList(size)
  76. {
  77.     before_top_ = new FNode<T>[size + 1];
  78.     for (unsigned i = 0; i < size; ++i) {
  79.         before_top_[i].next_ = before_top_ + i + 1;
  80.         before_top_[i].next_->value_ = value;
  81.     }
  82.     before_top_[size].next_ = nullptr;
  83. }
  84.  
  85. template <typename T>
  86. template <typename InputIt>
  87. ForwardList<T>::ForwardList(InputIt fst, InputIt lst) :
  88.     ForwardList(std::distance(fst, lst) + 1)
  89. {
  90.     FNode<T>* node = before_top_;
  91.     for (auto it = fst; it != lst; ++it, node = node->next_)
  92.         node->next_->value_ = *it;
  93. }
  94.  
  95. template <typename T>
  96. ForwardList<T>::ForwardList(const ForwardList<T> &other) {
  97.     before_top_ = new FNode<T>[other.size() + 1];
  98.     FNode<T>* other_node = other.before_top_;
  99.     FNode<T>* node = before_top_;
  100.     while (other_node->next_ != nullptr) {
  101.         node->next_ = node + 1;
  102.         node->next_->value_ = other_node->next_->value_;
  103.         node = node->next_;
  104.         other_node = other_node->next_;
  105.     }
  106.     node->next_ = nullptr;
  107. }
  108.  
  109. template <typename T>
  110. FNode<T>* ForwardList<T>::erase_after(FNode<T>* node) {
  111.     FNode<T>* res = node->next_->next_;
  112.     delete node->next_;
  113.     return node->next_ = res;
  114. }
  115.  
  116. template <typename T>
  117. void ForwardList<T>::clear() {
  118.     FNode<T>* node = before_top_->next_;
  119.     FNode<T>* next_node = node->next_;
  120.     while (next_node != nullptr) {
  121.         delete node;
  122.         node = next_node;
  123.         next_node = node->next_;
  124.     }
  125.     delete node;
  126. }
  127.  
  128. template <typename T>
  129. ForwardList<T>::~ForwardList() {
  130.     clear();
  131.     delete before_top_;
  132. }
  133.  
  134. template <typename T>
  135. ForwardList<T>& ForwardList<T>::operator=(const ForwardList<T> &other) {
  136.     if (*this == other)
  137.         return *this;
  138.  
  139.     clear();
  140.  
  141.     before_top_ = new FNode<T>[other.size() + 1];
  142.     FNode<T>* other_node = other.before_top_;
  143.     FNode<T>* node = before_top_;
  144.     while (other_node->next_ != nullptr) {
  145.         node->next_ = node + 1;
  146.         node->next_->value_ = other_node->next_->value_;
  147.         node = node->next_;
  148.         other_node = other_node->next_;
  149.     }
  150.     node->next_ = nullptr;
  151. }
  152.  
  153. template <typename T>
  154. void ForwardList<T>::assign(unsigned int size, const T &value) {
  155.     clear();
  156.  
  157.     before_top_ = new FNode<T>[size + 1];
  158.     for (unsigned i = 0; i < size; ++i) {
  159.         before_top_[i].next_ = before_top_ + i + 1;
  160.         before_top_[i].next_->value_ = value;
  161.     }
  162.     before_top_[size].next_ = nullptr;
  163. }
  164.  
  165. template <typename T>
  166. template <typename InputIt>
  167. void ForwardList<T>::assign(InputIt fst, InputIt lst) {
  168.     clear();
  169.  
  170.     before_top_ = new FNode<T>[std::distance(fst, lst) + 1];
  171.     FNode<T>* node = before_top_;
  172.     for (auto it = fst; it != lst; ++it, node = node->next_) {
  173.  
  174.     }
  175. }
Advertisement
Add Comment
Please, Sign In to add comment