X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fsupport%2Fdocstream.h;h=460a9b7393011b7a0d23ff8f9780cc70dd908294;hb=5608f6fdb67b86b4cf3d9215d24d7734239ad05a;hp=0a2d42b38bb418b0b6a02d3a7a55c507ff962f64;hpb=e948caf63779f24f49b7b3e64932368710f1e582;p=lyx.git diff --git a/src/support/docstream.h b/src/support/docstream.h index 0a2d42b38b..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 @@ -41,18 +34,25 @@ typedef std::basic_istream idocstream; \endcode, not \code os << c; \endcode . The latter will not output the character, but the code point - as number. This is because we can't overload operator<< (our character - type is not a real type but a typedef). Narrow characters of type char - can be output as usual. + as number if USE_WCHAR_T is not defined. This is because we can't overload + operator<< (our character type is not always a real type but sometimes a + typedef). Narrow characters of type char can be output as usual. */ 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"); @@ -79,12 +82,21 @@ public: /// UCS4 input stringstream typedef std::basic_istringstream idocstringstream; -/// UCS4 output stringstream -typedef std::basic_ostringstream odocstringstream; +/// UCS4 output manipulator +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; };