blob: 3a4816b4be309814ebd57b8591d6b6de8c7a125f [file] [log] [blame]
/**************************************************************************
*
* stocks.h - Stocks program.
*
* $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.
*
**************************************************************************/
#ifndef STOCKS_H_INCLUDED
#define STOCKS_H_INCLUDED
#include <ctime>
#include <locale>
#include <string>
#include <deque>
#include <stdexcept>
#include <iterator>
#include <sstream>
#include <examples.h>
// 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)
# 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<char,std::char_traits<char> > outStream;
typedef std::ostreambuf_iterator<char, std::char_traits<char> > iter_type;
typedef std::deque<Company*,std::allocator<Company*> > 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&);
};
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