Guest User

Untitled

a guest
Jul 1st, 2012
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.51 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <cstdio>
  4. #include <cstring>
  5.  
  6. namespace ss {
  7.  
  8.   template < typename T >
  9.   struct ListElement {
  10.     T value;
  11.     ListElement<T> * next = nullptr;
  12.   };
  13.  
  14.   template < typename T >
  15.   class List {
  16.    private:
  17.     unsigned int count = 0;
  18.     ListElement<T> * head = nullptr;
  19.     ListElement<T> * tail = nullptr;
  20.  
  21.     template < typename U >
  22.     friend std::ostream & operator<< (std::ostream &, const List<U> &);
  23.  
  24.    public:
  25.     List();
  26.     List(const T &);
  27.     //List(const T &, const T & ...);
  28.     ~List();
  29.     void push_back(const T &);
  30.     /*template < typename ... Ts >*/ void push_back(const T &, const /*Ts*/ T & ...);
  31.   };
  32.  
  33.   template < typename T >
  34.   List<T>::List() {
  35.     std::cerr << "\033[0;33m# ctor\033[0m" << std::endl;
  36.     //count = 0;
  37.     //head = nullptr;
  38.     //tail = nullptr;
  39.   }
  40.  
  41.   template < typename T >
  42.   List<T>::List(const T & x) {
  43.     push_back(x);
  44.   }
  45.  
  46.   /*
  47.   template < typename T >
  48.   List<T>::List(const T & x, const T & ... args) {
  49.     push_back(x);
  50.     push_back(args...);
  51.   }
  52.   */
  53.  
  54.   template < typename T >
  55.   List<T>::~List() {
  56.     std::cerr << "\033[0;35m# dtor\033[0m" << std::endl;
  57.     ListElement<T> * t = nullptr;
  58.     while (head != nullptr) {
  59.       t = head->next;
  60.       delete head;
  61.       head = t;
  62.     }
  63.     tail = nullptr;
  64.     count = 0;
  65.   }
  66.  
  67.   template < typename T >
  68.   std::ostream & operator<<(std::ostream & os, const List<T> & l) {
  69.     os << "[";
  70.     auto t = l.head;
  71.     while (t != nullptr) {
  72.       os << t->value;
  73.       if (t != l.tail) {
  74.         os << ", ";
  75.       }
  76.       t = t->next;
  77.     }
  78.     os << "]";
  79.     return os;
  80.   }
  81.  
  82.   template < typename T >
  83.   void List<T>::push_back(const T & x) {
  84.     if (head == nullptr) {
  85.       head = new ListElement<T>;
  86.       head->value = x;
  87.       //head->next = nullptr;
  88.       tail = head;
  89.     } else {
  90.       auto old_tail = tail;
  91.       tail = new ListElement<T>;
  92.       tail->value = x;
  93.       //tail->next = nullptr;
  94.       old_tail->next = tail;
  95.     }
  96.     count++;
  97.   }
  98.  
  99.   template < typename T /*, typename ... Ts*/ >
  100.   void List<T>::push_back(const T & x, const /*Ts*/ T & ... args) {
  101.     push_back(x);
  102.     pusk_back(args...);
  103.   }
  104.  
  105. /* End of ss namespace */
  106. }
  107.  
  108. int main() {
  109.   ss::List<int> l1;
  110.   l1.push_back(13);
  111.   l1.push_back(666);
  112.   std::cout << l1 << std::endl;
  113.  
  114.   ss::List<std::string> l2 ("lol");
  115.   std::cout << l2 << std::endl;
  116.  
  117.   //ss::List<int> l3 (13, 666);
  118.   //std::cout << l3 << std::endl;
  119.  
  120.   return 0;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment