From 6f9ea6d752a0172a9cd475699830edfbb5a1a124 Mon Sep 17 00:00:00 2001
From: Tinny Ng <tng@apache.org>
Date: Thu, 18 Jul 2002 14:49:20 +0000
Subject: [PATCH] DOM: add removeNamedItemAt to DOMAttrMapImpl

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@174025 13f79535-47bb-0310-9956-ffa450edef68
---
 src/xercesc/dom/impl/DOMAttrMapImpl.cpp | 29 +++++++++++++++++++++++++
 src/xercesc/dom/impl/DOMAttrMapImpl.hpp |  1 +
 2 files changed, 30 insertions(+)

diff --git a/src/xercesc/dom/impl/DOMAttrMapImpl.cpp b/src/xercesc/dom/impl/DOMAttrMapImpl.cpp
index 3ded9df81..872a36481 100644
--- a/src/xercesc/dom/impl/DOMAttrMapImpl.cpp
+++ b/src/xercesc/dom/impl/DOMAttrMapImpl.cpp
@@ -141,6 +141,35 @@ DOMNode *DOMAttrMapImpl::removeNamedItemNS(const XMLCh *namespaceURI, const XMLC
     return removed;
 }
 
+// remove the name using index
+// avoid calling findNamePoint again if the index is already known
+DOMNode * DOMAttrMapImpl::removeNamedItemAt(XMLSize_t index)
+{
+    DOMNode* removed = DOMNamedNodeMapImpl::removeNamedItemAt(index);
+
+    // Replace it if it had a default value
+    // (DOM spec level 1 - Element Interface)
+    if (hasDefaults() && (removed != 0))
+    {
+        DOMAttrMapImpl* defAttrs = ((DOMElementImpl*)fOwnerNode)->getDefaultAttributes();
+
+        const XMLCh* localName = removed->getLocalName();
+        DOMAttr* attr = 0;
+        if (localName)
+            attr = (DOMAttr*)(defAttrs->getNamedItemNS(removed->getNamespaceURI(), localName));
+        else
+            attr = (DOMAttr*)(defAttrs->getNamedItem(((DOMAttr*)removed)->getName()));
+
+        if (attr != 0)
+        {
+            DOMAttr* newAttr = (DOMAttr*)attr->cloneNode(true);
+            setNamedItem(newAttr);
+        }
+    }
+
+    return removed;
+}
+
 /**
  * Get this AttributeMap in sync with the given "defaults" map.
  * @param defaults The default attributes map to sync with.
diff --git a/src/xercesc/dom/impl/DOMAttrMapImpl.hpp b/src/xercesc/dom/impl/DOMAttrMapImpl.hpp
index 98a2eebbb..3afeae9de 100644
--- a/src/xercesc/dom/impl/DOMAttrMapImpl.hpp
+++ b/src/xercesc/dom/impl/DOMAttrMapImpl.hpp
@@ -98,6 +98,7 @@ public:
 
     virtual DOMNode *removeNamedItem(const XMLCh *name);
     virtual DOMNode *removeNamedItemNS(const XMLCh *namespaceURI, const XMLCh *localName);
+    virtual DOMNode *removeNamedItemAt(XMLSize_t index);
 
     void reconcileDefaultAttributes(const DOMAttrMapImpl* defaults);
     void moveSpecifiedAttributes(DOMAttrMapImpl* srcmap);
-- 
GitLab