home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 mARCH / PCWK3A99.iso / Linux / DDD331 / DDD-3_1_.000 / DDD-3_1_ / ddd-3.1.1 / ddd / cxxtest.C < prev    next >
C/C++ Source or Header  |  1998-10-27  |  11KB  |  503 lines

  1. // $Id: cxxtest.C,v 1.37 1998/10/27 10:00:50 zeller Exp $ 
  2. // Test program
  3.  
  4. // Copyright (C) 1995 Technische Universitaet Braunschweig, Germany.
  5. // Written by Dorothea Luetkehaus <luetke@ips.cs.tu-bs.de>.
  6. // 
  7. // This file is part of DDD.
  8. // 
  9. // DDD is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. // 
  14. // DDD is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17. // See the GNU General Public License for more details.
  18. // 
  19. // You should have received a copy of the GNU General Public
  20. // License along with DDD -- see the file COPYING.
  21. // If not, write to the Free Software Foundation, Inc.,
  22. // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23. // 
  24. // DDD is the data display debugger.
  25. // For details, see the DDD World-Wide-Web page, 
  26. // `http://www.cs.tu-bs.de/softech/ddd/',
  27. // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
  28.  
  29. //--------------------------------------------------------------------------
  30. // This program defines some data structures and values that may be
  31. // examined using DDD.
  32. //--------------------------------------------------------------------------
  33.  
  34. char cxxtest_rcsid[] =
  35.     "$Id: cxxtest.C,v 1.37 1998/10/27 10:00:50 zeller Exp $";
  36.  
  37. #include "config.h"
  38. #include "bool.h"
  39.  
  40. #include <iostream.h>
  41. #include <stdlib.h>
  42. #include <time.h>
  43. #include <math.h>
  44.  
  45. //--------------------------------------------------------------------------
  46. extern "C" {
  47. #if HAVE_RANDOM && !HAVE_RANDOM_DECL && !defined(random)
  48. long int random();
  49. #endif
  50. #if HAVE_SRANDOM && !HAVE_SRANDOM_DECL && !defined(srandom)
  51. void srandom(unsigned int seed);
  52. #endif
  53. #if HAVE_RAND && !HAVE_RAND_DECL && !defined(rand)
  54. int rand();
  55. #endif
  56. #if HAVE_SRAND && !HAVE_SRAND_DECL && !defined(srand)
  57. void srand(unsigned int seed);
  58. #endif
  59. };
  60.  
  61. static void init_random_seed()
  62. {
  63.     static bool seed_initialized = false;
  64.     if (seed_initialized)
  65.     return;
  66.  
  67.     time_t tm;
  68.     time(&tm);
  69.  
  70. #if HAVE_SRAND
  71.     srand((int)tm);
  72. #elif HAVE_SRANDOM
  73.     srandom((int)tm);
  74. #endif
  75.  
  76.     seed_initialized = true;
  77. }
  78.  
  79. static int rnd(int x)
  80.     init_random_seed();
  81.  
  82. #if HAVE_RAND
  83.     return rand() % x;
  84. #else /* HAVE_RANDOM */
  85.     return random() % x;
  86. #endif
  87. }
  88.  
  89. enum DayOfWeek {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
  90.  
  91. static int a_global = 42;    // Place watchpoints on this one
  92.  
  93. //--------------------------------------------------------------------------
  94. class Date {
  95.     DayOfWeek day_of_week;
  96.     int day;
  97.     int month;
  98.     int year;
  99. public:
  100.     Date() 
  101.     : day_of_week(Thu), day(1), month(1), year(1970)
  102.     {}
  103.     Date(DayOfWeek w, int d, int m, int y)
  104.     : day_of_week(w), day(d), month(m), year(y)
  105.     {}
  106.     virtual ~Date()
  107.     {}
  108.     void set(DayOfWeek w, int d, int m, int y)
  109.     {
  110.     day_of_week = w;
  111.     day         = d;
  112.     month       = m;
  113.     year        = y;
  114.     }
  115.  
  116.     virtual void print()    {}
  117.     virtual void print(int) {}
  118. };
  119.  
  120. //--------------------------------------------------------------------------
  121. class Holiday : public Date {
  122.     const char *name;
  123.  
  124. public:
  125.     Holiday(DayOfWeek w, int d, int m, int y, const char *n) :
  126.     Date (w, d, m, y), name(n)
  127.     {
  128.     a_global = 1;
  129.     }
  130.     virtual ~Holiday()
  131.     {}
  132.  
  133.     virtual void print()    {}
  134.     virtual void print(int) {}
  135. };
  136.  
  137. //--------------------------------------------------------------------------
  138. class Tree {
  139.     int   value;
  140.     const char *_name;
  141.  
  142.     Tree *_left;
  143.     Tree *_right;
  144.     bool left_thread;
  145.     bool right_thread;
  146.  
  147. protected:
  148.     void add_left_threads(Tree *);
  149.     void add_right_threads(Tree *);
  150.  
  151. public:
  152.     Date date;
  153.  
  154.     static int shared;
  155.  
  156.     Tree(int v, const char *n):
  157.     value(v), _name(n), _left(0), _right(0), 
  158.     left_thread(false), right_thread(false)
  159.     {}
  160.  
  161.     Tree *left()  { return left_thread  ? 0 : _left; }
  162.     Tree *right() { return right_thread ? 0 : _right; }
  163.  
  164.     const char *name() { return _name; }
  165.  
  166.     void set_left(Tree *t)  { _left = t; }
  167.     void set_right(Tree *t) { _right = t; }
  168.  
  169.     // In-order traversal
  170.     Tree *first();
  171.     Tree *next();
  172.     Tree *last();
  173.     Tree *prev();
  174.  
  175.     ~Tree()
  176.     {
  177.     delete left();
  178.      delete right();
  179.     }
  180.  
  181.     void add_threads();
  182. };
  183.  
  184. int Tree::shared = 4711;
  185.  
  186. void Tree::add_threads()
  187. {
  188.     add_left_threads(0);
  189.     add_right_threads(0);
  190. }
  191.  
  192. void Tree::add_right_threads(Tree *parent)
  193. {
  194.     if (_right == 0)
  195.     {
  196.     _right = parent;
  197.     right_thread = (_right != 0);
  198.     }
  199.     else
  200.     {
  201.     _right->add_right_threads(parent);
  202.     }
  203.  
  204.     if (_left != 0 && !left_thread)
  205.     _left->add_right_threads(this);
  206. }
  207.  
  208. void Tree::add_left_threads(Tree *parent)
  209. {
  210.     if (_left == 0)
  211.     {
  212.     _left = parent;
  213.     left_thread = (_left != 0);
  214.     }
  215.     else
  216.     {
  217.     _left->add_left_threads(parent);
  218.     }
  219.  
  220.     if (_right != 0 && !right_thread)
  221.     _right->add_left_threads(this);
  222. }
  223.  
  224. Tree *Tree::next()
  225. {
  226.     if (right_thread)
  227.     return _right;
  228.     if (_right != 0)
  229.     return _right->first();
  230.     return 0;
  231. }
  232.  
  233. Tree *Tree::prev()
  234. {
  235.     if (left_thread)
  236.     return _left;
  237.     if (_left != 0)
  238.     return _left->last();
  239.     return 0;
  240. }
  241.  
  242. Tree *Tree::first()
  243. {
  244.     Tree *t = this;
  245.     while (t->_left != 0 && !t->left_thread)
  246.     t = t->_left;
  247.  
  248.     return t;
  249. }
  250.  
  251. Tree *Tree::last()
  252. {
  253.     Tree *t = this;
  254.     while (t->_right != 0 && !t->right_thread)
  255.     t = t->_right;
  256.  
  257.     return t;
  258. }
  259.  
  260. //--------------------------------------------------------------------------
  261. class List {
  262.     int value;
  263. public:
  264.     List *self;
  265.     List *next;
  266.  
  267.     List(int v):
  268.     value(v), self(this), next(this)
  269.     {}
  270. };
  271. //--------------------------------------------------------------------------
  272. // Simple threaded tree
  273.  
  274. void tree_test()
  275. {
  276.     Tree *tree = 0;
  277.  
  278.     tree = new Tree(7, "Ada");                        // Byron Lovelace
  279.     tree->set_left(new Tree(1, "Grace"));             // Murray Hopper
  280.     tree->left()->set_left(new Tree(5, "Judy"));      // Clapp
  281.     tree->left()->set_right(new Tree(6, "Kathleen")); // McNulty
  282.     tree->set_right(new Tree(1, "Mildred"));          // Koss
  283.  
  284.     tree->add_threads();
  285.  
  286.     for (Tree *t = tree->first(); t != 0; t = t->next())
  287.     cout << t->name() << " ";
  288.     cout << "\n";
  289.  
  290.     (void) tree;        // Display this
  291.  
  292.     tree->date.set(Tue, 29, 11, 1994);
  293.     tree->date.set(Wed, 30, 11, 1994);
  294.  
  295.     delete tree;
  296. }
  297.  
  298. //--------------------------------------------------------------------------
  299. // Simple circular list.  Examine `list' with alias detection enabled.
  300. void list_test(int start)
  301. {
  302.     List *list = 0;
  303.  
  304.     list                         = new List(a_global + start++);
  305.     list->next                   = new List(a_global + start++);
  306.     list->next->next             = new List(a_global + start++);
  307.     list->next->next->next       = list;
  308.  
  309.     (void) list;        // Display this
  310.  
  311.     delete list->next->next;
  312.     delete list->next;
  313.     delete list;
  314. }
  315.  
  316. // Test disambiguation
  317. void list_test(double d)
  318. {
  319.     list_test(int(d));
  320. }
  321.  
  322. //--------------------------------------------------------------------------
  323. void reference_test(Date& date, Date*& date_ptr)
  324. {
  325.     date = *date_ptr;
  326.     delete date_ptr;
  327.     date_ptr = 0;
  328. }
  329.  
  330. //--------------------------------------------------------------------------
  331. void array_test()
  332. {
  333.     // Play with rotate and show/hide buttons
  334.     DayOfWeek days_of_week[7] = {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
  335.  
  336.     char *twodim [2][3] = {{ "Pioneering", "women", "in"},
  337.                { "computer", "science", "!"}};
  338.  
  339.     int array[12][12];
  340.  
  341.     (void) twodim;        // Display this
  342.     (void) days_of_week;    // Display this
  343.     (void) array;        // Display this
  344.  
  345.     // Initialize array
  346.     for (int i = 0; i < int(sizeof(array) / sizeof(array[0])); i++)
  347.     for (int j = 0; j < int(sizeof(array[0]) / sizeof(array[0][0])); j++)
  348.         array[i][j] = 0;
  349.  
  350.     // Dereference this
  351.     Date *date_ptrs[4];
  352.     date_ptrs[0] = new Date(Thu, 1, 9, 1994);
  353.     date_ptrs[1] = new Date(Tue, 10, 5, 1994);
  354.     date_ptrs[2] = new Date(Fri, 15, 7, 1994);
  355.     date_ptrs[3] = new Date(Sat, 24, 12, 1994);
  356.  
  357.     Date *date_ptr;
  358.     for (int k = 0; k < 4; k++)
  359.     {
  360.     // Dereference DATE_PTR to see it traverse the individual *DATE_PTRs
  361.     date_ptr = date_ptrs[k];
  362.     reference_test(*date_ptr, date_ptrs[k]);
  363.     a_global = k;
  364.     }
  365.  
  366.     // A `repeat' test.
  367.     static int *ar[100];
  368.     static int     ir[100];
  369.  
  370.     ar[1]  = &ir[1];    ir[1]  = 1;
  371.     ar[50] = &ir[50];    ir[50] = 50;
  372.     ar[51] = &ir[51];    ir[51] = 51;
  373.     ar[99] = &ir[99];    ir[99] = 99;
  374. }
  375.  
  376. //--------------------------------------------------------------------------
  377. #define numbers(x) (sizeof((x)) / sizeof((x)[0]))
  378.  
  379. void shell_sort(int a[], int size)
  380. {
  381.     int h = 1;
  382.     do {
  383.     h = h * 3 + 1;
  384.     } while (h <= size);
  385.     do {
  386.     h /= 3;
  387.     for (int i = h; i < size; i++)
  388.     {
  389.         int v = a[i];
  390.         int j;
  391.         for (j = i; j >= h && a[j - h] > v; j -= h)
  392.         a[j] = a[j - h];
  393.         if (i != j)
  394.         a[j] = v;
  395.     }
  396.     } while (h != 1);
  397. }
  398.  
  399. void plot_test()
  400. {
  401.     static int ir[100];
  402.  
  403.     for (int k = 0; k < numbers(ir); k++)
  404.     ir[k] = rnd(100);
  405.  
  406.     shell_sort(ir, numbers(ir));
  407.  
  408.     (void) ir;            // Plot this
  409.  
  410.     static double dr[10][100];
  411.     double pi = 3.14159265358979323846;
  412.  
  413.     for (int i = 0; i < numbers(dr); i++)
  414.     for (int j = 0; j < numbers(dr[0]); j++)
  415.         dr[i][j] = i * i * sin(j * 2 * pi / numbers(dr[0]) * 3);
  416.  
  417.     (void) dr;            // Plot this
  418. }
  419.  
  420. //--------------------------------------------------------------------------
  421. void type_test()
  422. {
  423.     Holiday new_years_eve(Sat, 31, 12, 1994, 
  424.               "May all acquaintance be forgot");
  425.  
  426.     Date *date = new Date(Sat, 24, 12, 1994);
  427.     void *voidptr = date;
  428.  
  429.     (void) voidptr;        // Use it
  430.  
  431.     struct Uni {
  432.     int ii;
  433.     unsigned bit1:1;
  434.     unsigned bit2:2;
  435.     union {
  436.         int j;
  437.         char c;
  438.     }u;
  439.     } uni;
  440.  
  441.     struct Guni {
  442.     int ii;
  443.     union {
  444.         unsigned bit1:1;
  445.         int j;
  446.         char c;
  447.     };
  448.     union {
  449.         unsigned bit2:1;
  450.         unsigned bit3:1;
  451.     };
  452.     };
  453.  
  454.     uni.ii   = 7;
  455.     uni.bit1 = 1;
  456.     uni.bit2 = 3;
  457.     uni.u.j  = 9;
  458.     uni.u.c  = 'a';
  459.  
  460.     Guni guni; 
  461.     guni.ii   = 1;
  462.     guni.j    = 2;
  463.     guni.c    = 'a';
  464.     guni.bit1 = 0;
  465.     guni.bit2 = 1;
  466.     guni.bit3 = 0;
  467.  
  468.     float pi       = 3.14159265358979323846;
  469.     double sqrt2   = 1.41421356237309504880;
  470.     signed char sc = 'a';
  471.  
  472.     guni.ii = int(pi * sqrt2 * sc);
  473. }
  474.  
  475. //--------------------------------------------------------------------------
  476. void cin_cout_test()
  477. {
  478.     // Simple I/O
  479.     char name[1024];
  480.     cout << "What's your name? ";
  481.     cin >> name;
  482.     cerr << "Hello, " << name << "!\n";
  483. }
  484.  
  485. //--------------------------------------------------------------------------
  486. int main(int /* argc */, char ** /* argv */)
  487. {
  488.     int i = 42;
  489.     tree_test();
  490.     i++;
  491.     list_test(i);
  492.     i++;
  493.     array_test();
  494.     i++;
  495.     plot_test();
  496.     i++;
  497.     type_test();
  498.     --i;
  499.     cin_cout_test();
  500.     return 0;
  501. }
  502.