#else
-#include <boost/cstdint.hpp>
-namespace lyx { typedef boost::uint32_t char_type; }
+#include <cstdint>
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1600)
+namespace lyx { typedef uint32_t char_type; }
+#include "support/numpunct_lyx_char_type.h" // implementation for our char_type needed
+#else
+namespace lyx { typedef std::uint32_t char_type; }
+#endif
#endif
+// Forward definitions do not work with libc++
+// For gcc5 with the new std::string ABI forward declarations would work in
+// principle, but I am not sure whether we want non-standard
+// "namespace __cxx11" in our sources.
+#if defined(USE_LLVM_LIBCPP) || defined(USE_GLIBCXX_CXX11_ABI)
+#include <string>
+#else
namespace std {
typedef basic_ostream<char, char_traits<char> > ostream;
typedef basic_ostringstream<char, char_traits<char>, allocator<char> > ostringstream;
-} // namepace std
+} // namespace std
+
+#endif
+
+
+
namespace lyx {
-/// String type for storing the main text in UCS4 encoding
+/**
+ * String type for storing the main text in UCS4 encoding.
+ * Use std::string only in cases 7-bit ASCII is to be manipulated
+ * within the variable.
+ */
typedef std::basic_string<char_type, std::char_traits<char_type>,
std::allocator<char_type> > docstring;
// defined in docstring.cpp
bool operator==(docstring const &, char const *);
+#ifdef STD_STRING_USES_COW
+template<typename Char> class trivial_string;
+typedef trivial_string<char> trivstring;
+typedef trivial_string<char_type> trivdocstring;
+#else
+typedef std::string trivstring;
+typedef docstring trivdocstring;
+#endif
+
} // namespace lyx
#endif