/************************************************************************** * * stocks.h - Stocks program. * * $Id: stocks.h 636370 2008-03-12 15:32:56Z faridz $ * *************************************************************************** * * 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. * **************************************************************************/ #ifndef STOCKS_H_INCLUDED #define STOCKS_H_INCLUDED #include #include #include #include #include #include #include #include // The stock exchange example displays stock quotes at various exchanges // distributed globally. // The objective of the example is to show monetary, numeric, and date // and time values formated using standard and/or user-defined facets. #if defined (_AIX) # define US_LOCALE "en_US" # define GERMAN_LOCALE "de_DE" # define FRENCH_LOCALE "fr_FR" # define JAPANESE_LOCALE "ja_JP" #elif defined (__hpux) # define US_LOCALE "en_US.iso88591" # define GERMAN_LOCALE "de_DE.iso88591" # define FRENCH_LOCALE "fr_FR.iso88591" # define JAPANESE_LOCALE "ja_JP.eucJP" #elif defined (__linux__) # define US_LOCALE "en_US" # define GERMAN_LOCALE "de_DE" # define FRENCH_LOCALE "fr_FR" # define JAPANESE_LOCALE "ja_JP" #elif defined (__osf__) # define US_LOCALE "en_US.ISO8859-1" # define GERMAN_LOCALE "de_DE.ISO8859-1" # define FRENCH_LOCALE "fr_FR.ISO8859-1" # define JAPANESE_LOCALE "ja_JP" #elif defined (SNI) # define US_LOCALE "En" # define GERMAN_LOCALE "De" # define FRENCH_LOCALE "Fr_FR.850" # define JAPANESE_LOCALE "Ja_JP.932" #elif defined (_WIN32) || defined (_WIN64) # define US_LOCALE "us" # define GERMAN_LOCALE "german_germany.1252" # define FRENCH_LOCALE "french_france.1252" # define JAPANESE_LOCALE "japanese_japan.1252" #else // POSIX simple names # define US_LOCALE "en_US" # define GERMAN_LOCALE "de_DE" # define FRENCH_LOCALE "fr_FR" # define JAPANESE_LOCALE "ja_JP" #endif namespace { const int stock_change[10] = { 0, 1, -1, 2, -1, 3, -3, 4, -1, -1 }; const int indexSize = 10; struct std::tm tmb; } struct Company { Company (const std::string &s, double p) : companyName (s), offerPrice (p), stockPrice (0) {} //In actuality a company should not manipulate stocks. //For simplicity let the company play with its own stock. void updateStock () { stockPrice = offerPrice + stockChange(); if (stockPrice < 0) stockPrice = -(stockPrice); } int stockChange () { return stock_change[changeIndex(true)]; } int changeIndex (bool increment = false) { static int i = 0; if(increment) ++i; if (i > indexSize-1) i = 0; return i; } std::string companyName; double offerPrice; //initial offer price double stockPrice; //current market price private: std::string companyNews; //Make use of messaging (if at all it works !) std::size_t marketOutlook() { return changeIndex(); } }; struct StockXchange: public std::locale::facet { typedef std::basic_ostream > outStream; typedef std::ostreambuf_iterator > iter_type; typedef std::deque > database; typedef std::locale::facet facet; StockXchange(std::size_t refs=0): facet(refs){} virtual ~StockXchange(); static std::locale::id id; virtual bool put (std::ostream& os) const; virtual void add (const std::string& name, double initPrice); virtual void localTime (std::ostream&) const; protected: database companyDatabase; friend StockXchange::outStream& operator<< (StockXchange::outStream&, const StockXchange&); private: #ifdef _RWSTD_NO_MEMBER_TEMPLATES std::locale::id &_C_get_id () const { return id; } #endif }; struct TokyoStockXchange: public StockXchange { TokyoStockXchange (std::size_t refs = 0) : StockXchange (refs) { } virtual void localTime (std::ostream& os) const { // our contrived GMT time is 07:43:00, to use an actual time, // replace the following tmb assignments with: // tmb = std::gmtime (&tm); tmb.tm_sec = 0; tmb.tm_min = 43; tmb.tm_hour = 7; tmb.tm_mday = 4; tmb.tm_mon = 6; tmb.tm_year = 88; tmb.tm_wday = 1; tmb.tm_yday = 185; tmb.tm_isdst = 1; StockXchange::localTime(os); } virtual bool put (std::ostream& os) const { os << '\n'; os << "######## TOKYO STOCK EXCHANGE #########\n"; return StockXchange::put (os); } }; struct FrankfurtStockXchange: public StockXchange { FrankfurtStockXchange (std::size_t refs = 0) : StockXchange (refs) { } virtual void localTime(std::ostream& os) const { // our contrived GMT time is 07:43:00, to use an actual time, replace // the following three tmb assignments with: // tmb = gmtime(&tm); tmb.tm_hour=7; tmb.tm_min=43; tmb.tm_sec=00; StockXchange::localTime(os); } virtual bool put (std::ostream& os) const { os << '\n'; os << "######## FRANKFURTER WERTPAPIERB\366RSE #########\n"; return StockXchange::put (os); } }; struct NewYorkStockXchange: public StockXchange { NewYorkStockXchange (std::size_t refs = 0) : StockXchange (refs) { } virtual void localTime(std::ostream& os) const { // our contrived GMT time is 07:43:00, for a GMT-5 of 02:43:00 // to use an actual time, replace the following three tmb // assignments with: // tmb = localtime(&tm); tmb.tm_hour=2; tmb.tm_min=43; tmb.tm_sec=00; StockXchange::localTime(os); } virtual bool put (std::ostream& os) const { os << '\n'; os << "######## NEW YORK STOCK EXCHANGE ########\n"; return StockXchange::put (os); } }; struct ParisStockXchange: public StockXchange { ParisStockXchange (std::size_t refs = 0) : StockXchange (refs){} virtual void localTime(std::ostream& os) const { // our contrived GMT time is 07:43:00, to use an actual time, replace // the following three tmb assignments with: // tmb = gmtime(&tm); tmb.tm_hour=7; tmb.tm_min=43; tmb.tm_sec=00; StockXchange::localTime(os); } virtual bool put (std::ostream& os) const { os << '\n'; os << "######## BOURSE DE PARIS #########\n"; return StockXchange::put (os); } }; #endif // STOCKS_H_INCLUDED