Test crafting hash type only once for a recipe
authorHybridDog <ovvv@web.de>
Wed, 3 Apr 2019 11:59:42 +0000 (13:59 +0200)
committerSmallJoker <mk939@ymail.com>
Mon, 20 May 2019 18:59:36 +0000 (20:59 +0200)
src/craftdef.cpp
src/craftdef.h

index 04e418e29436d6bf734d255a7b8974f05f63c718..64e2f742b37b2f7612e83f01f296c7081aeade74 100644 (file)
@@ -407,22 +407,6 @@ void CraftDefinitionShaped::decrementInput(CraftInput &input, std::vector<ItemSt
        craftDecrementOrReplaceInput(input, output_replacements, replacements, gamedef);
 }
 
-CraftHashType CraftDefinitionShaped::getHashType() const
-{
-       assert(hash_inited); // Pre-condition
-       bool has_group = false;
-       for (const auto &recipe_name : recipe_names) {
-               if (isGroupRecipeStr(recipe_name)) {
-                       has_group = true;
-                       break;
-               }
-       }
-       if (has_group)
-               return CRAFT_HASH_TYPE_COUNT;
-
-       return CRAFT_HASH_TYPE_ITEM_NAMES;
-}
-
 u64 CraftDefinitionShaped::getHash(CraftHashType type) const
 {
        assert(hash_inited); // Pre-condition
@@ -440,6 +424,15 @@ void CraftDefinitionShaped::initHash(IGameDef *gamedef)
                return;
        hash_inited = true;
        recipe_names = craftGetItemNames(recipe, gamedef);
+
+       bool has_group = false;
+       for (const auto &recipe_name : recipe_names) {
+               if (isGroupRecipeStr(recipe_name)) {
+                       has_group = true;
+                       break;
+               }
+       }
+       hash_type = has_group ? CRAFT_HASH_TYPE_COUNT : CRAFT_HASH_TYPE_ITEM_NAMES;
 }
 
 std::string CraftDefinitionShaped::dump() const
@@ -527,22 +520,6 @@ void CraftDefinitionShapeless::decrementInput(CraftInput &input, std::vector<Ite
        craftDecrementOrReplaceInput(input, output_replacements, replacements, gamedef);
 }
 
-CraftHashType CraftDefinitionShapeless::getHashType() const
-{
-       assert(hash_inited); // Pre-condition
-       bool has_group = false;
-       for (const auto &recipe_name : recipe_names) {
-               if (isGroupRecipeStr(recipe_name)) {
-                       has_group = true;
-                       break;
-               }
-       }
-       if (has_group)
-               return CRAFT_HASH_TYPE_COUNT;
-
-       return CRAFT_HASH_TYPE_ITEM_NAMES;
-}
-
 u64 CraftDefinitionShapeless::getHash(CraftHashType type) const
 {
        assert(hash_inited); // Pre-condition
@@ -558,6 +535,15 @@ void CraftDefinitionShapeless::initHash(IGameDef *gamedef)
        hash_inited = true;
        recipe_names = craftGetItemNames(recipe, gamedef);
        std::sort(recipe_names.begin(), recipe_names.end());
+
+       bool has_group = false;
+       for (const auto &recipe_name : recipe_names) {
+               if (isGroupRecipeStr(recipe_name)) {
+                       has_group = true;
+                       break;
+               }
+       }
+       hash_type = has_group ? CRAFT_HASH_TYPE_COUNT : CRAFT_HASH_TYPE_ITEM_NAMES;
 }
 
 std::string CraftDefinitionShapeless::dump() const
@@ -715,14 +701,6 @@ void CraftDefinitionCooking::decrementInput(CraftInput &input, std::vector<ItemS
        craftDecrementOrReplaceInput(input, output_replacements, replacements, gamedef);
 }
 
