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 / BoxExtend.h < prev    next >
C/C++ Source or Header  |  1998-03-25  |  4KB  |  137 lines

  1. // $Id: BoxExtend.h,v 1.10 1998/03/25 12:42:25 zeller Exp $  -*- C++ -*-
  2. // BoxExtend class
  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. #ifndef _DDD_BoxExtend_h
  30. #define _DDD_BoxExtend_h
  31.  
  32. #ifdef __GNUG__
  33. #pragma interface
  34. #endif
  35.  
  36. // A `BoxExtend' denotes the extensibility of a box - that is, how
  37. // much the box extends to fill up available space.  An extensibility
  38. // of 0 means that the box will not extend at all.  The bigger the
  39. // extensibility, the more remaining space is assigned to the box.
  40. // For example, let A and B be two boxes; A has a horizontal
  41. // extensibility of 1, B has a horizontal extensibility of 2.  If A
  42. // and B are horizontally concatenated, A gets 1/3 of the remaining
  43. // space and B gets 2/3 of the remaining space.
  44.  
  45. #include "BoxPoint.h"
  46. #include "misc.h" // min(), max()
  47.  
  48. class BoxExtend: public BoxPoint {
  49. public:
  50.     // Constructors
  51.     BoxExtend(BoxCoordinate x_extend, BoxCoordinate y_extend):
  52.     BoxPoint(x_extend, y_extend)
  53.     {}
  54.     BoxExtend(BoxCoordinate c): 
  55.     BoxPoint(c)
  56.     {}
  57.     BoxExtend():
  58.     BoxPoint()
  59.     {}
  60.     BoxExtend(const BoxPoint& p):
  61.     BoxPoint(p)
  62.     {}
  63.  
  64.     // Horizontal concatenation
  65.     BoxExtend operator & (const BoxExtend& e) 
  66.     {
  67.     if (isValid() && e.isValid())
  68.         return BoxExtend(point[X] + e.point[X],
  69.                  min(point[Y],e.point[Y]));
  70.     else
  71.         return BoxExtend();
  72.     }
  73.  
  74.     // Vertical concatenation
  75.     BoxExtend operator | (const BoxExtend& e) 
  76.     {
  77.     if (isValid() && e.isValid())
  78.         return BoxExtend(min(point[X], e.point[X]),
  79.                  point[Y] + e.point[Y]);
  80.     else
  81.         return BoxExtend();
  82.     }
  83.  
  84.     // Stacked concatenation
  85.     BoxExtend operator ^ (const BoxExtend& e) 
  86.     {
  87.     if (isValid() && e.isValid())
  88.         return BoxExtend(max(point[X], e.point[X]),
  89.                  max(point[Y], e.point[Y]));
  90.     else
  91.         return BoxExtend();
  92.     }
  93.  
  94.     // Assignment versions
  95.     void operator &= (const BoxExtend& e) 
  96.     {
  97.     if (isValid() && e.isValid())
  98.     {
  99.         point[X] += e.point[X];
  100.         point[Y] = min(point[Y], e.point[Y]);
  101.     }
  102.     }
  103.     void operator |= (const BoxExtend& e) 
  104.     {
  105.     if (isValid() && e.isValid())
  106.     {
  107.         point[X] = min(point[X], e.point[X]);
  108.         point[Y] += e.point[Y];
  109.     }
  110.     }
  111.     void operator ^= (const BoxExtend& e) 
  112.     {
  113.     if (isValid() && e.isValid())
  114.     {
  115.         point[X] = max(point[X], e.point[X]);
  116.         point[Y] = max(point[Y], e.point[Y]);
  117.     }
  118.     }
  119.  
  120.     // Set extensibility to zero
  121.     void fix (BoxDimension dimension) 
  122.     {
  123.     if (isValid())
  124.         point[dimension] = 0;
  125.     }
  126. };
  127.  
  128. // I/O
  129. inline ostream& operator << (ostream& stream, const BoxExtend& extend)
  130. {
  131.     const BoxPoint& p = extend;
  132.     return operator << (stream, p);
  133. }
  134.  
  135. #endif // _DDD_BoxExtend_h
  136. // DON'T ADD ANYTHING BEHIND THIS #endif
  137.