1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
/***************************************************************************
* Copyright (C) 2003 by Unai Garro *
* ugarro@users.sourceforge.net *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
***************************************************************************/
#include "shoppingcalculator.h"
#include <kdebug.h>
#include "propertycalculator.h"
#include "datablocks/elementlist.h"
#include "datablocks/ingredientlist.h"
#include "backends/recipedb.h"
//NOTE: The code as-is uses the lower value if an ingredient range exists
// However, the shopping list is calculated using the upper value
// because the values are already adjusted prior to being passed
// to these functions
void calculateShopping( const ElementList &recipeList, IngredientList *ingredientList, RecipeDB *db )
{
for ( ElementList::const_iterator recipe_it = recipeList.begin(); recipe_it != recipeList.end(); ++recipe_it ) {
Recipe rec;
db->loadRecipe( &rec, RecipeDB::Ingredients, ( *recipe_it ).id );
sum( ingredientList, &( rec.ingList ), db );
}
}
void sum( IngredientList *totalIngredientList, IngredientList *newIngredientList, RecipeDB *db )
{
for ( IngredientList::const_iterator ing_it = newIngredientList->begin(); ing_it != newIngredientList->end(); ++ing_it ) {
IngredientList::iterator pos_it;
// Find out if ingredient exists in list already
int pos = totalIngredientList->find( ( *ing_it ).ingredientID );
if ( pos >= 0 ) // the ingredient is already listed
{
pos_it = totalIngredientList->at( pos );
// Variables to store the new total
Ingredient result;
bool converted;
// Do the conversion
// try to with this and next in the list until conversion rate is
// found or end of list is reached
IngredientList::iterator lastpos_it; // for 'backup'
do
{
lastpos_it = pos_it;
// Try to convert
converted = autoConvert( db, *ing_it, *pos_it, result );
}
while ( ( !converted ) && ( ( ( pos_it = totalIngredientList->find( ++pos_it, ( *ing_it ).ingredientID ) ) ) != totalIngredientList->end() ) );
// If the conversion was succesful, Set the New Values
if ( converted ) {
*lastpos_it = result;
}
else // Otherwise append this ingredient at the end of the list
{
// Insert ingredient ID in the list
totalIngredientList->append( *ing_it );
}
}
else // The ingredient is not in the list, just append
{
totalIngredientList->append( *ing_it );
}
}
}
|