source: NonGTP/Boost/boost/iostreams/positioning.hpp @ 857

Revision 857, 3.1 KB checked in by igarcia, 18 years ago (diff)
Line 
1// (C) Copyright Jonathan Turkanis 2003.
2// Distributed under the Boost Software License, Version 1.0. (See accompanying
3// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
4
5// See http://www.boost.org/libs/iostreams for documentation.
6
7// Thanks to Gareth Sylvester-Bradley for the Dinkumware versions of the
8// positioning functions.
9
10#ifndef BOOST_IOSTREAMS_POSITIONING_HPP_INCLUDED
11#define BOOST_IOSTREAMS_POSITIONING_HPP_INCLUDED
12
13#if defined(_MSC_VER) && (_MSC_VER >= 1020)
14# pragma once
15#endif
16
17#include <boost/cstdint.hpp>
18#include <boost/integer_traits.hpp>
19#include <boost/iostreams/detail/config/codecvt.hpp> // mbstate_t.
20#include <boost/iostreams/detail/ios.hpp> // streamoff, streampos.
21
22// Must come last.
23#include <boost/iostreams/detail/config/disable_warnings.hpp>
24
25namespace boost { namespace iostreams {
26
27typedef boost::intmax_t stream_offset;
28
29inline std::streamoff stream_offset_to_streamoff(stream_offset off)
30{ return static_cast<stream_offset>(off); }
31
32template<typename PosType> // Hande custom pos_type's.
33inline stream_offset position_to_offset(PosType pos)
34{ return std::streamoff(pos); }
35
36#if ((defined(_YVALS) && !defined(__IBMCPP__)) || defined(_CPPLIB_VER)) && \
37     !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) \
38     && !defined(__QNX__) \
39   /**/
40
41        /* Dinkumware */
42
43inline std::streampos offset_to_position(stream_offset off)
44{
45    // Use implementation-specific constructor.
46    return std::streampos(std::mbstate_t(), off);
47}
48
49inline stream_offset fpos_t_to_offset(fpos_t pos)
50{ // Helper function.
51#if defined(_POSIX_) || (_INTEGRAL_MAX_BITS >= 64)
52    return pos;
53#else
54    return _FPOSOFF(pos);
55#endif
56}
57
58# if defined(_CPPLIB_VER) //--------------------------------------------------//
59
60        /* Recent Dinkumware */
61
62inline stream_offset position_to_offset(std::streampos pos)
63{
64    // Use implementation-specific member function seekpos().
65    return fpos_t_to_offset(pos.seekpos()) +
66           stream_offset(std::streamoff(pos)) -
67           stream_offset(std::streamoff(pos.seekpos()));
68}
69
70# else // # if defined(_CPPLIB_VER) //----------------------------------------//
71
72        /* Old Dinkumware */
73
74inline stream_offset position_to_offset(std::streampos pos)
75{
76    // use implementation-specific member function get_fpos_t().
77    return fpos_t_to_offset(pos.get_fpos_t()) +
78           stream_offset(std::streamoff(pos)) -
79           stream_offset(std::streamoff(pos.get_fpos_t()));
80}
81
82# endif // # if defined(_CPPLIB_VER) //---------------------------------------//
83#else // Dinkumware //--------------------------------------------------------//
84
85        /* Non-Dinkumware */
86
87inline std::streampos offset_to_position(stream_offset off) { return off; }
88
89inline stream_offset position_to_offset(std::streampos pos) { return pos; }
90
91#endif // Dinkumware //-------------------------------------------------------//
92
93} } // End namespaces iostreams, boost.
94
95#include <boost/iostreams/detail/config/enable_warnings.hpp>
96
97#endif // #ifndef BOOST_IOSTREAMS_POSITIONING_HPP_INCLUDED
Note: See TracBrowser for help on using the repository browser.