#include #include #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 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::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::iterator l_itr=(kitchen.ingredients).begin(); std::list::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::iterator m_itr=(kitchen.ingredients).begin(); std::list::iterator l_itr=(recipe.ingredients).begin(); std::list 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::iterator l_itr=(kitchen.ingredients).begin(); std::list::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()); }