Advertisement
karlicoss

exam

Jun 28th, 2011
500
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.15 KB | None | 0 0
  1. //set.tpp
  2. template<typename T>
  3. set<T>::set(): head(NULL)
  4. {
  5. }
  6.  
  7. template<typename T>
  8. set<T>::set(const set<T>& other): head(other.head->clone())
  9. {
  10. }
  11.  
  12. template<typename T>
  13. template<typename FwdIter>
  14. set<T>::set(FwdIter start, FwdIter end) : head(NULL)
  15. {
  16.     for (FwdIter it = start; it != end; ++it)
  17.         insert(*it);
  18. }
  19.  
  20. template<typename T>
  21. set<T>& set<T>::operator=(set<T> other)
  22. {
  23.     swap(other);
  24.     return *this;
  25. }
  26.  
  27. template<typename T>
  28. void set<T>::swap(set<T>& other)
  29. {
  30.     std::swap(head, other->head);
  31. }
  32.  
  33. template<typename T>
  34. typename set<T>::iterator set<T>::find(const T& elem) const
  35. {
  36.     if (head == NULL)
  37.         return end();
  38.     return set<T>::iterator(head->find(elem));
  39. }
  40.  
  41. template<typename T>
  42. void set<T>::insert(const T& elem)
  43. {
  44.     if (head == NULL)
  45.         head = new node<T>(elem);
  46.     else
  47.         head->insert(elem);
  48. }
  49.  
  50. template<typename T>
  51. void set<T>::erase(const T& elem)
  52. {
  53.     if (head == NULL)
  54.         return;
  55.     node<T>* found = head->find(elem);
  56.     if (!found)
  57.         return;
  58.     else
  59.     {
  60.         bool need_fix = (head == found);
  61.         node<int>*tmp = details::node_erase(found);
  62.         if (need_fix)
  63.             head = tmp;
  64.     }
  65. }
  66.  
  67. template<typename T>
  68. set<T>::~set()
  69. {
  70.     delete head;
  71. }
  72.  
  73. template<typename T>
  74. typename set<T>::iterator set<T>::begin() const
  75. {
  76.     if (head == NULL)
  77.         return end();
  78.     else
  79.         return set::iterator(head->find_smallest());
  80. }
  81.  
  82. template<typename T>
  83. typename set<T>::iterator set<T>::end() const
  84. {
  85.     return set::iterator(NULL);
  86. }
  87.  
  88.  
  89.  
  90.  
  91. //set_iterator.tpp
  92. template<typename T>
  93. set<T>::iterator::iterator(): p(NULL)
  94. {
  95. }
  96.  
  97. template<typename T>
  98. set<T>::iterator::iterator(details::node<T>* b): p(b)
  99. {
  100. }
  101.  
  102. template<typename T>
  103. typename set<T>::iterator& set<T>::iterator::operator++()
  104. {
  105.     if (p->right)
  106.     {
  107.         p = p->right->find_smallest();
  108.     }
  109.     else if (p->parent && p->parent->left == p)
  110.     {
  111.         p = p->parent;
  112.     }
  113.     else
  114.     {
  115.         p = NULL;
  116.     }
  117.     return *this;
  118. }
  119.  
  120. template<typename T>
  121. typename set<T>::iterator set<T>::iterator::operator++(int)
  122. {
  123.     set<T>::iterator old = *this;
  124.     ++(*this);
  125.     return old;
  126. }
  127.  
  128. template<typename T>
  129. T& set<T>::iterator::operator*()
  130. {
  131.     if (p != NULL)
  132.         return p->data;
  133.     else
  134.         throw std::runtime_error("trying to dereference end iterator");
  135. }
  136.  
  137. template<typename T>
  138. bool set<T>::iterator::operator!=(const iterator &it) const
  139. {
  140.     return (p != it.p);
  141. }
  142.  
  143. template<typename T>
  144. bool set<T>::iterator::operator==(const iterator &it) const
  145. {
  146.     return !(*this != it);
  147. }
  148.  
  149.  
  150.  
  151.  
  152. //set_node.tpp
  153. namespace details
  154. {
  155.  
  156. template<typename T>
  157. class node
  158. {
  159. public:
  160.     node(): left(NULL), right(NULL), parent(NULL), data(0)
  161.     {
  162.     }
  163.     node(const T& d): left(NULL), right(NULL), parent(NULL), data(d)
  164.     {
  165.     }
  166.     node* clone() const
  167.     {
  168.         node* new_node = new node(data);
  169.         if (left)
  170.         {
  171.             new_node->left = left->clone();
  172.             new_node->left->parent = new_node;
  173.         }
  174.         if (right)
  175.         {
  176.             new_node->right = right->clone();
  177.             new_node->right->parent = new_node;
  178.         }
  179.         return new_node;
  180.     }
  181.     node* find(const T& b)
  182.     {
  183.         if (b == data)
  184.             return this;
  185.         if (b < data)
  186.         {
  187.             if (left)
  188.                 return left->find(b);
  189.             else
  190.                 return NULL;
  191.         }
  192.         else //b > data
  193.         {
  194.             if (right)
  195.                 return right->find(b);
  196.             else
  197.                 return NULL;
  198.         }
  199.     }
  200.     int children_count() const
  201.     {
  202.         int c = 0;
  203.         if (left != NULL)
  204.             c++;
  205.         if (right != NULL)
  206.             c++;
  207.         return c;
  208.     }
  209.     node* onechild()
  210.     {
  211.         if (left)
  212.             return left;
  213.         else
  214.             return right;
  215.     }
  216.     bool is_left_child() const
  217.     {
  218.         return (this->parent->left == this);
  219.     }
  220.     bool is_right_child() const
  221.     {
  222.         return !is_left_child();
  223.     }
  224.     node* find_greatest()
  225.     {
  226.         node* current = this;
  227.         while (current->right)
  228.             current = current->right;
  229.         return current;
  230.     }
  231.     node* find_smallest()
  232.     {
  233.         node* current = this;
  234.         while (current->left)
  235.             current = current->left;
  236.         return current;
  237.     }
  238.     void insert(const T& b)
  239.     {
  240.         if (b == data)
  241.             return;
  242.         if (b > data)
  243.         {
  244.             if (right)
  245.                 right->insert(b);
  246.             else
  247.             {
  248.                 right = new node<T>(b);
  249.                 right->parent = this;
  250.             }
  251.         }
  252.         else
  253.         {
  254.             if (left)
  255.                 left->insert(b);
  256.             else
  257.             {
  258.                 left = new node<T>(b);
  259.                 left->parent = this;
  260.             }
  261.         }
  262.     }
  263.     ~node()
  264.     {
  265.         if (left)
  266.         {
  267.             delete left;
  268.             left = NULL;
  269.         }
  270.         if (right)
  271.         {
  272.             delete right;
  273.             right = NULL;
  274.         }
  275.     }
  276.     template<typename T>
  277.     friend node* node_remove(node*);
  278.     node* left;
  279.     node* right;
  280.     node* parent;
  281.     T data;
  282. };
  283.  
  284. template<typename T>
  285. node<T>* node_erase(node<T>* rem)
  286. {
  287.     if (rem->children_count() == 0)
  288.     {
  289.         if (rem->parent)
  290.         {
  291.             if (rem->is_left_child())
  292.                 rem->parent->left = NULL;
  293.             else
  294.                 rem->parent->right = NULL;
  295.         }
  296.         delete rem;
  297.         return NULL;
  298.     }
  299.     else if (rem->children_count() == 1)
  300.     {
  301.         node<T>* ret = rem->onechild();
  302.         if (rem->parent)
  303.         {
  304.             rem->onechild()->parent = rem->parent;
  305.             if (rem->is_left_child())
  306.                 rem->parent->left = rem->onechild();
  307.             else
  308.                 rem->parent->right = rem->onechild();
  309.         }
  310.         else
  311.         {
  312.             rem->onechild()->parent = NULL;
  313.         }
  314.         rem->left = NULL;
  315.         rem->right = NULL;
  316.         delete rem;
  317.         return ret;
  318.     }
  319.     else //2 children
  320.     {
  321.         node<T>* replace = rem->left->find_greatest();
  322.         std::swap(rem->data, replace->data);
  323.         node_erase(replace);
  324.         return rem;
  325.     }
  326. }
  327.  
  328. }
  329.  
  330.  
  331.  
  332.  
  333. //set.hpp
  334. #include <iterator>
  335. #include <vector>
  336. #include <fstream>
  337. #include <sstream>
  338. #include <stdexcept>
  339.  
  340. #include "set_node.tpp"
  341.  
  342. template<typename T>
  343. class set
  344. {
  345. public:
  346.     class iterator;
  347.     set();
  348.     set(const set&);
  349.     template <typename FwdIter>
  350.     set(FwdIter start, FwdIter end);
  351.     set& operator=(set );
  352.     void swap(set&);
  353.     void insert(const T&);
  354.     void erase(const T&);
  355.     iterator find(const T&) const;
  356.     iterator begin() const;
  357.     iterator end() const;
  358.     ~set();
  359. private:
  360.     details::node<T>* head;
  361. };
  362.  
  363. template<typename T>
  364. class set<T>::iterator
  365. {
  366.     friend set<T>;
  367. public:
  368.     iterator();
  369.     iterator& operator++();
  370.     iterator operator++(int );
  371.     T& operator*();
  372.     bool operator!=(const iterator &it) const;
  373.     bool operator==(const iterator &it) const;
  374. private:
  375.     iterator(details::node<T>* b);
  376.     details::node<T>* p;
  377. };
  378.  
  379. #include "set.tpp"
  380. #include "set_iterator.tpp"
  381.  
  382.  
  383.  
  384.  
  385.  
  386. //main.cpp
  387. #define BOOST_TEST_MAIN
  388.  
  389. #include <iostream>
  390. #include <set>
  391. #include <ctime>
  392. using std::cout;
  393. using std::endl;
  394.  
  395. #include <boost/test/unit_test.hpp>
  396.  
  397. #include "set.hpp"
  398. using namespace details;
  399.  
  400. void vector_random_fill(std::vector<int> &v, int modulo)
  401. {
  402.     for (size_t i = 0; i < v.size(); i++)
  403.         v[i] = rand() % modulo;
  404. }
  405.  
  406. BOOST_AUTO_TEST_SUITE( set_test )
  407.  
  408. BOOST_AUTO_TEST_CASE( set_constructor )
  409. {
  410.     //empty
  411.     set<int> s;
  412.     BOOST_CHECK(s.find(0) == s.end());
  413.  
  414.     //sequence constructor
  415.     const int size = 100;
  416.     const int mod = 40;
  417.     std::vector<int> v(size);
  418.     vector_random_fill(v, mod);
  419.     set<int> s2(v.begin(), v.end());
  420.     for (size_t i = 0; i < size; i++)
  421.         BOOST_CHECK(s2.find(v[i]) != s.end());
  422. }
  423.  
  424. BOOST_AUTO_TEST_CASE( set_insert_simple )
  425. {
  426.     set<int> s;
  427.     s.insert(1);
  428.     BOOST_CHECK(s.find(1) != s.end());
  429.     BOOST_CHECK(s.find(100500) == s.end());
  430.     s.insert(2);
  431.     s.insert(-10);
  432.     s.insert(239);
  433.     BOOST_CHECK(s.find(239) != s.end());
  434.     BOOST_CHECK(s.find(2) != s.end());
  435. }
  436.  
  437. BOOST_AUTO_TEST_CASE( set_erase_simple )
  438. {
  439.     set<int> s;
  440.     s.erase(1);
  441.     s.insert(1);
  442.     s.insert(2);
  443.     s.insert(-10);
  444.     s.insert(100500);
  445.     s.insert(0);
  446.     s.erase(1);
  447.     BOOST_CHECK(s.find(1) == s.end());
  448.     s.erase(100500);
  449.     s.erase(2);
  450.     s.erase(-10);
  451.     s.erase(0);
  452.     BOOST_CHECK(s.find(1) == s.end());
  453. }
  454.  
  455. BOOST_AUTO_TEST_CASE( test_complex )
  456. {
  457.     using std::vector;
  458.     using std::rand;
  459.  
  460.  
  461.     int randseed = static_cast<int>(std::time(0) % 10000);
  462.     srand(randseed);
  463.     cout << "randseed is " << randseed << endl;
  464.     const size_t size = 100;
  465.     const int mod = 20;
  466.  
  467.     set<int> a;
  468.     std::set<int> b;
  469.  
  470.     vector<int> inserts(rand() % size);
  471.     vector<int> erases(rand() % size);
  472.     vector<int> tests(size);
  473.     vector_random_fill(inserts, mod);
  474.     vector_random_fill(erases, mod);
  475.     vector_random_fill(tests, mod);
  476.  
  477.     for (size_t i = 0, j = 0; i < inserts.size() || j < erases.size(); )
  478.     {
  479.         if (rand() % 2 == 0 && i < inserts.size())
  480.         {
  481.             a.insert(inserts[i]);
  482.             b.insert(inserts[i]);
  483.             i++;
  484.         }
  485.         else if (j < erases.size())
  486.         {
  487.             a.erase(erases[j]);
  488.             b.erase(erases[j]);
  489.             j++;
  490.         }
  491.         for (size_t k = 0; k < tests.size(); k++)
  492.         {
  493.             bool b1 = (a.find(tests[k]) != a.end());
  494.             bool b2 = (b.find(tests[k]) != b.end());
  495.             BOOST_CHECK(b1 == b2);
  496.         }
  497.     }
  498. }
  499.  
  500. BOOST_AUTO_TEST_SUITE_END()
  501.  
  502.  
  503.  
  504. BOOST_AUTO_TEST_SUITE( iterator_tests )
  505.  
  506. BOOST_AUTO_TEST_CASE( iterators )
  507. {
  508.     //empty constructor
  509.     set<int>::iterator it;
  510.     //empty iterator dereference check
  511.     BOOST_CHECK_THROW(*it, std::runtime_error);
  512.  
  513.     const int size = 50;
  514.     //big test
  515.     std::vector<int> v(20);
  516.     vector_random_fill(v, size);
  517.     set<int> s(v.begin(), v.end());
  518.     set<int> s2;
  519.     for (set<int>::iterator it = s.begin(); it != s.end(); ++it)
  520.         s2.insert(*it);
  521.  
  522.     set<int>::iterator sit = s.begin();
  523.     set<int>::iterator s2it = s2.begin();
  524.     for (set<int>::iterator sit = s.begin(); sit != s.end(); ++sit)
  525.     {
  526.         BOOST_CHECK(*sit == *s2it);
  527.         s2it++;//postincrement test
  528.     }
  529.        
  530.  
  531.     //empty set iterating
  532.     set<int> se;
  533.     for (set<int>::iterator it = se.begin(); it != se.end(); ++it)
  534.         cout << *it << " ";
  535. }
  536.  
  537. BOOST_AUTO_TEST_SUITE_END()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement