+class NodeModMap
+{
+public:
+ /*
+ returns true if the mod was different last time
+ */
+ bool set(v3s16 p, const NodeMod &mod)
+ {
+ // See if old is different, cancel if it is not different.
+ core::map<v3s16, NodeMod>::Node *n = m_mods.find(p);
+ if(n)
+ {
+ NodeMod old = n->getValue();
+ if(old == mod)
+ return false;
+
+ n->setValue(mod);
+ }
+ else
+ {
+ m_mods.insert(p, mod);
+ }
+
+ return true;
+ }
+ // Returns true if there was one
+ bool get(v3s16 p, NodeMod *mod)
+ {
+ core::map<v3s16, NodeMod>::Node *n;
+ n = m_mods.find(p);
+ if(n == NULL)
+ return false;
+ if(mod)
+ *mod = n->getValue();
+ return true;
+ }
+ bool clear(v3s16 p)
+ {
+ if(m_mods.find(p))
+ {
+ m_mods.remove(p);
+ return true;
+ }
+ return false;
+ }
+ bool clear()
+ {
+ if(m_mods.size() == 0)
+ return false;
+ m_mods.clear();
+ return true;
+ }
+ void copy(NodeModMap &dest)
+ {
+ dest.m_mods.clear();
+
+ for(core::map<v3s16, NodeMod>::Iterator
+ i = m_mods.getIterator();
+ i.atEnd() == false; i++)
+ {
+ dest.m_mods.insert(i.getNode()->getKey(), i.getNode()->getValue());
+ }
+ }
+
+private:
+ core::map<v3s16, NodeMod> m_mods;
+};
+