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 / CompositeB.C < prev    next >
C/C++ Source or Header  |  1998-11-23  |  4KB  |  165 lines

  1. // $Id: CompositeB.C,v 1.9 1998/11/23 17:43:19 zeller Exp $
  2. // Composite boxes
  3.  
  4. // Copyright (C) 1995 Technische Universitaet Braunschweig, Germany.
  5. // Written by Andreas Zeller <zeller@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. char CompositeBox_rcsid[] = 
  30.     "$Id: CompositeB.C,v 1.9 1998/11/23 17:43:19 zeller Exp $";
  31.  
  32. #ifdef __GNUG__
  33. #pragma implementation
  34. #endif
  35.  
  36.  
  37. #include "assert.h"
  38. #include "misc.h"
  39. #include "CompositeB.h"
  40.  
  41. DEFINE_TYPE_INFO_1(CompositeBox, Box)
  42.  
  43. // CompositeBox
  44.  
  45. // Grow by 1.5
  46. void CompositeBox::grow()
  47. {
  48.     unsigned newSize = _size + _size / 2 + 1;
  49.     Box **newBoxes = new Box* [newSize];
  50.     for (int i = 0; i < _nchildren; i++)
  51.     newBoxes[i] = boxes[i];
  52.  
  53.     delete[] boxes;
  54.     boxes = newBoxes;
  55.     _size = newSize;
  56. }
  57.  
  58. // Propagate font
  59. void CompositeBox::newFont(const string& font)
  60. {
  61.     for (int i = 0; i < nchildren(); i++)
  62.     {
  63.     Box* child = (*this)[i];
  64.     child->newFont(font);
  65.     }
  66.     resize();
  67. }
  68.  
  69. // Recompute size
  70. Box *CompositeBox::resize()
  71. {
  72.     for (int i = 0; i < nchildren(); i++)
  73.     {
  74.     Box* child = (*this)[i];
  75.     child->resize();
  76.     }
  77.     return this;
  78. }
  79.  
  80. // Create string from Box
  81. string CompositeBox::str() const
  82. {
  83.     string s("");
  84.     for (int i = 0; i < nchildren(); i++)
  85.     {
  86.     const Box* child = (*this)[i];
  87.     s += child->str();
  88.     }
  89.     return s;
  90. }
  91.  
  92. // Find TagBox for point P
  93. const TagBox *CompositeBox::findTag(const BoxPoint& p) const
  94. {
  95.     if (p != BoxPoint(-1, -1))
  96.     for (int i = 0; i < nchildren(); i++)
  97.     {
  98.         const Box *child = (*this)[i];
  99.         const TagBox *t = child->findTag(p);
  100.         if (t != 0)
  101.         return t;   // found
  102.     }
  103.     return 0; // not found
  104. }
  105.  
  106. // Count MatchBoxes
  107. void CompositeBox::countMatchBoxes(int instances[]) const
  108. {
  109.     for (int i = 0; i < nchildren(); i++)
  110.     {
  111.     const Box *child = (*this)[i];
  112.     child->countMatchBoxes(instances);
  113.     }
  114. }
  115.  
  116. // Check for equality
  117. bool CompositeBox::matches (const Box &b, const Box *) const
  118. {
  119.     // Don't compare size and extend, as MatchBoxen have zero size
  120.     if (strcmp(type(), b.type()))
  121.     return false;
  122.  
  123.     CompositeBox *c = (CompositeBox *)&b;   // dirty trick
  124.     if (nchildren() != c->nchildren())
  125.     return false;
  126.  
  127.     for (int i = 0; i < nchildren(); i++)
  128.     if (*((*this)[i]) != *((*c)[i]))
  129.         return false;
  130.  
  131.     return true;
  132. }
  133.  
  134. // Dump
  135. void CompositeBox::dumpComposite(ostream& s, 
  136.                  char *sep, char *head, char *tail) const
  137. {
  138.     s << head;
  139.     for (int i = 0; i < nchildren(); i++)
  140.     {
  141.     const Box* child = (*this)[i];
  142.     if (i > 0)
  143.         s << sep;
  144.     s << *child;
  145.     }
  146.     s << tail;
  147. }
  148.  
  149.  
  150. // Representation invariant
  151. bool CompositeBox::OK() const
  152. {
  153.     assert (boxes != 0);
  154.     assert (_nchildren >= 0);
  155.     assert (_size >= 0);
  156.     assert (_nchildren <= _size);
  157.  
  158.     for (int i = 0; i < _nchildren; i++)
  159.     assert (boxes[i]->OK());
  160.  
  161.     assert (Box::OK());
  162.  
  163.     return true;
  164. }
  165.