home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1997 May / Pcwk0597.iso / borland / cb / setup / cbuilder / data.z / WIDWORK.CPP < prev    next >
C/C++ Source or Header  |  1997-02-28  |  2KB  |  86 lines

  1. /**************************************************************************
  2.  *
  3.  * widwork.cpp - widget words, from Chapter 6.3
  4.  *
  5.  * $Id: widwork.cpp,v 1.3 1995/08/29 19:03:58 oberg Exp $
  6.  *
  7.  * $$RW_INSERT_HEADER "slyrs.cpp"
  8.  *
  9.  **************************************************************************/
  10.  
  11. # include <list>
  12. # include <algorithm>
  13. # include <iostream.h>
  14. using namespace std;
  15.  
  16. class  Widget {
  17. public:
  18.     int id;
  19.     Widget(int a = 0) : id(a) { }
  20.     void operator= (const Widget& rhs) { id = rhs.id; }
  21.     friend ostream & operator << (ostream & out, const Widget & w)
  22.         { return out << "Widget " << w.id; }
  23.      bool operator== (const Widget & rhs)
  24.         { return id == rhs.id; }
  25.      bool operator< (const Widget & rhs)
  26.             { return id < rhs.id; }
  27. };
  28.  
  29. struct WidgetTester : binary_function<Widget, int, bool> {
  30. public:
  31.     bool operator () (const Widget & wid, int testid) const
  32.         { return wid.id == testid; }
  33. };
  34.  
  35. class inventory {
  36. public:
  37.     void order (int wid);    // process order for widget type wid
  38.     void receive (int wid);    // receive widget of type wid in shipment
  39. private:
  40.     list<Widget> on_hand;
  41.     list<int> on_order;
  42. };
  43.  
  44. void inventory::order (int wid)
  45. {
  46.     cout << "Received order for widget type " << wid << endl;
  47.     list<Widget>::iterator wehave = find_if(on_hand.begin(), on_hand.end(),
  48.         bind2nd(WidgetTester(), wid));
  49.     if (wehave != on_hand.end()) {
  50.         cout << "Ship " << *wehave << endl;
  51.         on_hand.erase(wehave);
  52.         }
  53.     else {
  54.         cout << "Back order widget of type "  << wid  << endl;
  55.         on_order.push_front(wid);
  56.         }
  57. }
  58.  
  59. void inventory::receive (int wid)
  60. {
  61.     cout << "Received shipment of widget type " << wid << endl;
  62.     list<int>::iterator weneed = find(on_order.begin(), on_order.end(), wid);
  63.     if (weneed != on_order.end()) {
  64.         cout << "Ship " << Widget(wid) << " to fill back order" << endl;
  65.         on_order.erase(weneed);
  66.         }
  67.     else
  68.         on_hand.push_front(Widget(wid));
  69. }
  70.  
  71. int main() {
  72.     cout << "Widget Works test program" << endl;
  73.     inventory stock;
  74.     
  75.     stock.receive(1);
  76.     stock.receive(2);
  77.     stock.receive(3);
  78.     stock.order(2);
  79.     stock.order(2);
  80.     stock.order(3);
  81.     stock.receive(2);
  82.     
  83.     cout << "End of widget words test program" << endl;
  84.     return 0;
  85. }
  86.