#pragma once #include "coding/internal/xmlparser.hpp" #include "base/assert.hpp" #include "std/algorithm.hpp" template uint64_t ParseXMLSequence(SequenceT & source, XMLDispatcherT & dispatcher, bool useCharData = false) { // Create the parser XmlParser parser(dispatcher, useCharData); if (!parser.Create()) return 0; uint32_t const BUFFER_SIZE = 16 * 1024; uint64_t res = 0; uint64_t readed; do { char * buffer = static_cast(parser.GetBuffer(BUFFER_SIZE)); ASSERT(buffer, ()); readed = source.Read(buffer, BUFFER_SIZE); if (readed == 0) return res; if (!parser.ParseBuffer(static_cast(readed), false)) { parser.PrintError(); return res; } res += readed; } while (readed == BUFFER_SIZE); return res; } namespace { template class SequenceAdapter { SourceT & m_source; public: SequenceAdapter(SourceT & source) : m_source(source) {} uint64_t Read(void * p, uint64_t size) { size_t const correctSize = static_cast(min(size, m_source.Size())); m_source.Read(p, correctSize); return correctSize; } }; } template bool ParseXML(SourceT & source, XMLDispatcherT & dispatcher, bool useCharData = false) { uint64_t const size = source.Size(); SequenceAdapter adapter(source); return (ParseXMLSequence(adapter, dispatcher, useCharData) == size); }