-CraftHashType CraftDefinitionCooking::getHashType() const
-{
-       if (isGroupRecipeStr(recipe_name))
-               return CRAFT_HASH_TYPE_COUNT;
-
-       return CRAFT_HASH_TYPE_ITEM_NAMES;
-}
-
 u64 CraftDefinitionCooking::getHash(CraftHashType type) const
 {
        if (type == CRAFT_HASH_TYPE_ITEM_NAMES) {
@@ -744,6 +722,11 @@ void CraftDefinitionCooking::initHash(IGameDef *gamedef)
                return;
        hash_inited = true;
        recipe_name = craftGetItemName(recipe, gamedef);
+
+       if (isGroupRecipeStr(recipe_name))
+               hash_type = CRAFT_HASH_TYPE_COUNT;
+       else
+               hash_type = CRAFT_HASH_TYPE_ITEM_NAMES;
 }
 
 std::string CraftDefinitionCooking::dump() const
@@ -808,14 +791,6 @@ void CraftDefinitionFuel::decrementInput(CraftInput &input, std::vector<ItemStac
        craftDecrementOrReplaceInput(input, output_replacements, replacements, gamedef);
 }
 
-CraftHashType CraftDefinitionFuel::getHashType() const
-{
-       if (isGroupRecipeStr(recipe_name))
-               return CRAFT_HASH_TYPE_COUNT;
-
-       return CRAFT_HASH_TYPE_ITEM_NAMES;
-}
-
 u64 CraftDefinitionFuel::getHash(CraftHashType type) const
 {
        if (type == CRAFT_HASH_TYPE_ITEM_NAMES) {
@@ -837,7 +812,13 @@ void CraftDefinitionFuel::initHash(IGameDef *gamedef)
                return;
        hash_inited = true;
        recipe_name = craftGetItemName(recipe, gamedef);
+
+       if (isGroupRecipeStr(recipe_name))
+               hash_type = CRAFT_HASH_TYPE_COUNT;
+       else
+               hash_type = CRAFT_HASH_TYPE_ITEM_NAMES;
 }
+
 std::string CraftDefinitionFuel::dump() const
 {
        std::ostringstream os(std::ios::binary);
index 46ee2164e6057f9bc7fffe527ea548ff92fc9156..140321f0f702495e7f1a328b3fbdb5b1040f3ba7 100644 (file)
@@ -149,13 +149,19 @@ public:
        virtual void decrementInput(CraftInput &input,
                std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const=0;
 
-       virtual CraftHashType getHashType() const = 0;
+       CraftHashType getHashType() const
+       {
+               return hash_type;
+       }
        virtual u64 getHash(CraftHashType type) const = 0;
 
        // to be called after all mods are loaded, so that we catch all aliases
        virtual void initHash(IGameDef *gamedef) = 0;
 
        virtual std::string dump() const=0;
+
+protected:
+       CraftHashType hash_type;
 };
 
 /*
@@ -186,7 +192,6 @@ public:
        virtual void decrementInput(CraftInput &input,
                std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const;
 
-       virtual CraftHashType getHashType() const;
        virtual u64 getHash(CraftHashType type) const;
 
        virtual void initHash(IGameDef *gamedef);
@@ -232,7 +237,6 @@ public:
        virtual void decrementInput(CraftInput &input,
                std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const;
 
-       virtual CraftHashType getHashType() const;
        virtual u64 getHash(CraftHashType type) const;
 
        virtual void initHash(IGameDef *gamedef);
@@ -274,10 +278,12 @@ public:
        virtual void decrementInput(CraftInput &input,
                std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const;
 
-       virtual CraftHashType getHashType() const { return CRAFT_HASH_TYPE_COUNT; }
        virtual u64 getHash(CraftHashType type) const { return 2; }
 
-       virtual void initHash(IGameDef *gamedef) {}
+       virtual void initHash(IGameDef *gamedef)
+       {
+               hash_type = CRAFT_HASH_TYPE_COUNT;
+       }
 
        virtual std::string dump() const;
 
@@ -314,7 +320,6 @@ public:
        virtual void decrementInput(CraftInput &input,
                std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const;
 
-       virtual CraftHashType getHashType() const;
        virtual u64 getHash(CraftHashType type) const;
 
        virtual void initHash(IGameDef *gamedef);
@@ -358,7 +363,6 @@ public:
        virtual void decrementInput(CraftInput &input,
                std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const;
 
-       virtual CraftHashType getHashType() const;
        virtual u64 getHash(CraftHashType type) const;
 
        virtual void initHash(IGameDef *gamedef);