diff --git a/src/pugixml.cpp b/src/pugixml.cpp index feece493ffbe58121b88e1c634f730d03ad90244..0706ef466d9bfd9b8ea2ecbbe15d67b19853d2e6 100644 --- a/src/pugixml.cpp +++ b/src/pugixml.cpp @@ -4516,6 +4516,22 @@ namespace std } #endif +#if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC) +namespace std +{ + // Workarounds for (non-standard) iterator category detection + std::bidirectional_iterator_tag __iterator_category(const pugi::xml_node_iterator&) + { + return std::bidirectional_iterator_tag(); + } + + std::bidirectional_iterator_tag __iterator_category(const pugi::xml_attribute_iterator&) + { + return std::bidirectional_iterator_tag(); + } +} +#endif + /** * Copyright (c) 2006-2010 Arseny Kapoulkine * diff --git a/src/pugixml.hpp b/src/pugixml.hpp index 9b0edddf8c1a80e4b50f714c3d82bfa8d394e169..f57dba2eb046a17a1b4c7ff96ae8451accbbb8b5 100644 --- a/src/pugixml.hpp +++ b/src/pugixml.hpp @@ -21,12 +21,21 @@ namespace std { struct bidirectional_iterator_tag; +#ifdef __SUNPRO_CC + // Sun C++ compiler has a bug which forces template argument names in forward declarations to be the same as in actual definitions + template <class _T> class allocator; + template <class _charT> struct char_traits; + template <class _charT, class _Traits> class basic_istream; + template <class _charT, class _Traits> class basic_ostream; + template <class _charT, class _Traits, class _Allocator> class basic_string; +#else // Borland C++ compiler has a bug which forces template argument names in forward declarations to be the same as in actual definitions template <class _Ty> class allocator; template <class _Ty> struct char_traits; template <class _Elem, class _Traits> class basic_istream; template <class _Elem, class _Traits> class basic_ostream; template <class _Elem, class _Traits, class _Ax> class basic_string; +#endif // Digital Mars compiler has a bug which requires a forward declaration for explicit instantiation (otherwise type selection is messed up later, producing link errors) // Also note that we have to declare char_traits as a class here, since it's defined that way @@ -2330,6 +2339,15 @@ namespace std } #endif +#if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC) +namespace std +{ + // Workarounds for (non-standard) iterator category detection + std::bidirectional_iterator_tag __iterator_category(const pugi::xml_node_iterator&); + std::bidirectional_iterator_tag __iterator_category(const pugi::xml_attribute_iterator&); +} +#endif + #endif /** diff --git a/src/pugixpath.cpp b/src/pugixpath.cpp index d11a7ca77943e3942f24f15aba0e9e88f6c99e84..d409655f3d886782538f53b4ac2576280a0899c2 100644 --- a/src/pugixpath.cpp +++ b/src/pugixpath.cpp @@ -768,7 +768,7 @@ namespace pugi { if (begin == end) return; - size_t count = std::distance(begin, end); + size_t count = end - begin; size_t size = m_end - m_begin; size_t capacity = m_eos - m_begin;