X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Fdocstream.h;h=460a9b7393011b7a0d23ff8f9780cc70dd908294;hb=5608f6fdb67b86b4cf3d9215d24d7734239ad05a;hp=a544082f27208d0a79c7d8b89f47775e507ea380;hpb=9c55af4a223ce4db29d643251109e245665344bd;p=lyx.git diff --git a/src/support/docstream.h b/src/support/docstream.h index a544082f27..460a9b7393 100644 --- a/src/support/docstream.h +++ b/src/support/docstream.h @@ -14,13 +14,6 @@ #include "support/docstring.h" -#if defined(_MSC_VER) && (_MSC_VER >= 1600) -// Ugly workaround for MSVC10 STL bug: -// std::numpunct has a hardcoded dllimport in definition, but we wanna it with 32 bit -// so we can't import it and must define it but then the compiler complains. -#include "support/numpunct_lyx_char_type.h" -#endif - #include #include @@ -47,12 +40,19 @@ typedef std::basic_istream idocstream; */ typedef std::basic_ostream odocstream; +struct SetEnc; + /// File stream for reading UTF8-encoded files with automatic conversion to /// UCS4. +/// Buffering must be switched off if the encoding is changed after +/// construction by calling rdbuf()->pubsetbuf(0, 0). class ifdocstream : public std::basic_ifstream { typedef std::basic_ifstream base; public: ifdocstream(); + /// Create a stream with a specific encoding \p enc. + /// We must not pass \p enc as string, to avoid confusing it with a file name. + explicit ifdocstream(SetEnc const & enc); explicit ifdocstream(const char* s, std::ios_base::openmode mode = std::ios_base::in, std::string const & encoding = "UTF-8"); @@ -66,6 +66,9 @@ class ofdocstream : public std::basic_ofstream { typedef std::basic_ofstream base; public: ofdocstream(); + /// Create a stream with a specific encoding \p enc. + /// We must not pass \p enc as string, to avoid confusing it with a file name. + explicit ofdocstream(SetEnc const & enc); explicit ofdocstream(const char* s, std::ios_base::openmode mode = std::ios_base::out|std::ios_base::trunc, std::string const & encoding = "UTF-8"); @@ -85,7 +88,15 @@ typedef odocstream & (*odocstream_manip)(odocstream &); /// Helper struct for changing stream encoding struct SetEnc { - SetEnc(std::string const & e) : encoding(e) {} + /** + * It is important that this constructor is explicit. + * Otherwise the attempt to output a std::string to an odocstream + * would compile, but cause a (probably failing) encoding change + * instead of string output (we do not define + * operator<<(odocstream &, std::string) since we want to avoid + * outputting strings with unspecified encoding) + */ + explicit SetEnc(std::string const & e) : encoding(e) {} std::string encoding; };