blob: 63ad7d042a9bcd25846485d40084ff6de79768c8 [file] [log] [blame]
/**************************************************************************
*
* tele.cpp - Telephone directory sample program.
*
* $Id: //stdlib/dev/examples/stdlib/tutorial/tele.cpp#12 $
*
***************************************************************************
*
* Copyright (c) 1994-2005 Quovadx, Inc., acting through its Rogue Wave
* Software division. Licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0. Unless required by
* applicable law or agreed to in writing, software distributed under
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License
* for the specific language governing permissions and limitations under
* the License.
*
**************************************************************************/
#include <map>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <examples.h>
typedef std::map<std::string, long, std::less<std::string>,
std::allocator<std::pair<const std::string, long> > > friendMap;
typedef std::map<long, std::string, std::less<long>,
std::allocator<std::pair<const long, std::string> > > sortedMap;
typedef friendMap::value_type entry_type;
typedef sortedMap::value_type sorted_entry_type;
void printEntry (const entry_type & entry) {
std::cout << entry.first << ":" << entry.second << std::endl;
}
void printSortedEntry (const sorted_entry_type & entry) {
std::cout << entry.first << ":" << entry.second << std::endl;
}
long prefix (const entry_type& entry) {
return entry.second / 10000;
}
bool prefixCompare (const entry_type & a, const entry_type & b) {
return prefix (a) < prefix (b);
}
class checkPrefix {
public:
checkPrefix (long p) : testPrefix (p)
{ }
long testPrefix;
bool operator () (const entry_type& entry) {
return prefix (entry)==testPrefix;
}
};
class telephoneDirectory {
public:
void addEntry (std::string name, long number) {
database[name] = number;
}
void remove (std::string name) {
database.erase (name);
}
void update (std::string name, long number) {
remove (name);addEntry (name, number);
}
void displayDatabase () {
std::for_each (database.begin (), database.end (), printEntry);
}
void displayPrefix (int);
void displayByPrefix ();
private:
friendMap database;
};
void telephoneDirectory::displayPrefix (int pfx) {
std::cout << "Listing for prefix " << pfx << std::endl;
friendMap::iterator
where = std::find_if (database.begin (), database.end (),
checkPrefix (pfx));
while (where != database.end ()) {
printEntry (*where);
where = std::find_if (++where, database.end (), checkPrefix (pfx));
}
std::cout << "end of prefix listing" << std::endl;
}
void telephoneDirectory::displayByPrefix () {
std::cout << "Display by prefix" << std::endl;
sortedMap sortedData;
for (friendMap::iterator i = database.begin (); i != database.end (); i++)
sortedData.insert (sortedMap::value_type ((*i).second, (*i).first));
std::for_each (sortedData.begin (), sortedData.end (), printSortedEntry);
std::cout << "end display by prefix" << std::endl;
}
int main () {
std::cout << "Telephone Directory sample program" << std::endl;
telephoneDirectory friends;
friends.addEntry ("Samantha", 6342343);
friends.addEntry ("Brenda", 5436546);
friends.addEntry ("Fred", 7435423);
friends.addEntry ("Allen", 6348723);
friends.displayDatabase ();
friends.displayPrefix (634);
friends.displayByPrefix ();
std::cout << "End of telephone directory sample program" << std::endl;
return 0;
}