All pastes #985584 Raw Edit

Unnamed

public text v1 · immutable
·published 2008-04-15 03:24 UTC
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