/* 
 * mmapptr.cpp: Example using pointer-based RWMultiMapPtr<K,T,C>
 *
 * $Id: mmapptr.cpp,v 7.6 1996/03/24 09:11:00 jims Exp $
 *
 * (c) Copyright 1989 - 1996 Rogue Wave Software, Inc.
 * ALL RIGHTS RESERVED
 *
 * The software and information contained herein are proprietary to, and
 * comprise valuable trade secrets of, Rogue Wave Software, Inc., which
 * intends to preserve as trade secrets such software and information.
 * This software is furnished pursuant to a written license agreement and
 * may be used, copied, transmitted, and stored only in accordance with
 * the terms of such license and with the inclusion of the above copyright
 * notice.  This software and information or any other copies thereof may
 * not be provided or otherwise made available to any other person.
 *
 * Notwithstanding any other lease or license that may pertain to, or
 * accompany the delivery of, this computer software and information, the
 * rights of the Government regarding its use, reproduction and disclosure
 * are as set forth in Section 52.227-19 of the FARS Computer
 * Software-Restricted Rights clause.
 * 
 * Use, duplication, or disclosure by the Government is subject to
 * restrictions as set forth in subparagraph (c)(1)(ii) of the Rights in
 * Technical Data and Computer Software clause at DFARS 252.227-7013.
 * Contractor/Manufacturer is Rogue Wave Software, Inc.,
 * P.O. Box 2328, Corvallis, Oregon 97339.
 *
 * This computer software and information is distributed with "restricted
 * rights."  Use, duplication or disclosure is subject to restrictions as
 * set forth in NASA FAR SUP 18-52.227-79 (April 1985) "Commercial
 * Computer Software-Restricted Rights (April 1985)."  If the Clause at
 * 18-52.227-74 "Rights in Data General" is specified in the contract,
 * then the "Alternate III" clause applies.
 *
 ***************************************************************************
 *
 * $Log: mmapptr.cpp,v $
 * Revision 7.6  1996/03/24 09:11:00  jims
 * Remove single quote from error directive
 *
 * Revision 7.5  1996/03/15 20:55:24  kyle
 * Inserted error when user without STL tries to compile.
 *
 * Revision 7.4  1996/02/18 21:31:38  kyle
 * Millenium changed #include rw files from <> to "", added support for
 * StdLib needing extensions.
 *
 * Revision 7.3  1996/02/13 16:25:45  kevinj
 * Name change.
 *
 * Revision 7.2  1995/09/07 01:11:01  jims
 * Add header section with new copyright macro
 *
 *
 */

#include "rw/cstring.h"
#include "rw/rwdate.h"
#include "rw/tpmmap.h"
#include <iostream.h>

#ifdef RW_NO_STL
#error Cannot compiler this example if RW_NO_STL is defined.
#endif /* RW_NO_STL */

#ifndef RW_HEADER_WITH_EXTENSION
#  include <functional>
#  include <utility>
#else
#  include <functional.hpp>
#  include <utility.hpp>
#endif /* RW_HEADER_WITH_EXTENSION */

#include <iomanip.h>

int main()
{
  typedef RWTPtrMultiMap<RWCString, RWDate, less<RWCString> > RWMMap;

  RWMMap birthdays;

  birthdays.insertKeyAndValue(new RWCString("John"),
			      new RWDate(12, "April", 1975));

  birthdays.insertKeyAndValue(new RWCString("Paul"),
			      new RWDate(2, "Nov", 1980));

  birthdays.insertKeyAndValue(new RWCString("Mary"),
			      new RWDate(22, "Oct", 1987));

  birthdays.insertKeyAndValue(new RWCString("Paul"),
			      new RWDate(19, "June", 1971));

  birthdays.insertKeyAndValue(new RWCString("Sally"),
			      new RWDate(15, "March", 1976));

  birthdays.insertKeyAndValue(new RWCString("Paul"),
			      new RWDate(6, "July", 1950));

  // Display the data stored in the map
  cout << endl;
  cout << "Created a map storing the pairs:" << endl << endl;

  RWMMap::iterator iter = birthdays.begin();
  for(; !(iter == birthdays.end()); iter++)
	  cout << setw(8) << *(*iter).first
	       << "     " << *(*iter).second << endl;

  cout << endl;

  // How many "Paul"s?
  RWCString paulstr("Paul");

  RWMMap::size_type n = birthdays.occurrencesOf(&paulstr);
  RWMMap::size_type idx = 0;

  cout << "There are " << n << " Pauls.  "
       << "Their birthdays are:" << endl << endl;

  RWMMap::const_iterator iter2 = birthdays.std().lower_bound(&paulstr);

  while (++idx <= n) {
    cout << setw(7) << idx << ".     " << *(*iter2).second << endl;
    ++iter2;
  }

  cout << endl;	 
  return 0;
}
