lyx_mirror/src/support/strfwd.h
Georg Baum 07afd76b7c Fix compilation with libc++
libc++ (http://libcxx.llvm.org/) is used on OS X with newer XCode.
The patch is from Benjamin Piwowarski <benjamin.piwowarski@lip6.fr>, I only
added more comments.
The changes regarding implicit conversion to bool of std::iostream work
because both the C++98 and C++11 standards guarantee that boolean evaluation
of streams returns !fail(). See e.g.
http://stackoverflow.com/questions/1334858/why-dont-iostream-objects-overload-operator-bool
for details.
2014-03-04 23:27:57 +01:00

97 lines
2.8 KiB
C++

// -*- C++ -*-
// Heavily inspired by /usr/include/c++/4.1/bits
//
// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.
#ifndef STRFWD_H
#define STRFWD_H
// This includes does nothing but defining _LIBCPP_VERSION
// if libc++ is used (rather than libstdc++) - we first
// check if we have at least a c++03 standard before
// including the file
#if (__cplusplus > 19971L)
#include <ciso646>
#endif
#ifdef USE_WCHAR_T
// Prefer this if possible because GNU libstdc++ has usable
// std::ctype<wchar_t> locale facets but not
// std::ctype<boost::uint32_t>. gcc older than 3.4 is also missing
// usable std::char_traits<boost::uint32_t>.
namespace lyx { typedef wchar_t char_type; }
#else
#include <boost/cstdint.hpp>
namespace lyx { typedef boost::uint32_t char_type; }
#endif
// Forward definitions do not work with libc++
#ifdef _LIBCPP_VERSION
#include <string>
#else
namespace std {
template<typename Alloc> class allocator;
template<typename Char> struct char_traits;
template<> struct char_traits<char>;
#ifdef USE_WCHAR_T
template<> struct char_traits<wchar_t>;
#endif
template<typename Char, typename Traits, typename Alloc> class basic_string;
typedef basic_string<char, char_traits<char>, allocator<char> > string;
template<class Char, class Traits> class basic_istream;
template<class Char, class Traits> class basic_ostream;
template<class Char, class Traits, class Allocator> class basic_ostringstream;
typedef basic_istream<char, char_traits<char> > istream;
typedef basic_ostream<char, char_traits<char> > ostream;
typedef basic_ostringstream<char, char_traits<char>, allocator<char> > ostringstream;
} // namepace std
#endif
namespace lyx {
/// String type for storing the main text in UCS4 encoding
typedef std::basic_string<char_type, std::char_traits<char_type>,
std::allocator<char_type> > docstring;
/// Base class for UCS4 input streams
typedef std::basic_istream<char_type, std::char_traits<char_type> > idocstream;
/// Base class for UCS4 output streams
typedef std::basic_ostream<char_type, std::char_traits<char_type> > odocstream;
/// UCS4 output stringstream
typedef std::basic_ostringstream<char_type, std::char_traits<char_type>, std::allocator<char_type> > odocstringstream;
#if ! defined(USE_WCHAR_T)
extern odocstream & operator<<(odocstream &, char);
#endif
// defined in lstrings.cpp
docstring const & empty_docstring();
std::string const & empty_string();
// defined in docstring.cpp
bool operator==(docstring const &, char const *);
} // namespace lyx
#endif