/************************************************************************** * * tele.cpp - Telephone directory sample program. * * $Id: tele.cpp 550991 2007-06-26 23:58:07Z sebor $ * *************************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you 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. * * Copyright 1994-2006 Rogue Wave Software. * **************************************************************************/ #include #include #include #include #include #include typedef std::map, std::allocator > > friendMap; typedef std::map, std::allocator > > 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; }