1 // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com) 2 // (C) Copyright 2003-2007 Jonathan Turkanis 3 // Distributed under the Boost Software License, Version 1.0. (See accompanying 4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.) 5 6 // Provides std::char_traits for libraries without templated streams. Should not 7 // be confused with <boost/iostreams/char_traits.hpp>, which defines the 8 // template boost::iostreams::char_traits. 9 10 // See http://www.boost.org/libs/iostreams for documentation. 11 12 #ifndef BOOST_IOSTREAMS_DETAIL_CHAR_TRAITS_HPP_INCLUDED 13 #define BOOST_IOSTREAMS_DETAIL_CHAR_TRAITS_HPP_INCLUDED 14 15 #if defined(_MSC_VER) 16 # pragma once 17 #endif 18 19 #include <iosfwd> 20 #include <boost/iostreams/detail/config/wide_streams.hpp> 21 #ifdef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES 22 # include <boost/config.hpp> // Make sure size_t is in std. 23 # include <cstddef> 24 # include <cstring> 25 # include <cstdio> 26 #endif 27 28 #ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //--------------------------------// 29 # define BOOST_IOSTREAMS_CHAR_TRAITS(ch) std::char_traits< ch > 30 #else 31 # define BOOST_IOSTREAMS_CHAR_TRAITS(ch) boost::iostreams::detail::char_traits 32 33 namespace boost { namespace iostreams { namespace detail { 34 35 struct char_traits { 36 typedef char char_type; 37 typedef int int_type; 38 typedef std::streampos pos_type; 39 typedef std::streamoff off_type; 40 41 // Note: this may not be not conforming, since it treats chars as unsigned, 42 // but is only used to test for equality. compareboost::iostreams::detail::char_traits43 static int compare(const char* lhs, const char* rhs, std::size_t n) 44 { return std::strncmp(lhs, rhs, n); } copyboost::iostreams::detail::char_traits45 static char* copy(char *dest, const char *src, std::size_t n) 46 { return static_cast<char*>(std::memcpy(dest, src, n)); } moveboost::iostreams::detail::char_traits47 static char* move(char *dest, const char *src, std::size_t n) 48 { return static_cast<char*>(std::memmove(dest, src, n)); } findboost::iostreams::detail::char_traits49 static const char* find(const char* s, std::size_t n, const char& c) 50 { return (const char*) (const void*) std::memchr(s, c, n); } to_char_typeboost::iostreams::detail::char_traits51 static char to_char_type(const int& c) { return c; } to_int_typeboost::iostreams::detail::char_traits52 static int to_int_type(const char& c) { return c; } eq_int_typeboost::iostreams::detail::char_traits53 static bool eq_int_type(const int& lhs, const int& rhs) 54 { return lhs == rhs; } eofboost::iostreams::detail::char_traits55 static int eof() { return EOF; } not_eofboost::iostreams::detail::char_traits56 static int not_eof(const int& c) { return c != EOF ? c : '\n'; } 57 }; 58 59 } } } // End namespaces detail, iostreams, boost. 60 61 #endif // #ifdef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //-----------------------// 62 63 #endif // #ifndef BOOST_IOSTREAMS_DETAIL_CHAR_TRAITS_HPP_INCLUDED 64