Skip to content

Instantly share code, notes, and snippets.

@seank-com
Last active January 3, 2016 04:19
Show Gist options
  • Save seank-com/8408146 to your computer and use it in GitHub Desktop.
Save seank-com/8408146 to your computer and use it in GitHub Desktop.
A friend of mine found himself working with IXMLDOMNodeList a bit and was writing out the same iteration code several times long length = 0; ChkHr(list->get_length(&length); for (int index = 0; index < length; index++) { ComPtr<IXMLDOMNode> element; ChkHr(list->get_item(index, &element)); ... } He started to miss range based for loops like this.…
class XmlDomNodeListIterator
{
public:
XmlDomNodeListIterator(_In_ IXMLDOMNodeList* list, long index)
: _list(list), _index(index)
{}
ComPtr<IXMLDOMNode> operator*() const
{
ComPtr<IXMLDOMNode> node;
ChkHr(_list->get_item(_index, node.GetAddressOf()));
return node;
}
XmlDomNodeListIterator& operator++()
{
_index++;
return *this;
}
bool operator!=(const XmlDomNodeListIterator& other) const
{
return (_list != other._list) || (_index != other._index);
}
private:
ComPtr<IXMLDOMNodeList> _list;
long _index;
};
XmlDomNodeListIterator begin(_In_ IXMLDOMNodeList* list)
{
return XmlDomNodeListIterator(list, 0);
}
XmlDomNodeListIterator end(_In_ IXMLDOMNodeList* list)
{
long length = 0;
ChkHr(list->get_length(&length));
return XmlDomNodeListIterator(list, length);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment