diff options
Diffstat (limited to 'libxsd/libxsd/cxx/xml/char-lcp.txx')
-rw-r--r-- | libxsd/libxsd/cxx/xml/char-lcp.txx | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/libxsd/libxsd/cxx/xml/char-lcp.txx b/libxsd/libxsd/cxx/xml/char-lcp.txx new file mode 100644 index 0000000..46ce034 --- /dev/null +++ b/libxsd/libxsd/cxx/xml/char-lcp.txx @@ -0,0 +1,73 @@ +// file : libxsd/cxx/xml/char-lcp.txx +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#include <cstring> // std::memcpy + +#include <xercesc/util/XMLString.hpp> + +#include <libxsd/cxx/config.hxx> // XSD_CXX11 + +#ifdef XSD_CXX11 +# include <memory> // std::unique_ptr +#else +# include <libxsd/cxx/auto-array.hxx> +#endif + +#include <libxsd/cxx/xml/std-memory-manager.hxx> + +namespace xsd +{ + namespace cxx + { + namespace xml + { + template <typename C> + std::basic_string<C> char_lcp_transcoder<C>:: + to (const XMLCh* s) + { + std_memory_manager mm; +#ifdef XSD_CXX11 + std::unique_ptr<C[], std_memory_manager&> r ( +#else + auto_array<C, std_memory_manager> r ( +#endif + xercesc::XMLString::transcode (s, &mm), mm); + return std::basic_string<C> (r.get ()); + } + + template <typename C> + std::basic_string<C> char_lcp_transcoder<C>:: + to (const XMLCh* s, std::size_t len) + { +#ifdef XSD_CXX11 + std::unique_ptr<XMLCh[]> tmp ( +#else + auto_array<XMLCh> tmp ( +#endif + new XMLCh[len + 1]); + std::memcpy (tmp.get (), s, len * sizeof (XMLCh)); + tmp[len] = XMLCh (0); + + std_memory_manager mm; +#ifdef XSD_CXX11 + std::unique_ptr<C[], std_memory_manager&> r ( +#else + auto_array<C, std_memory_manager> r ( +#endif + xercesc::XMLString::transcode (tmp.get (), &mm), mm); + + tmp.reset (); + + return std::basic_string<C> (r.get ()); + } + + template <typename C> + XMLCh* char_lcp_transcoder<C>:: + from (const C* s) + { + std_memory_manager mm; + return xercesc::XMLString::transcode (s, &mm); + } + } + } +} |