"SfR Fresh" - the SfR Freeware/Shareware Archive

Member "pan-0.133/pan/tasks/adaptable-set-test.cc" of archive pan-0.133.tar.gz:


As a special service "SfR Fresh" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file. That can be also achieved for any archive member file by clicking within an archive contents listing on the first character of the file(path) respectively on the according byte size field.
    1 #include <config.h>
    2 #include <algorithm>
    3 #include <iostream>
    4 #include <pan/general/test.h>
    5 #include "adaptable-set.h"
    6 
    7 using namespace pan;
    8 
    9 template<class X> class MyLessThan {
   10   public:
   11     MyLessThan () { }
   12     bool operator() (const X& x, const X& y) const { return x < y; }
   13 };
   14 
   15 template<class X>
   16 class MyListener:
   17   public AdaptableSet<X, MyLessThan<X> >::Listener
   18 {
   19   public:
   20     X value;
   21     int index_of_added;
   22     int index_of_removed;
   23     int old_index_of_moved;
   24     int new_index_of_moved;
   25 
   26   public:
   27     virtual void on_set_items_added (AdaptableSet<X, MyLessThan<X> >&, std::vector<X>& i, int index) {
   28       index_of_added = index;
   29       value = i[0];
   30     }
   31     virtual void on_set_item_removed (AdaptableSet<X, MyLessThan<X> >&, X& i, int index) {
   32       index_of_removed = index;
   33       value = i;
   34     }
   35     virtual void on_set_item_moved (AdaptableSet<X, MyLessThan<X> >&, X& i, int index, int old_index) {
   36       old_index_of_moved = old_index;
   37       new_index_of_moved = index;
   38       value = i;
   39     }
   40     void clear () {
   41       index_of_added = index_of_removed = old_index_of_moved = new_index_of_moved = -1;
   42     }
   43     MyListener () {
   44       clear ();
   45     }
   46     bool empty () const {
   47       return index_of_added==-1
   48           && index_of_removed==-1
   49           && old_index_of_moved==-1
   50           && new_index_of_moved==-1;
   51     }
   52 };
   53 
   54 typedef AdaptableSet<int, MyLessThan<int> > MyIntSet;
   55 int main ()
   56 {
   57   int i;
   58   MyIntSet s;
   59   MyListener<int> l;
   60   check (l.empty())
   61   s.add_listener (&l);
   62 
   63   check (s.empty())
   64 
   65   // trivial check: add to an empty set
   66   l.clear ();
   67   s.add (i = 10);
   68   check (l.value == 10)
   69   check (l.index_of_added == 0)
   70   check (!s.empty())
   71   check (s.size() == 1)
   72   check (s[0] == 10)
   73 
   74   // another add: does it insert in the right place?
   75   l.clear ();
   76   s.add (i = 30);
   77   check (l.index_of_added == 1)
   78   check (l.value == 30)
   79   check (s.size() == 2)
   80   check (s[0] == 10)
   81   check (s[1] == 30)
   82 
   83   // another add: does it insert in the right place?
   84   l.clear ();
   85   s.add (i = 20);
   86   check (l.index_of_added == 1)
   87   check (l.value == 20)
   88   check (s.size() == 3)
   89   check (s[0] == 10)
   90   check (s[1] == 20)
   91   check (s[2] == 30)
   92 
   93   // testing move_up
   94   l.clear ();
   95   MyIntSet s2 (s);
   96   s.move_up (2);
   97   check (l.old_index_of_moved == 2)
   98   check (l.new_index_of_moved == 1)
   99   check (l.value == 30)
  100   check (s.size() == 3)
  101   check (s[0] == 10)
  102   check (s[1] == 30)
  103   check (s[2] == 20)
  104   l.clear ();
  105   s.move_up (1);
  106   check (s.size() == 3)
  107   check (l.old_index_of_moved == 1)
  108   check (l.new_index_of_moved == 0)
  109   check (l.value == 30)
  110   check (s[0] == 30)
  111   check (s[1] == 10)
  112   check (s[2] == 20)
  113   l.clear ();
  114   s.move_up (i = 0);
  115   check (l.empty ())
  116   check (s.size() == 3)
  117   check (s[0] == 30)
  118   check (s[1] == 10)
  119   check (s[2] == 20)
  120 
  121   // does the set ignore moved items when finding the insertion point?
  122   // the unmoved set is 10, 20
  123   l.clear ();
  124   s.add (i = 15);
  125   check (l.index_of_added == 2)
  126   check (l.value == 15)
  127   check (s.size() == 4)
  128   check (s[0] == 30)
  129   check (s[1] == 10)
  130   check (s[2] == 15)
  131   check (s[3] == 20)
  132 
  133   // does the set ignore moved items when finding the insertion point?
  134   // the unmoved set is 10, 15, 20
  135   l.clear ();
  136   s.add (i = 21);
  137   check (l.index_of_added == 4)
  138   check (l.value == 21)
  139   check (s.size() == 5)
  140   check (s[0] == 30)
  141   check (s[1] == 10)
  142   check (s[2] == 15)
  143   check (s[3] == 20)
  144   check (s[4] == 21)
  145 
  146   // does the set ignore moved items when finding the insertion point?
  147   // the unmoved set is 10, 15, 20, 21
  148   l.clear ();
  149   s.add (i = 31);
  150   check (s.size() == 6)
  151   check (l.index_of_added == 5)
  152   check (l.value == 31)
  153   check (s[0] == 30)
  154   check (s[1] == 10)
  155   check (s[2] == 15)
  156   check (s[3] == 20)
  157   check (s[4] == 21)
  158   check (s[5] == 31)
  159 
  160   // testing move_down
  161   l.clear ();
  162   s.move_down (1);
  163   check (l.old_index_of_moved == 1)
  164   check (l.new_index_of_moved == 2)
  165   check (l.value == 10)
  166   check (s.size() == 6)
  167   check (s[0] == 30)
  168   check (s[1] == 15)
  169   check (s[2] == 10)
  170   check (s[3] == 20)
  171   check (s[4] == 21)
  172   check (s[5] == 31)
  173   l.clear ();
  174   s.move_down (2);
  175   check (l.old_index_of_moved == 2)
  176   check (l.new_index_of_moved == 3)
  177   check (l.value == 10)
  178   check (s.size() == 6)
  179   check (s[0] == 30)
  180   check (s[1] == 15)
  181   check (s[2] == 20)
  182   check (s[3] == 10)
  183   check (s[4] == 21)
  184   check (s[5] == 31)
  185 
  186   // does the set ignore moved items when finding the insertion point?
  187   // the unmoved set is 15, 20, 21, 31
  188   l.clear ();
  189   s.add (i = 11);
  190   check (l.index_of_added == 1)
  191   check (l.value == 11)
  192   check (s.size() == 7)
  193   check (s[0] == 30)
  194   check (s[1] == 11)
  195   check (s[2] == 15)
  196   check (s[3] == 20)
  197   check (s[4] == 10)
  198   check (s[5] == 21)
  199   check (s[6] == 31)
  200 
  201   // move to bottom...
  202   l.clear ();
  203   s.move_bottom (3);
  204   check (l.value == 20)
  205   check (l.old_index_of_moved == 3)
  206   check (l.new_index_of_moved == 6)
  207   check (s.size() == 7)
  208   check (s[0] == 30)
  209   check (s[1] == 11)
  210   check (s[2] == 15)
  211   check (s[3] == 10)
  212   check (s[4] == 21)
  213   check (s[5] == 31)
  214   check (s[6] == 20)
  215 
  216   // test another add after move_bottom()
  217   // does the set ignore moved items when finding the insertion point?
  218   // the unmoved set is 15, 21, 31
  219   l.clear ();
  220   s.add (i = 19);
  221   check (l.value == 19)
  222   check (l.index_of_added == 4)
  223   check (s.size() == 8)
  224   check (s[0] == 30)
  225   check (s[1] == 11)
  226   check (s[2] == 15)
  227   check (s[3] == 10)
  228   check (s[4] == 19)
  229   check (s[5] == 21)
  230   check (s[6] == 31)
  231   check (s[7] == 20)
  232 
  233   // now for multiple insert tests...
  234   MyIntSet m;
  235   l.clear ();
  236   std::vector<int> addme;
  237   addme.push_back (5);
  238   addme.push_back (10);
  239   addme.push_back (15);
  240   addme.push_back (20);
  241   m.add (addme);
  242   check (m.size() == 4)
  243   check (m[0] == 5)
  244   check (m[1] == 10)
  245   check (m[2] == 15)
  246   check (m[3] == 20)
  247 
  248   // start with an easy addition...
  249   addme.clear ();
  250   addme.push_back (0);
  251   addme.push_back (1);
  252   addme.push_back (2);
  253   m.add (addme);
  254   check (m.size() == 7)
  255   check (m[0] == 0)
  256   check (m[1] == 1)
  257   check (m[2] == 2)
  258   check (m[3] == 5)
  259   check (m[4] == 10)
  260   check (m[5] == 15)
  261   check (m[6] == 20)
  262 
  263   // now a more complicated one...
  264   addme.clear ();
  265   addme.push_back (12);
  266   addme.push_back (8);
  267   addme.push_back (17);
  268   addme.push_back (25);
  269   m.add (addme);
  270   check (m.size() == 11)
  271   check (m[0] == 0)
  272   check (m[1] == 1)
  273   check (m[2] == 2)
  274   check (m[3] == 5)
  275   check (m[4] == 8)
  276   check (m[5] == 10)
  277   check (m[6] == 12)
  278   check (m[7] == 15)
  279   check (m[8] == 17)
  280   check (m[9] == 20)
  281   check (m[10] == 25)
  282 
  283   // now after we've moved some items...
  284   m.move_up (3);
  285   m.move_up (7);
  286   check (m.size() == 11)
  287   check (m[0] == 0)
  288   check (m[1] == 1)
  289     check (m[2] == 5)
  290   check (m[3] == 2)
  291   check (m[4] == 8)
  292   check (m[5] == 10)
  293     check (m[6] == 15)
  294   check (m[7] == 12)
  295   check (m[8] == 17)
  296   check (m[9] == 20)
  297   check (m[10] == 25)
  298   addme.clear ();
  299   addme.push_back (3);
  300   addme.push_back (11);
  301   addme.push_back (14);
  302   addme.push_back (30);
  303   m.add (addme);
  304   check (m.size() == 15)
  305   check (m[0] == 0)
  306   check (m[1] == 1)
  307     check (m[2] == 5)
  308   check (m[3] == 2)
  309   check (m[4] == 3)
  310   check (m[5] == 8)
  311   check (m[6] == 10)
  312     check (m[7] == 15)
  313   check (m[8] == 11)
  314   check (m[9] == 12)
  315   check (m[10] == 14)
  316   check (m[11] == 17)
  317   check (m[12] == 20)
  318   check (m[13] == 25)
  319   check (m[14] == 30)
  320 
  321   return 0;
  322 }