Public feed
#726267
#include <string>
#include <list>
#include "Ingredient.h"
class Kitchen
{
public:
//member functions
void addIngredient (std::string name, int units);
void printIngredients (std::ostream &ostr);
bool friend RecipeIngredients (Kitchen &kitchen, Recipe &recipe);
void friend removeIngredients (Kitchen &kitchen, Recipe &recipe);
void friend needToBuy(std::ostream &ostr, Kitchen &kitchen, Recipe &recipe);
private:
//member variables
std::list <Ingredient> ingredients;
};
void Kitchen::addIngredient(std::string name, int units)
{
Ingredient ing(name,units);
ingredients.push_back(ing);
}
void Kitchen::printIngredients (std::ostream &ostr)
{
ostr << "In the kitchen:" << std::endl;
ingredients.sort();
std::list<Ingredient>::iterator l_itr=ingredients.begin();
for(l_itr;l_itr!=ingredients.end();l_itr++)
{ if((*l_itr).getUnits()==1)
ostr << " 1 unit of " << (*l_itr).getName() << std::endl;
if((*l_itr).getUnits()>1)
ostr << " " << (*l_itr).getUnits() << " units of " <<(*l_itr).getName() << std::endl; }
}
bool RecipeIngredients(Kitchen &kitchen, Recipe &recipe)
{
std::list<Ingredient>::iterator l_itr=(kitchen.ingredients).begin();
std::list<Ingredient>::iterator m_itr=(recipe.ingredients).begin();
bool haveIngredient=false;
for(m_itr=(recipe.ingredients).begin();m_itr!=(recipe.ingredients).end() ; m_itr++)
{
for(l_itr=(kitchen.ingredients).begin();l_itr!=(kitchen.ingredients).end();l_itr++)
{
if((*m_itr).getName()==(*l_itr).getName() && (*l_itr).getUnits() < (*m_itr).getUnits())
{
return false;
}
if((*m_itr).getName()==(*l_itr).getName() && (*l_itr).getUnits() >= (*m_itr).getUnits())
{
haveIngredient=true;
}
}
if(haveIngredient==false)
return false;
haveIngredient=false;
}
return true;
}
void needToBuy(std::ostream &ostr, Kitchen &kitchen, Recipe &recipe)
{
std::list<Ingredient>::iterator m_itr=(kitchen.ingredients).begin();
std::list<Ingredient>::iterator l_itr=(recipe.ingredients).begin();
std::list<Ingredient> needIngreds;
bool haveingred=false;
Ingredient temp("temp",0);
for(l_itr=(recipe.ingredients).begin() ; l_itr!=(recipe.ingredients).end() ; l_itr++)
{
haveingred=false;
for(m_itr=(kitchen.ingredients).begin() ; m_itr!=(kitchen.ingredients).end() ; m_itr++)
{
if((*m_itr).getName()==(*l_itr).getName())
haveingred=true;
if((*m_itr).getName()==(*l_itr).getName() && (*l_itr).getUnits() > (*m_itr).getUnits())
{
temp.setName((*l_itr).getName());
temp.setUnits((*l_itr).getUnits()-(*m_itr).getUnits());
needIngreds.push_back(temp);
}
}
if (haveingred==false)
{
temp.setName((*l_itr).getName());
temp.setUnits((*l_itr).getUnits());
needIngreds.push_back(temp);
}
}
needIngreds.sort(sortabc);
for(l_itr=needIngreds.begin();l_itr!=needIngreds.end();l_itr++)
{ if((*l_itr).getUnits()==1)
ostr << " 1 unit of " << (*l_itr).getName() << std::endl;
if((*l_itr).getUnits()>1)
ostr << " " << (*l_itr).getUnits() << " units of " <<(*l_itr).getName() << std::endl;
}
}
void removeIngredients(Kitchen &kitchen, Recipe &recipe)
{
std::list<Ingredient>::iterator l_itr=(kitchen.ingredients).begin();
std::list<Ingredient>::iterator m_itr=(recipe.ingredients).begin();
for(m_itr=(recipe.ingredients).begin();m_itr!=(recipe.ingredients).end();m_itr++)
for(l_itr=(kitchen.ingredients).begin();l_itr!=(kitchen.ingredients).end();l_itr++)
if((*l_itr).getName()==(*m_itr).getName())
{
(*l_itr).RemoveUnits((*m_itr).getUnits());
}
//Clean up
l_itr=(kitchen.ingredients).begin();
do
{
if((*l_itr).getUnits()==0)
{
m_itr=l_itr;
l_itr=(kitchen.ingredients).erase(m_itr);
}
else
l_itr++;
}
while(l_itr!=(kitchen.ingredients).end());
}