Public feed #726267

Untitled

public text v1 · immutable
Raw Edit
·published 2007-10-05 01:11 UTC
rendered paste body
#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());
}