home *** CD-ROM | disk | FTP | other *** search
/ PC Format (South-Africa) 2001 May / PCFMay2001.iso / Xenon / C++ / FreeCommandLineTools.exe / Examples / StdLib / widwork.cpp < prev   
Encoding:
C/C++ Source or Header  |  2000-01-31  |  4.4 KB  |  137 lines

  1. #include "stlexam.h"
  2. #pragma hdrstop
  3. /**************************************************************************
  4.  *
  5.  * widwork.cpp - widget works, from Chapter 6.3
  6.  *
  7.  ***************************************************************************
  8.  *
  9.  * (c) Copyright 1994, 1998 Rogue Wave Software, Inc.
  10.  * ALL RIGHTS RESERVED
  11.  *
  12.  * The software and information contained herein are proprietary to, and
  13.  * comprise valuable trade secrets of, Rogue Wave Software, Inc., which
  14.  * intends to preserve as trade secrets such software and information.
  15.  * This software is furnished pursuant to a written license agreement and
  16.  * may be used, copied, transmitted, and stored only in accordance with
  17.  * the terms of such license and with the inclusion of the above copyright
  18.  * notice.  This software and information or any other copies thereof may
  19.  * not be provided or otherwise made available to any other person.
  20.  *
  21.  * Notwithstanding any other lease or license that may pertain to, or
  22.  * accompany the delivery of, this computer software and information, the
  23.  * rights of the Government regarding its use, reproduction and disclosure
  24.  * are as set forth in Section 52.227-19 of the FARS Computer
  25.  * Software-Restricted Rights clause.
  26.  * 
  27.  * Use, duplication, or disclosure by the Government is subject to
  28.  * restrictions as set forth in subparagraph (c)(1)(ii) of the Rights in
  29.  * Technical Data and Computer Software clause at DFARS 252.227-7013.
  30.  * Contractor/Manufacturer is Rogue Wave Software, Inc.,
  31.  * P.O. Box 2328, Corvallis, Oregon 97339.
  32.  *
  33.  * This computer software and information is distributed with "restricted
  34.  * rights."  Use, duplication or disclosure is subject to restrictions as
  35.  * set forth in NASA FAR SUP 18-52.227-79 (April 1985) "Commercial
  36.  * Computer Software-Restricted Rights (April 1985)."  If the Clause at
  37.  * 18-52.227-74 "Rights in Data General" is specified in the contract,
  38.  * then the "Alternate III" clause applies.
  39.  *
  40.  **************************************************************************/
  41.  
  42. # include <list>
  43. # include <algorithm>
  44. # include <functional>
  45.  
  46. #ifdef _RW_STD_IOSTREAM
  47. #include <iostream>
  48. #else
  49. #include <iostream.h>
  50. #endif
  51.     
  52. #ifndef _RWSTD_NO_NAMESPACE
  53. using namespace std;
  54. using namespace std::rel_ops;
  55. #endif
  56.  
  57. class  Widget
  58. {
  59.   public:
  60.     Widget(int a = 0) : id(a) { }
  61.     void operator= (const Widget& rhs) { id = rhs.id; }
  62.     int id;
  63.     friend ostream & operator << (ostream & out, const Widget & w)
  64.         { return out << "Widget " << w.id; }
  65. };
  66.  
  67. bool operator== (const Widget& lhs, const Widget& rhs)
  68. { return lhs.id == rhs.id; }
  69.  
  70. bool operator< (const Widget& lhs, const Widget& rhs)
  71. { return lhs.id < rhs.id; }
  72.  
  73. struct WidgetTester : binary_function<Widget, int, bool>
  74. {
  75.   public:
  76.     bool operator () (const Widget & wid, int testid) const
  77.       { return wid.id == testid; }
  78. };
  79.  
  80. class inventory
  81. {
  82.   public:
  83.     void order (int wid);   // Process order for widget type wid.
  84.     void receive (int wid); // Receive widget of type wid in shipment.
  85.   private:
  86.     list<Widget,allocator<void> > on_hand;
  87.     list<int,allocator<int> > on_order;
  88. };
  89.  
  90. void inventory::order (int wid)
  91. {
  92.     cout << "Received order for widget type " << wid << endl;
  93.     list<Widget,allocator<void> >::iterator wehave = find_if(on_hand.begin(), on_hand.end(), 
  94.                                             bind2nd(WidgetTester(), wid));
  95.     if (wehave != on_hand.end())
  96.     {
  97.         cout << "Ship " << *wehave << endl;
  98.         on_hand.erase(wehave);
  99.     }
  100.     else
  101.     {
  102.         cout << "Back order widget of type "  << wid  << endl;
  103.         on_order.push_front(wid);
  104.     }
  105. }
  106.  
  107. void inventory::receive (int wid)
  108. {
  109.     cout << "Received shipment of widget type " << wid << endl;
  110.     list<int,allocator<int> >::iterator weneed = find(on_order.begin(), on_order.end(), wid);
  111.     if (weneed != on_order.end())
  112.     {
  113.         cout << "Ship " << Widget(wid) << " to fill back order" << endl;
  114.         on_order.erase(weneed);
  115.     }
  116.     else
  117.         on_hand.push_front(Widget(wid));
  118. }
  119.  
  120. int main ()
  121. {
  122.     cout << "Widget Works test program" << endl;
  123.  
  124.     inventory stock;
  125.     stock.receive(1);
  126.     stock.receive(2);
  127.     stock.receive(3);
  128.     stock.order(2);
  129.     stock.order(2);
  130.     stock.order(3);
  131.     stock.receive(2);
  132.     
  133.     cout << "End of widget words test program" << endl;
  134.  
  135.     return 0;
  136. }
  137.