topical media & game development
professional-program-09-NestedClasses-Spreadsheet.c
? /
professional-program-09-NestedClasses-Spreadsheet.c
include <Spreadsheet.h>
include <iostream>
include <sstream>
using namespace std;
int Spreadsheet::sCounter = 0;
// Microsoft Visual Studio requires you to omit the following two lines.
// However, some compilers require them.
//const int Spreadsheet::kMaxHeight;
//const int Spreadsheet::kMaxWidth;
bool Spreadsheet::inRange(int val, int upper)
{
return (val >= 0 && val < upper);
}
Spreadsheet::Spreadsheet(const SpreadsheetApplication& theApp,
int inWidth, int inHeight)
: mWidth(inWidth < kMaxWidth ? inWidth : kMaxWidth),
mHeight(inHeight < kMaxHeight ? inHeight : kMaxHeight), mTheApp(theApp)
{
mId = sCounter++;
mCells = new SpreadsheetCell* [mWidth];
for (int i = 0; i < mWidth; i++) {
mCells[i] = new SpreadsheetCell[mHeight];
}
}
void Spreadsheet::setCellAt(int x, int y, const SpreadsheetCell& cell)
{
if (!inRange(x, mWidth) || !inRange(y, mHeight)) {
return;
}
mCells[x][y] = cell;
}
/*
Spreadsheet::SpreadsheetCell Spreadsheet::getCellAt(int x, int y)
{
SpreadsheetCell empty;
if (!inRange(x, mWidth) || !inRange(y, mHeight)) {
return (empty);
}
return (mCells[x][y]);
}
*/
SCell Spreadsheet::getCellAt(int x, int y)
{
SpreadsheetCell empty;
if (!inRange(x, mWidth) || !inRange(y, mHeight)) {
return (empty);
}
return (mCells[x][y]);
}
Spreadsheet::~Spreadsheet()
{
for (int i = 0; i < mWidth; i++) {
delete [] mCells[i];
}
delete [] mCells;
}
void Spreadsheet::copyFrom(const Spreadsheet& src)
{
int i, j;
mWidth = src.mWidth;
mHeight = src.mHeight;
mCells = new SpreadsheetCell* [mWidth];
for (i = 0; i < mWidth; i++) {
mCells[i] = new SpreadsheetCell[mHeight];
}
for (i = 0; i < mWidth; i++) {
for (j = 0; j < mHeight; j++) {
mCells[i][j] = src.mCells[i][j];
}
}
}
Spreadsheet::Spreadsheet(const Spreadsheet& src) :
mTheApp(src.mTheApp)
{
mId = sCounter++;
copyFrom(src);
}
Spreadsheet& Spreadsheet::operator=(const Spreadsheet& rhs)
{
int i;
// check for self-assignment
if (this == &rhs) {
return (*this);
}
// free the old memory
for (i = 0; i < mWidth; i++) {
delete [] mCells[i];
}
delete [] mCells;
// copy the new memory
copyFrom(rhs);
return (*this);
}
int Spreadsheet::getId()
{
return (mId);
}
SCell::SpreadsheetCell() : mValue(0), mNumAccesses(0)
{
}
SCell::SpreadsheetCell(double initialValue) : mNumAccesses(0)
{
set(initialValue);
}
SCell::SpreadsheetCell(const string& initialValue) :
mValue(stringToDouble(initialValue)), mString(initialValue), mNumAccesses(0)
{
}
SCell::SpreadsheetCell(const SpreadsheetCell& src)
{
mValue = src.mValue;
mString = src.mString;
mNumAccesses = src.mNumAccesses;
}
SCell& SCell::operator=(const SpreadsheetCell& rhs)
{
if (this == &rhs) {
return (*this);
}
mValue = rhs.mValue;
mString = rhs.mString;
mNumAccesses = rhs.mNumAccesses;
return (*this);
}
void SCell::set(double inValue)
{
mValue = inValue;
mString = doubleToString(mValue);
}
void SCell::set(const string& inString)
{
mString = inString;
mValue = stringToDouble(mString);
}
string SCell::doubleToString(double inValue)
{
ostringstream ostr;
ostr << inValue;
return (ostr.str());
}
double SCell::stringToDouble(const string& inString)
{
double temp;
istringstream istr(inString);
istr >> temp;
if (istr.fail() || !istr.eof()) {
return (0);
}
return (temp);
}
/*
Spreadsheet::SpreadsheetCell::SpreadsheetCell() : mValue(0), mNumAccesses(0)
{
}
Spreadsheet::SpreadsheetCell::SpreadsheetCell(double initialValue) : mNumAccesses(0)
{
set(initialValue);
}
Spreadsheet::SpreadsheetCell::SpreadsheetCell(const string& initialValue) :
mValue(stringToDouble(initialValue)), mString(initialValue), mNumAccesses(0)
{
}
Spreadsheet::SpreadsheetCell::SpreadsheetCell(const SpreadsheetCell& src)
{
mValue = src.mValue;
mString = src.mString;
mNumAccesses = src.mNumAccesses;
}
Spreadsheet::SpreadsheetCell& Spreadsheet::SpreadsheetCell::operator=(const SpreadsheetCell& rhs)
{
if (this == &rhs) {
return (*this);
}
mValue = rhs.mValue;
mString = rhs.mString;
mNumAccesses = rhs.mNumAccesses;
return (*this);
}
void Spreadsheet::SpreadsheetCell::set(double inValue)
{
mValue = inValue;
mString = doubleToString(mValue);
}
void Spreadsheet::SpreadsheetCell::set(const string& inString)
{
mString = inString;
mValue = stringToDouble(mString);
}
string Spreadsheet::SpreadsheetCell::doubleToString(double inValue)
{
ostringstream ostr;
ostr << inValue;
return (ostr.str());
}
double Spreadsheet::SpreadsheetCell::stringToDouble(const string& inString)
{
double temp;
istringstream istr(inString);
istr >> temp;
if (istr.fail() || !istr.eof()) {
return (0);
}
return (temp);
}
*/
(C) Æliens
20/2/2008
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.