From 03e0dd33a847a83d975282c6caf6b926306e7b57 Mon Sep 17 00:00:00 2001 From: gregorycu Date: Tue, 27 Jan 2015 00:46:55 +1100 Subject: Optimize minetest.get_(all)_craft_recipe(s) Signed off by: ShadowNinja, kwolekr --- src/craftdef.cpp | 103 +++++++++++++++---------------------------------------- 1 file changed, 28 insertions(+), 75 deletions(-) (limited to 'src/craftdef.cpp') diff --git a/src/craftdef.cpp b/src/craftdef.cpp index 80937ccb7..bca16a4c6 100644 --- a/src/craftdef.cpp +++ b/src/craftdef.cpp @@ -27,6 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "gamedef.h" #include "inventory.h" #include "util/serialize.h" +#include "util/numeric.h" #include "strfnd.h" #include "exceptions.h" @@ -931,85 +932,30 @@ public: } return false; } - virtual bool getCraftRecipe(CraftInput &input, CraftOutput &output, - IGameDef *gamedef) const - { - CraftOutput tmpout; - tmpout.item = ""; - tmpout.time = 0; - - // If output item is empty, abort. - if(output.item.empty()) - return false; - - // Walk crafting definitions from back to front, so that later - // definitions can override earlier ones. - for(std::vector::const_reverse_iterator - i = m_craft_definitions.rbegin(); - i != m_craft_definitions.rend(); i++) - { - CraftDefinition *def = *i; - - /*infostream<<"Checking "<dump()<getOutput(input, gamedef); - if((tmpout.item.substr(0,output.item.length()) == output.item) && - ((tmpout.item[output.item.length()] == 0) || - (tmpout.item[output.item.length()] == ' '))) - { - // Get output, then decrement input (if requested) - input = def->getInput(output, gamedef); - return true; - } - } - catch(SerializationError &e) - { - errorstream<<"getCraftResult: ERROR: " - <<"Serialization error in recipe " - <dump()< getCraftRecipes(CraftOutput &output, - IGameDef *gamedef) const + IGameDef *gamedef, unsigned limit=0) const { - std::vector recipes_list; - CraftInput input; - CraftOutput tmpout; - tmpout.item = ""; - tmpout.time = 0; + std::vector recipes; - for(std::vector::const_reverse_iterator - i = m_craft_definitions.rbegin(); - i != m_craft_definitions.rend(); i++) - { - CraftDefinition *def = *i; + std::map >::const_iterator + vec_iter = m_output_craft_definitions.find(output.item); - /*infostream<<"Checking "<dump()<getOutput(input, gamedef); - if(tmpout.item.substr(0,output.item.length()) == output.item) - { - // Get output, then decrement input (if requested) - input = def->getInput(output, gamedef); - recipes_list.push_back(*i); - } - } - catch(SerializationError &e) - { - errorstream<<"getCraftResult: ERROR: " - <<"Serialization error in recipe " - <dump()< &vec = vec_iter->second; + + recipes.reserve(limit ? MYMIN(limit, vec.size()) : vec.size()); + + for (std::vector::const_reverse_iterator + it = vec.rbegin(); it != vec.rend(); ++it) { + if (limit && recipes.size() >= limit) + break; + recipes.push_back(*it); } - return recipes_list; + + return recipes; } virtual std::string dump() const { @@ -1023,11 +969,16 @@ public: } return os.str(); } - virtual void registerCraft(CraftDefinition *def) + virtual void registerCraft(CraftDefinition *def, IGameDef *gamedef) { verbosestream<<"registerCraft: registering craft definition: " <dump()<getOutput(input, gamedef).item, gamedef); + m_output_craft_definitions[output_name].push_back(def); } virtual void clear() { @@ -1037,6 +988,7 @@ public: delete *i; } m_craft_definitions.clear(); + m_output_craft_definitions.clear(); } virtual void serialize(std::ostream &os) const { @@ -1053,7 +1005,7 @@ public: os< m_craft_definitions; + std::map > m_output_craft_definitions; }; IWritableCraftDefManager* createCraftDefManager() -- cgit v1.2.3