Advertisement
tomdodd4598

Untitled

Oct 23rd, 2021
903
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.52 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include "iterator.h"
  4.  
  5. #include <iostream>
  6. #include <memory>
  7. #include <string>
  8. #include <utility>
  9.  
  10. template <typename T>
  11. struct Item {
  12.     T value;
  13.     std::unique_ptr<Item<T>> next;
  14.  
  15.     template <typename U>
  16.     Item<T>(U&& val, std::unique_ptr<Item<T>>&& nxt) : value{ std::forward<U>(val) }, next{ std::move(nxt) } {
  17.         std::cout << "Creating item: " << value << "\n";
  18.     }
  19.  
  20.     ~Item<T>() {
  21.         std::cout << "Deleting item: " << value << "\n";
  22.     }
  23.  
  24.     Item<T>(const Item<T>& oth) = delete;
  25.  
  26.     Item<T>(Item<T>&& oth) noexcept {
  27.         value = std::move(oth.value);
  28.         next = std::move(oth.next);
  29.     }
  30.  
  31.     Item<T>& operator=(const Item<T>& oth) = delete;
  32.  
  33.     Item<T>& operator=(Item<T>&& oth) noexcept {
  34.         if (this != &oth) {
  35.             value = std::move(oth.value);
  36.             next = std::move(oth.next);
  37.         }
  38.         return *this;
  39.     }
  40.  
  41.     Item<T>& operator[](int n) {
  42.         auto item = this;
  43.         for (int i = 0; i < n; ++i) {
  44.             item = item->next.get();
  45.         }
  46.         return *item;
  47.     }
  48.  
  49.     struct ItemIterator : Iterator<Item<T>> {
  50.  
  51.         ItemIterator(Item<T>* start) : Iterator<Item<T>>(start) {}
  52.  
  53.         Iterator<Item<T>>& operator++() override {
  54.             this->item = this->item->next.get();
  55.             return *this;
  56.         }
  57.  
  58.         Iterator<Item<T>>& operator--() override {
  59.             throw std::runtime_error("Decrement is unsupported!");
  60.         }
  61.     };
  62.  
  63.     ItemIterator begin() {
  64.         return ItemIterator(this);
  65.     }
  66.  
  67.     ItemIterator end() const {
  68.         return ItemIterator(nullptr);
  69.     }
  70.  
  71.     Item<T>* print_get_next() const {
  72.         std::cout << value << (next ? ", " : "\n");
  73.         return next.get();
  74.     }
  75. };
  76.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement