Cleanup in content_mapblock (#5746)
[oweals/minetest.git] / src / metadata.cpp
index 8e04aa2d35a0b41638bce7d861dae1c5e17301eb..833735464a0c66557f98a9726ed6f2181c9732f5 100644 (file)
@@ -22,6 +22,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "gamedef.h"
 #include "log.h"
 #include <sstream>
+#include "constants.h" // MAP_BLOCKSIZE
+#include <sstream>
 
 /*
        Metadata
@@ -37,33 +39,70 @@ bool Metadata::empty() const
        return m_stringvars.size() == 0;
 }
 
-std::string Metadata::getString(const std::string &name,
-       u16 recursion) const
+size_t Metadata::size() const
+{
+       return m_stringvars.size();
+}
+
+bool Metadata::contains(const std::string &name) const
+{
+       return m_stringvars.find(name) != m_stringvars.end();
+}
+
+bool Metadata::operator==(const Metadata &other) const
+{
+       if (size() != other.size())
+               return false;
+
+       for (StringMap::const_iterator it = m_stringvars.begin();
+                       it != m_stringvars.end(); ++it) {
+               if (!other.contains(it->first) ||
+                               other.getString(it->first) != it->second)
+                       return false;
+       }
+
+       return true;
+}
+
+const std::string &Metadata::getString(const std::string &name, u16 recursion) const
 {
        StringMap::const_iterator it = m_stringvars.find(name);
-       if (it == m_stringvars.end())
-               return "";
+       if (it == m_stringvars.end()) {
+               static const std::string empty_string = std::string("");
+               return empty_string;
+       }
 
        return resolveString(it->second, recursion);
 }
 
-void Metadata::setString(const std::string &name, const std::string &var)
+/**
+ * Sets var to name key in the metadata storage
+ *
+ * @param name
+ * @param var
+ * @return true if key-value pair is created or changed
+ */
+bool Metadata::setString(const std::string &name, const std::string &var)
 {
        if (var.empty()) {
                m_stringvars.erase(name);
-       } else {
-               m_stringvars[name] = var;
+               return true;
+       }
+
+       StringMap::iterator it = m_stringvars.find(name);
+       if (it != m_stringvars.end() && it->second == var) {
+               return false;
        }
+
+       m_stringvars[name] = var;
+       return true;
 }
 
-std::string Metadata::resolveString(const std::string &str,
-       u16 recursion) const
+const std::string &Metadata::resolveString(const std::string &str, u16 recursion) const
 {
-       if (recursion > 1) {
-               return str;
-       }
-       if (str.substr(0, 2) == "${" && str[str.length() - 1] == '}') {
+       if (recursion <= 1 && str.substr(0, 2) == "${" && str[str.length() - 1] == '}') {
                return getString(str.substr(2, str.length() - 3), recursion + 1);
+       } else {
+               return str;
        }
-       return str;
 }