| /************************************************************************** |
| * |
| * stocks.cpp - An example program using STL's money_punct, num_put |
| * and time_put locale facets. |
| * |
| * $Id$ |
| * |
| *************************************************************************** |
| * |
| * 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 <clocale> |
| #include <iostream> |
| #include <locale> |
| |
| #include <stocks.h> |
| #include <examples.h> |
| |
| |
| // definition of the required facet id |
| std::locale::id StockXchange::id; |
| |
| |
| void StockXchange::localTime (std::ostream& os) const |
| { |
| const char pat[] = "%c"; |
| |
| typedef std::time_put<char, iter_type> TimePut; |
| const TimePut& tp = std::use_facet<TimePut>(os.getloc ()); |
| iter_type begin (os); |
| |
| os << "\t ["; |
| tp.put (begin, os, ' ', &tmb, &pat [0], pat + sizeof pat - 1); |
| os << "]\n"; |
| } |
| |
| |
| void StockXchange::add (const std::string& name, double initPrice) |
| { |
| companyDatabase.push_front (new Company (name, initPrice)); |
| } |
| |
| |
| bool StockXchange::put (std::ostream& os) const |
| { |
| std::locale loc = os.getloc (); |
| localTime (os); //display the local time |
| |
| typedef std::moneypunct<char, false> MoneyPunct; |
| const MoneyPunct &mpunct = std::use_facet<MoneyPunct>(loc); |
| |
| typedef std::num_put<char, iter_type> NumPut; |
| const NumPut &np = std::use_facet<NumPut>(loc); |
| |
| os << "\nCompany" << "\t\t\t" << "Initial Price" << "\t" |
| << "Current Price" << "\t" << "Volume\n" |
| << "-------" << "\t\t\t" << "------------" << "\t" |
| << "----------" << "\t" << "______\n\n"; |
| |
| iter_type itbegin (os); |
| |
| database::const_iterator begin = companyDatabase.begin (); |
| database::const_iterator end = companyDatabase.end (); |
| |
| while (begin < end) { |
| |
| Company *info = *begin++; |
| info->updateStock (); |
| |
| os << info->companyName << "\t\t"; |
| os << mpunct.curr_symbol (); |
| np.put (itbegin, os, ' ', info->offerPrice); |
| os << "\t\t"; |
| os << mpunct.curr_symbol (); |
| np.put (itbegin, os, ' ', info->stockPrice); |
| os << "\t\t"; |
| long volume = stock_change[info->changeIndex ()]*1000L; |
| if (volume < 0) |
| volume = -volume; |
| np.put (itbegin, os, ' ', volume); |
| os << '\n'; |
| } |
| |
| return true; |
| } |
| |
| |
| std::ostream & operator<< (std::ostream& os, const StockXchange&) |
| { |
| const std::locale loc = os.getloc (); |
| const StockXchange &se_facet = std::use_facet<StockXchange>(loc); |
| se_facet.put (os); |
| return os; |
| } |
| |
| |
| int main () |
| { |
| typedef std::pair<StockXchange*, std::locale> sl_pair; |
| typedef std::deque<sl_pair*, std::allocator<sl_pair*> > Xchange; |
| Xchange sXchange; |
| |
| std::ostream os (std::cout.rdbuf ()); |
| |
| // Add some hypothetical companies that went public. |
| // ("Company name" , "initial stock price") |
| |
| NewYorkStockXchange *nse = new NewYorkStockXchange; |
| nse->add ("Hyper Software", 20.50); |
| nse->add ("Florida Fish", 15.10); |
| nse->add ("Inka Inc", 9.50); |
| nse->add ("Emory Chemicals", 11.00); |
| |
| TokyoStockXchange *tse = new TokyoStockXchange; |
| tse->add ("Akiro Electronics", 12.30); |
| |
| FrankFurtStockXchange *fse = new FrankFurtStockXchange; |
| fse->add ("B\166rsen-Software", 9.75); |
| fse->add ("M\174nchner R\174ck", 19.75); |
| |
| ParisStockXchange *pse = new ParisStockXchange; |
| pse->add ("Wines Inc.", 11.50); |
| pse->add ("Eiffel Co.", 11.50); |
| |
| const char *p = std::setlocale (LC_ALL, US_LOCALE); |
| if (!p) |
| std::cerr << "\nNot a valid locale: " << US_LOCALE << '\n'; |
| else { |
| os.imbue (std::locale (std::locale (US_LOCALE), nse)); |
| sXchange.push_front (new sl_pair (nse, os.getloc ())); |
| os << *nse; |
| } |
| |
| p = std::setlocale (LC_ALL, GERMAN_LOCALE); |
| if (!p) |
| std::cerr<< "\nNot a valid locale: " << GERMAN_LOCALE << '\n'; |
| else { |
| os.imbue (std::locale (std::locale (GERMAN_LOCALE), fse)); |
| sXchange.push_front (new sl_pair (fse, os.getloc ())); |
| os << *fse; |
| } |
| |
| p = std::setlocale (LC_ALL, FRENCH_LOCALE); |
| if (!p) |
| std::cerr << "\nNot a valid locale: " << FRENCH_LOCALE << '\n'; |
| else { |
| os.imbue (std::locale (std::locale (FRENCH_LOCALE), pse)); |
| sXchange.push_front (new sl_pair (pse, os.getloc ())); |
| os << *pse; |
| } |
| |
| p = std::setlocale (LC_ALL, JAPANESE_LOCALE); |
| if (!p) |
| std::cerr << "\nNot a valid locale: " << JAPANESE_LOCALE << '\n'; |
| else { |
| os.imbue (std::locale (std::locale (JAPANESE_LOCALE), tse)); |
| sXchange.push_front (new sl_pair (tse, os.getloc ())); |
| os << *tse; |
| } |
| |
| for (char q = '\0'; ; ) { |
| std::cout << "\nWant to see another quote [enter 'q' to quit] ?"; |
| std::cin >> q; |
| if (q != 'q') { |
| Xchange::const_iterator it_begin = sXchange.begin (); |
| Xchange::const_iterator it_end = sXchange.end (); |
| while (it_begin < it_end) { |
| os.imbue ((*it_begin)->second); |
| os << (*(*it_begin)->first); |
| it_begin++; |
| } |
| } |
| else |
| break; |
| } |
| |
| std::cout << '\n'; |
| |
| return 0; |
| } |