Statistics
| Revision:

root / tmp / org.txm.statsengine.r.core.win32 / res / win32 / library / BH / include / boost / archive / iterators / istream_iterator.hpp @ 2486

History | View | Annotate | Download (2.8 kB)

1
#ifndef BOOST_ARCHIVE_ITERATORS_ISTREAM_ITERATOR_HPP
2
#define BOOST_ARCHIVE_ITERATORS_ISTREAM_ITERATOR_HPP
3

    
4
// MS compatible compilers support #pragma once
5
#if defined(_MSC_VER)
6
# pragma once
7
#endif
8

    
9
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
10
// istream_iterator.hpp
11

    
12
// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
13
// Use, modification and distribution is subject to the Boost Software
14
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
15
// http://www.boost.org/LICENSE_1_0.txt)
16

    
17
//  See http://www.boost.org for updates, documentation, and revision history.
18

    
19
// note: this is a custom version of the standard istream_iterator.
20
// This is necessary as the standard version doesn't work as expected
21
// for wchar_t based streams on systems for which wchar_t not a true
22
// type but rather a synonym for some integer type.
23

    
24
#include <cstddef> // NULL
25
#include <istream>
26
#include <boost/iterator/iterator_facade.hpp>
27

    
28
namespace boost { 
29
namespace archive {
30
namespace iterators {
31

    
32
// given a type, make an input iterator based on a pointer to that type
33
template<class Elem = char>
34
class istream_iterator :  
35
    public boost::iterator_facade<
36
        istream_iterator<Elem>,
37
        Elem,
38
        std::input_iterator_tag,
39
        Elem
40
    >
41
{
42
    friend class boost::iterator_core_access;
43
    typedef istream_iterator this_t ;
44
    typedef typename boost::iterator_facade<
45
        istream_iterator<Elem>,
46
        Elem,
47
        std::input_iterator_tag,
48
        Elem
49
    > super_t;
50
    typedef typename std::basic_istream<Elem> istream_type;
51
 
52
    bool equal(const this_t & rhs) const {
53
        // note: only  works for comparison against end of stream
54
        return m_istream == rhs.m_istream;
55
    }
56

    
57
/*
58
    //Access the value referred to 
59
    Elem dereference() const {
60
        return m_current_value;
61
    }
62

63
    void increment(){
64
        if(NULL != m_istream){
65
            m_current_value = static_cast<Elem>(m_istream->get());
66
            if(! m_istream->good()){
67
                const_cast<this_t *>(this)->m_istream = NULL;
68
            }
69
        }
70
    }
71
*/
72
    //Access the value referred to 
73
    Elem dereference() const {
74
        return m_istream->peek();
75
    }
76

    
77
    void increment(){
78
        if(NULL != m_istream){
79
            m_istream->ignore(1);
80
        }
81
    }
82

    
83
    istream_type *m_istream;
84
    Elem m_current_value;
85
public:
86
    istream_iterator(istream_type & is) :
87
        m_istream(& is)
88
    {
89
        //increment();
90
    }
91

    
92
    istream_iterator() :
93
        m_istream(NULL)
94
    {}
95

    
96
    istream_iterator(const istream_iterator<Elem> & rhs) :
97
        m_istream(rhs.m_istream),
98
        m_current_value(rhs.m_current_value)
99
    {}
100

    
101
};
102

    
103
} // namespace iterators
104
} // namespace archive
105
} // namespace boost
106

    
107
#endif // BOOST_ARCHIVE_ITERATORS_ISTREAM_ITERATOR_HPP