rendered paste body//building.h
//Final version.
#ifndef BUILDING_H
#define BUILDING_H
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Visitor;
class Street;
class Building;
class Renter;
class Structure;
class Object{};
class Visitor : public Object
{
protected:
int success;
int indent;
public:
Visitor() {success = 0; indent = 0;};
virtual void setSuccess(int i) { success = i;};
void printindent(){
for (int i = 0; i < indent; i++)
cout<< "\t";};
virtual void visit(Street *) = 0;
virtual void visit(Building *) = 0;
};
class Renter : public Visitor
{
private:
int success;
string name;
public:
Renter(string n) : Visitor() {name = n;};
virtual void setSuccess(int i) { success = i;};
virtual string getName(){return name;};
virtual void visit(Street * s);
virtual void visit(Building * b);
};
class Structure : public Object
{
protected:
string name;
string materials;
int size;
string function;
Structure * parent;
public:
Structure (){};
virtual void SetName(const string& s) {name = s;};
virtual void SetBuildingMaterials(const string& s) { materials = s;};
virtual void SetFunction(const string& s) {function = s;};
virtual void SetSize(const int& s) {size = s;};
virtual string GetName() {return name;};
virtual string GetBuildingMaterials() {return materials;};
virtual string GetFunction() {return function;};
virtual int GetTotalRooms() = 0;
virtual int GetOccupancy() = 0;
virtual void LookAt() = 0;
virtual void ListRenters() = 0;
virtual int GetNumBuildings() {return -1;};
virtual int GetNumLotsTotal() {return -1;};
virtual Structure * GetParent() {return parent;};
virtual void SetParent(Structure * s) {parent = s;};
virtual void accept(Visitor * v) = 0;
virtual int addStructure(Structure* ){return -1;};
virtual int addRenter(Renter* ){return -1;};
Renter * GetRenter(int index){return NULL;};
};
class Building : public Structure
{
protected:
vector<Renter*> * renters;
public:
Building() {renters = new vector<Renter*>();};
virtual int GetOccupancy() {return (renters->size());}
virtual int GetTotalRooms(){return size;};
Renter * GetRenter(int index){return renters->at(index);};
int addRenter(Renter* renter){
if (GetOccupancy() < GetTotalRooms())
{ renters->push_back(renter);
return 0;}
else
return -1;
}
virtual void ListRenters(){
cout << GetOccupancy() << " renter(s) in this building.\n";
for (int i = 0; i < GetOccupancy(); i++)
cout << GetRenter(i)->getName() << " lives here.\n";
}
void LookAt(){
cout << "A "<< GetName()<< " made of "<< GetBuildingMaterials()
<< ", "<< GetTotalRooms()<< " residential rooms, " << GetTotalRooms() - GetOccupancy()
<< " availible, with the function of " << GetFunction() <<endl;
}
void accept (Visitor * v){v->visit(this);};
};
class Street : public Structure
{
protected:
vector<Structure*> * buildings;
public:
Street(){
buildings = new vector<Structure*>();};
virtual int GetNumBuildings(){return buildings->size();};
virtual int GetNumBuildingsTotal(){return (size - buildings->size());};;
Structure * getLot(int index){ return buildings->at(index); }
virtual void ListRenters(){
cout << GetOccupancy() << " renter(s) on this street.\n";
for (int i = 0; i < GetNumBuildings(); i++){
cout << "In " << buildings->at(i)->GetName() << ":\n";
buildings->at(i)->ListRenters();
}
}
virtual int GetTotalRooms(){
int k = 0;
for(int i = 0; i < GetNumBuildings(); i++)
{
k += getLot(i)->GetTotalRooms();
}
return k;
}
virtual int GetOccupancy(){
int k = 0;
for(int i = 0; i < GetNumBuildings(); i++)
{
k += getLot(i)->GetOccupancy();
}
return k;
}
int addStructure(Structure* building)
{
if (GetNumBuildings() >= GetNumBuildingsTotal())
return -1;
building->SetParent(this);
buildings->push_back(building);
return 0;
};
void LookAt()
{
cout << "A "<< GetName()<< " made of "<< GetBuildingMaterials()<< ", with "<< GetNumBuildings()<< " building(s) built on it, and "<<GetNumBuildingsTotal()- GetNumBuildings() << " lots availible.\n";
};
void accept (Visitor * v){v->visit(this);};
};
class StructureBuilder : public Object
{
public:
virtual Structure * getStructure() = 0;
virtual void newStructure() = 0;
virtual void buildBuildingMaterials() = 0;
virtual void buildSize() = 0;
virtual void buildFunction() = 0;
virtual int addStructure(Structure *) {return -1;};
};
class BuildingBuilder : public StructureBuilder
{
protected:
Building * myBuilding;
public:
BuildingBuilder() {};
Building * getBuilding(){return myBuilding;};
Structure * getStructure() {return myBuilding;};
virtual void newStructure() = 0;
virtual void buildBuildingMaterials() = 0;
virtual void buildSize() = 0;
virtual void buildFunction() = 0;
};
class StreetBuilder : public StructureBuilder
{
protected:
Street * myStreet;
int i;
public:
StreetBuilder() : StructureBuilder() {i = 0;};
virtual Street * getStreet(){return myStreet;};
virtual Structure * getStructure() {return myStreet;};
virtual void newStructure() = 0;
virtual void buildBuildingMaterials() = 0;
virtual void buildSize() = 0;
virtual void buildFunction() = 0;
virtual int addStructure(Structure *) = 0;
};
class ConcreteRoadBuilder : public StreetBuilder
{
void newStructure(){myStreet = (new Street());myStreet->SetName("Concrete Road");};
void buildBuildingMaterials() {myStreet->SetBuildingMaterials("concrete");};
void buildSize(){ myStreet->SetSize(10);};
void buildFunction() { myStreet->SetFunction("to be a nice street");};
int addStructure(Structure * b){
return myStreet->addStructure(b);
};
};
class HouseBuilder : public BuildingBuilder
{
public:
void newStructure(){myBuilding = (new Building());myBuilding->SetName("House");};
void buildBuildingMaterials() {myBuilding->SetBuildingMaterials("wood");};
void buildSize() {myBuilding->SetSize(4);};
void buildFunction() {myBuilding->SetFunction(
"keep you dry when it rains");};
};
class SkyscraperBuilder : public BuildingBuilder
{
public:
void newStructure(){myBuilding = (new Building());myBuilding->SetName("Skyscraper");};
void buildBuildingMaterials() {myBuilding->SetBuildingMaterials("steel");};
void buildSize() {myBuilding->SetSize(100);};
void buildFunction() {myBuilding->SetFunction(
"to gouge people visiting the viewing deck");};
};
class SchoolBuilder : public BuildingBuilder
{
public:
void newStructure(){myBuilding = (new Building());myBuilding->SetName("School");};
void buildBuildingMaterials() {myBuilding->SetBuildingMaterials("brick");};
void buildSize() {myBuilding->SetSize(0);};
void buildFunction() {myBuilding->SetFunction(
"to make you learn something useful (maybe)");};
};
class Contractor
{
private:
StructureBuilder *myBuilder;
public:
void setBuilder(StructureBuilder * b){if (myBuilder != NULL) delete myBuilder; myBuilder = b;};
Structure * getStructure(){ return myBuilder->getStructure();};
Structure * construct() {
myBuilder->newStructure();
myBuilder->buildBuildingMaterials();
myBuilder->buildSize();
myBuilder->buildFunction();
return getStructure();
}
Structure * construct(StructureBuilder * b) {
myBuilder = b; return this->construct();
}
Structure * addStructureToStreet(StructureBuilder * b){
Contractor * subContractor = new Contractor();
subContractor->setBuilder(b);
Structure * building = subContractor->construct();
if (myBuilder->addStructure(building) == -1){
cerr <<"Error adding building\n";
delete subContractor; return NULL;}
return (subContractor->getStructure());
}
void addStructureToStreet(Structure * b){
if (myBuilder->addStructure(b) == -1)
cerr<<"Error adding building\n";
}
};
void Renter::visit(Street * s)
{
printindent();
indent++;
if(success == 1) return;
cout << getName() << " is walking down a " << s->GetName() << " looking for a room.\n";
for (int i = 0; i < s->GetNumBuildings(); i++){
s->getLot(i)->accept(this);
if(success == 1) return;
}
cout << "No rooms availible on this street.\n";
indent--;
}
void Renter::visit(Building * b)
{
printindent();
if(success == 1) return;
if (b->GetTotalRooms() > b->GetOccupancy())
{ b->addRenter(this);
success = 1;
cout <<getName() << " found a place to stay at " << b->GetName() << endl;
}
else
{
cout <<b->GetName() <<" has no rooms availibile, moving on..."<< endl;
}
}
#endif