diff --git a/src/support/docstring.h b/src/support/docstring.h index 9f54f0eaaa..5b64a08d5c 100644 --- a/src/support/docstring.h +++ b/src/support/docstring.h @@ -25,4 +25,121 @@ typedef std::basic_string docstring; } + +#if defined(__GNUC__) && defined(__GNUC_MINOR__) && __GNUC__ == 3 && __GNUC_MINOR__ < 4 +// Missing char_traits methods in gcc 3.3 and older. Taken from gcc 4.2svn. +namespace std { + +template void +char_traits::assign(char_type & c1, char_type const & c2) +{ + c1 = c2; +} + + +template bool +char_traits::eq(char_type const & c1, char_type const & c2) +{ + return c1 == c2; +} + + +template bool +char_traits::lt(char_type const & c1, char_type const & c2) +{ + return c1 < c2; +} + + +template int +char_traits::compare(char_type const * s1, char_type const * s2, std::size_t n) +{ + for (std::size_t i = 0; i < n; ++i) + if (lt(s1[i], s2[i])) + return -1; + else if (lt(s2[i], s1[i])) + return 1; + return 0; +} + + +template std::size_t +char_traits::length(char_type const * p) +{ + std::size_t i = 0; + while (!eq(p[i], char_type())) + ++i; + return i; +} + + +template typename char_traits::char_type const * +char_traits::find(char_type const * s, size_t n, char_type const & a) +{ + for (std::size_t i = 0; i < n; ++i) + if (eq(s[i], a)) + return s + i; + return 0; +} + + +template typename char_traits::char_type * +char_traits::move(char_type * s1, char_type const * s2, std::size_t n) +{ + return static_cast(std::memmove(s1, s2, n * sizeof(char_type))); +} + + +template typename char_traits::char_type * +char_traits::copy(char_type * s1, char_type const * s2, std::size_t n) +{ + std::copy(s2, s2 + n, s1); + return s1; +} + + +template typename char_traits::char_type * +char_traits::assign(char_type * s, std::size_t n, char_type a) +{ + std::fill_n(s, n, a); + return s; +} + + +template typename char_traits::char_type +char_traits::to_char_type(int_type const & c) +{ + return static_cast(c); +} + + +template typename char_traits::int_type +char_traits::to_int_type(char_type const & c) +{ + return static_cast(c); +} + + +template bool +char_traits::eq_int_type(int_type const & c1, int_type const & c2) +{ + return c1 == c2; +} + + +template typename char_traits::int_type +char_traits::eof() +{ + return static_cast(EOF); +} + + +template typename char_traits::int_type +char_traits::not_eof(int_type const & c) +{ + return !eq_int_type(c, eof()) ? c : to_int_type(char_type()); +} + +} +#endif #endif