X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fcraftdef.cpp;h=67c3ae62ac39205be2f37abc7f15457c1aba58d2;hb=65c09a96f41705bb8e75fc5ff4276342be91ed11;hp=8c0e91690d0ddf006c68349ac41f48ed6acbae64;hpb=0310123bc920874312968b498828bbd7bb3b3113;p=minetest.git diff --git a/src/craftdef.cpp b/src/craftdef.cpp index 8c0e91690..67c3ae62a 100644 --- a/src/craftdef.cpp +++ b/src/craftdef.cpp @@ -112,10 +112,9 @@ static std::vector craftGetItemNames( const std::vector &itemstrings, IGameDef *gamedef) { std::vector result; - for (std::vector::const_iterator - it = itemstrings.begin(); - it != itemstrings.end(); it++) { - result.push_back(craftGetItemName(*it, gamedef)); + for (std::vector::size_type i = 0; + i < itemstrings.size(); i++) { + result.push_back(craftGetItemName(itemstrings[i], gamedef)); } return result; } @@ -125,10 +124,9 @@ static std::vector craftGetItemNames( const std::vector &items, IGameDef *gamedef) { std::vector result; - for (std::vector::const_iterator - it = items.begin(); - it != items.end(); it++) { - result.push_back(it->name); + for (std::vector::size_type i = 0; + i < items.size(); i++) { + result.push_back(items[i].name); } return result; } @@ -138,10 +136,9 @@ static std::vector craftGetItems( const std::vector &items, IGameDef *gamedef) { std::vector result; - for (std::vector::const_iterator - it = items.begin(); - it != items.end(); it++) { - result.push_back(ItemStack(std::string(*it), (u16)1, + for (std::vector::size_type i = 0; + i < items.size(); i++) { + result.push_back(ItemStack(std::string(items[i]), (u16)1, (u16)0, "", gamedef->getItemDefManager())); } return result; @@ -156,11 +153,10 @@ static bool craftGetBounds(const std::vector &items, unsigned int w bool success = false; unsigned int x = 0; unsigned int y = 0; - for (std::vector::const_iterator - it = items.begin(); - it != items.end(); it++) { + for (std::vector::size_type i = 0; + i < items.size(); i++) { // Is this an actual item? - if (*it != "") { + if (items[i] != "") { if (!success) { // This is the first nonempty item min_x = max_x = x; @@ -187,11 +183,10 @@ static bool craftGetBounds(const std::vector &items, unsigned int w // Removes 1 from each item stack static void craftDecrementInput(CraftInput &input, IGameDef *gamedef) { - for (std::vector::iterator - it = input.items.begin(); - it != input.items.end(); it++) { - if (it->count != 0) - it->remove(1); + for (std::vector::size_type i = 0; + i < input.items.size(); i++) { + if (input.items[i].count != 0) + input.items[i].remove(1); } } @@ -199,6 +194,7 @@ static void craftDecrementInput(CraftInput &input, IGameDef *gamedef) // Example: if replacements contains the pair ("bucket:bucket_water", "bucket:bucket_empty"), // a water bucket will not be removed but replaced by an empty bucket. static void craftDecrementOrReplaceInput(CraftInput &input, + std::vector &output_replacements, const CraftReplacements &replacements, IGameDef *gamedef) { @@ -210,29 +206,33 @@ static void craftDecrementOrReplaceInput(CraftInput &input, // Make a copy of the replacements pair list std::vector > pairs = replacements.pairs; - for (std::vector::iterator - it = input.items.begin(); - it != input.items.end(); it++) { - if (it->count == 1) { - // Find an appropriate replacement - bool found_replacement = false; - for (std::vector >::iterator - j = pairs.begin(); - j != pairs.end(); j++) { - if (it->name == craftGetItemName(j->first, gamedef)) { - it->deSerialize(j->second, gamedef->idef()); + for (std::vector::size_type i = 0; + i < input.items.size(); i++) { + ItemStack &item = input.items[i]; + // Find an appropriate replacement + bool found_replacement = false; + for (std::vector >::iterator + j = pairs.begin(); + j != pairs.end(); ++j) { + if (inputItemMatchesRecipe(item.name, j->first, gamedef->idef())) { + if (item.count == 1) { + item.deSerialize(j->second, gamedef->idef()); found_replacement = true; pairs.erase(j); break; + } else { + ItemStack rep; + rep.deSerialize(j->second, gamedef->idef()); + item.remove(1); + found_replacement = true; + output_replacements.push_back(rep); + break; } } - // No replacement was found, simply decrement count to zero - if (!found_replacement) - it->remove(1); - } else if (it->count >= 2) { - // Ignore replacements for items with count >= 2 - it->remove(1); } + // No replacement was found, simply decrement count by one + if (!found_replacement && item.count > 0) + item.remove(1); } } @@ -241,18 +241,17 @@ static std::string craftDumpMatrix(const std::vector &items, unsigned int width) { std::ostringstream os(std::ios::binary); - os<<"{ "; + os << "{ "; unsigned int x = 0; - for(std::vector::const_iterator - it = items.begin(); - it != items.end(); it++, x++) { + for(std::vector::size_type i = 0; + i < items.size(); i++, x++) { if (x == width) { - os<<"; "; + os << "; "; x = 0; } else if (x != 0) { - os<<","; + os << ","; } - os << '"' << (*it) << '"'; + os << '"' << items[i] << '"'; } os << " }"; return os.str(); @@ -265,16 +264,15 @@ std::string craftDumpMatrix(const std::vector &items, std::ostringstream os(std::ios::binary); os << "{ "; unsigned int x = 0; - for (std::vector::const_iterator - it = items.begin(); - it != items.end(); it++, x++) { + for (std::vector::size_type i = 0; + i < items.size(); i++, x++) { if (x == width) { os << "; "; x = 0; } else if (x != 0) { - os<<","; + os << ","; } - os << '"' << (it->getItemString()) << '"'; + os << '"' << (items[i].getItemString()) << '"'; } os << " }"; return os.str(); @@ -313,10 +311,12 @@ std::string CraftReplacements::dump() const std::ostringstream os(std::ios::binary); os<<"{"; const char *sep = ""; - for (std::vector >::const_iterator - it = pairs.begin(); - it != pairs.end(); it++) { - os << sep << '"' << (it->first) << "\"=>\"" << (it->second) << '"'; + for (std::vector >::size_type i = 0; + i < pairs.size(); i++) { + const std::pair &repl_p = pairs[i]; + os << sep + << '"' << (repl_p.first) + << "\"=>\"" << (repl_p.second) << '"'; sep = ","; } os << "}"; @@ -408,9 +408,10 @@ CraftInput CraftDefinitionShaped::getInput(const CraftOutput &output, IGameDef * return CraftInput(CRAFT_METHOD_NORMAL,width,craftGetItems(recipe,gamedef)); } -void CraftDefinitionShaped::decrementInput(CraftInput &input, IGameDef *gamedef) const +void CraftDefinitionShaped::decrementInput(CraftInput &input, std::vector &output_replacements, + IGameDef *gamedef) const { - craftDecrementOrReplaceInput(input, replacements, gamedef); + craftDecrementOrReplaceInput(input, output_replacements, replacements, gamedef); } CraftHashType CraftDefinitionShaped::getHashType() const @@ -473,11 +474,11 @@ bool CraftDefinitionShapeless::check(const CraftInput &input, IGameDef *gamedef) // Filter empty items out of input std::vector input_filtered; - for (std::vector::const_iterator - it = input.items.begin(); - it != input.items.end(); it++) { - if (it->name != "") - input_filtered.push_back(it->name); + for (std::vector::size_type i = 0; + i < input.items.size(); i++) { + const ItemStack &item = input.items[i]; + if (item.name != "") + input_filtered.push_back(item.name); } // If there is a wrong number of items in input, no match @@ -529,9 +530,10 @@ CraftInput CraftDefinitionShapeless::getInput(const CraftOutput &output, IGameDe return CraftInput(CRAFT_METHOD_NORMAL, 0, craftGetItems(recipe, gamedef)); } -void CraftDefinitionShapeless::decrementInput(CraftInput &input, IGameDef *gamedef) const +void CraftDefinitionShapeless::decrementInput(CraftInput &input, std::vector &output_replacements, + IGameDef *gamedef) const { - craftDecrementOrReplaceInput(input, replacements, gamedef); + craftDecrementOrReplaceInput(input, output_replacements, replacements, gamedef); } CraftHashType CraftDefinitionShapeless::getHashType() const @@ -620,14 +622,14 @@ bool CraftDefinitionToolRepair::check(const CraftInput &input, IGameDef *gamedef ItemStack item1; ItemStack item2; - for (std::vector::const_iterator - it = input.items.begin(); - it != input.items.end(); it++) { - if (!it->empty()) { + for (std::vector::size_type i = 0; + i < input.items.size(); i++) { + const ItemStack &item = input.items[i]; + if (!item.empty()) { if (item1.empty()) - item1 = *it; + item1 = item; else if (item2.empty()) - item2 = *it; + item2 = item; else return false; } @@ -640,14 +642,14 @@ CraftOutput CraftDefinitionToolRepair::getOutput(const CraftInput &input, IGameD { ItemStack item1; ItemStack item2; - for (std::vector::const_iterator - it = input.items.begin(); - it != input.items.end(); it++) { - if (!it->empty()) { + for (std::vector::size_type i = 0; + i < input.items.size(); i++) { + const ItemStack &item = input.items[i]; + if (!item.empty()) { if (item1.empty()) - item1 = *it; + item1 = item; else if (item2.empty()) - item2 = *it; + item2 = item; } } ItemStack repaired = craftToolRepair(item1, item2, additional_wear, gamedef); @@ -661,7 +663,8 @@ CraftInput CraftDefinitionToolRepair::getInput(const CraftOutput &output, IGameD return CraftInput(CRAFT_METHOD_COOKING, additional_wear, stack); } -void CraftDefinitionToolRepair::decrementInput(CraftInput &input, IGameDef *gamedef) const +void CraftDefinitionToolRepair::decrementInput(CraftInput &input, std::vector &output_replacements, + IGameDef *gamedef) const { craftDecrementInput(input, gamedef); } @@ -689,11 +692,11 @@ bool CraftDefinitionCooking::check(const CraftInput &input, IGameDef *gamedef) c // Filter empty items out of input std::vector input_filtered; - for (std::vector::const_iterator - it = input.items.begin(); - it != input.items.end(); it++) { - if (it->name != "") - input_filtered.push_back(it->name); + for (std::vector::size_type i = 0; + i < input.items.size(); i++) { + const std::string &name = input.items[i].name; + if (name != "") + input_filtered.push_back(name); } // If there is a wrong number of items in input, no match @@ -720,9 +723,10 @@ CraftInput CraftDefinitionCooking::getInput(const CraftOutput &output, IGameDef return CraftInput(CRAFT_METHOD_COOKING,cooktime,craftGetItems(rec,gamedef)); } -void CraftDefinitionCooking::decrementInput(CraftInput &input, IGameDef *gamedef) const +void CraftDefinitionCooking::decrementInput(CraftInput &input, std::vector &output_replacements, + IGameDef *gamedef) const { - craftDecrementOrReplaceInput(input, replacements, gamedef); + craftDecrementOrReplaceInput(input, output_replacements, replacements, gamedef); } CraftHashType CraftDefinitionCooking::getHashType() const @@ -780,11 +784,11 @@ bool CraftDefinitionFuel::check(const CraftInput &input, IGameDef *gamedef) cons // Filter empty items out of input std::vector input_filtered; - for (std::vector::const_iterator - it = input.items.begin(); - it != input.items.end(); it++) { - if (it->name != "") - input_filtered.push_back(it->name); + for (std::vector::size_type i = 0; + i < input.items.size(); i++) { + const std::string &name = input.items[i].name; + if (name != "") + input_filtered.push_back(name); } // If there is a wrong number of items in input, no match @@ -811,9 +815,10 @@ CraftInput CraftDefinitionFuel::getInput(const CraftOutput &output, IGameDef *ga return CraftInput(CRAFT_METHOD_COOKING,(int)burntime,craftGetItems(rec,gamedef)); } -void CraftDefinitionFuel::decrementInput(CraftInput &input, IGameDef *gamedef) const +void CraftDefinitionFuel::decrementInput(CraftInput &input, std::vector &output_replacements, + IGameDef *gamedef) const { - craftDecrementOrReplaceInput(input, replacements, gamedef); + craftDecrementOrReplaceInput(input, output_replacements, replacements, gamedef); } CraftHashType CraftDefinitionFuel::getHashType() const @@ -871,17 +876,17 @@ class CCraftDefManager: public IWritableCraftDefManager } virtual bool getCraftResult(CraftInput &input, CraftOutput &output, - bool decrementInput, IGameDef *gamedef) const + std::vector &output_replacement, bool decrementInput, + IGameDef *gamedef) const { output.item = ""; output.time = 0; // If all input items are empty, abort. bool all_empty = true; - for (std::vector::const_iterator - it = input.items.begin(); - it != input.items.end(); it++) { - if (!it->empty()) { + for (std::vector::size_type i = 0; + i < input.items.size(); i++) { + if (!input.items[i].empty()) { all_empty = false; break; } @@ -910,10 +915,9 @@ class CCraftDefManager: public IWritableCraftDefManager const std::vector &hash_collisions = col_iter->second; // Walk crafting definitions from back to front, so that later // definitions can override earlier ones. - for (std::vector::const_reverse_iterator - it = hash_collisions.rbegin(); - it != hash_collisions.rend(); it++) { - CraftDefinition *def = *it; + for (std::vector::size_type + i = hash_collisions.size(); i > 0; i--) { + CraftDefinition *def = hash_collisions[i - 1]; /*errorstream << "Checking " << input.dump() << std::endl << " against " << def->dump() << std::endl;*/ @@ -922,7 +926,7 @@ class CCraftDefManager: public IWritableCraftDefManager // Get output, then decrement input (if requested) output = def->getOutput(input, gamedef); if (decrementInput) - def->decrementInput(input, gamedef); + def->decrementInput(input, output_replacement, gamedef); /*errorstream << "Check RETURNS TRUE" << std::endl;*/ return true; } @@ -946,11 +950,12 @@ class CCraftDefManager: public IWritableCraftDefManager recipes.reserve(limit ? MYMIN(limit, vec.size()) : vec.size()); - for (std::vector::const_reverse_iterator - it = vec.rbegin(); it != vec.rend(); ++it) { + for (std::vector::size_type i = vec.size(); + i > 0; i--) { + CraftDefinition *def = vec[i - 1]; if (limit && recipes.size() >= limit) break; - recipes.push_back(*it); + recipes.push_back(def); } return recipes; @@ -959,13 +964,16 @@ class CCraftDefManager: public IWritableCraftDefManager { std::ostringstream os(std::ios::binary); os << "Crafting definitions:\n"; - for (int type = 0; type <= craft_hash_type_max; type++) { + for (int type = 0; type <= craft_hash_type_max; ++type) { for (std::map >::const_iterator it = (m_craft_defs[type]).begin(); - it != (m_craft_defs[type]).end(); it++) { - for (std::vector::const_iterator - iit = it->second.begin(); iit != it->second.end(); iit++) { - os << "type " << type << " hash " << it->first << (*iit)->dump() << "\n"; + it != (m_craft_defs[type]).end(); ++it) { + for (std::vector::size_type i = 0; + i < it->second.size(); i++) { + os << "type " << type + << " hash " << it->first + << " def " << it->second[i]->dump() + << "\n"; } } } @@ -984,12 +992,13 @@ class CCraftDefManager: public IWritableCraftDefManager } virtual void clear() { - for (int type = 0; type <= craft_hash_type_max; type++) { + for (int type = 0; type <= craft_hash_type_max; ++type) { for (std::map >::iterator it = m_craft_defs[type].begin(); - it != m_craft_defs[type].end(); it++) { + it != m_craft_defs[type].end(); ++it) { for (std::vector::iterator - iit = it->second.begin(); iit != it->second.end(); iit++) { + iit = it->second.begin(); + iit != it->second.end(); ++iit) { delete *iit; } it->second.clear(); @@ -1001,10 +1010,11 @@ class CCraftDefManager: public IWritableCraftDefManager virtual void initHashes(IGameDef *gamedef) { // Move the CraftDefs from the unhashed layer into layers higher up. - for (std::vector::iterator - it = (m_craft_defs[(int) CRAFT_HASH_TYPE_UNHASHED][0]).begin(); - it != (m_craft_defs[(int) CRAFT_HASH_TYPE_UNHASHED][0]).end(); it++) { - CraftDefinition *def = *it; + std::vector &unhashed = + m_craft_defs[(int) CRAFT_HASH_TYPE_UNHASHED][0]; + for (std::vector::size_type i = 0; + i < unhashed.size(); i++) { + CraftDefinition *def = unhashed[i]; // Initialize and get the definition's hash def->initHash(gamedef); @@ -1014,7 +1024,7 @@ class CCraftDefManager: public IWritableCraftDefManager // Enter the definition m_craft_defs[type][hash].push_back(def); } - m_craft_defs[(int) CRAFT_HASH_TYPE_UNHASHED][0].clear(); + unhashed.clear(); } private: //TODO: change both maps to unordered_map when c++11 can be used