Statistics
| Revision:

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

History | View | Annotate | Download (3.4 kB)

1
#ifndef BOOST_ARCHIVE_ITERATORS_MB_FROM_WCHAR_HPP
2
#define BOOST_ARCHIVE_ITERATORS_MB_FROM_WCHAR_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
// mb_from_wchar.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
#include <boost/assert.hpp>
20
#include <cstddef> // size_t
21
#include <cwchar> // for mbstate_t and wcrtomb()
22

    
23
#include <boost/config.hpp>
24
#if defined(BOOST_NO_STDC_NAMESPACE)
25
namespace std{ 
26
    using ::size_t; 
27
    using ::mbstate_t;
28
    using ::wcrtomb;
29
} // namespace std
30
#endif
31

    
32
#include <boost/iterator/iterator_adaptor.hpp>
33

    
34
namespace boost { 
35
namespace archive {
36
namespace iterators {
37

    
38
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
39
// class used by text archives to translate wide strings and to char
40
// strings of the currently selected locale
41
template<class Base>    // the input iterator
42
class mb_from_wchar
43
    : public boost::iterator_adaptor<
44
        mb_from_wchar<Base>, 
45
        Base, 
46
        wchar_t,
47
        single_pass_traversal_tag,
48
        char
49
    >
50
{
51
    friend class boost::iterator_core_access;
52

    
53
    typedef typename boost::iterator_adaptor<
54
        mb_from_wchar<Base>, 
55
        Base, 
56
        wchar_t,
57
        single_pass_traversal_tag,
58
        char
59
    > super_t;
60

    
61
    typedef mb_from_wchar<Base> this_t;
62

    
63
    char dereference_impl() {
64
        if(! m_full){
65
            fill();
66
            m_full = true;
67
        }
68
        return m_buffer[m_bnext];
69
    }
70
    char dereference() const {
71
        return (const_cast<this_t *>(this))->dereference_impl();
72
    }
73

    
74
    // test for iterator equality
75
    bool equal(const mb_from_wchar<Base> & rhs) const {
76
        // once the value is filled, the base_reference has been incremented
77
        // so don't permit comparison anymore.
78
        return 
79
            0 == m_bend
80
            && 0 == m_bnext
81
            && this->base_reference() == rhs.base_reference()
82
        ;
83
    }
84

    
85
    void fill(){
86
        std::mbstate_t mbs;
87
        std::wcrtomb(0, 0, &mbs);
88
        wchar_t value = * this->base_reference();
89
        m_bend = std::wcrtomb(m_buffer, value, &mbs);
90
        BOOST_ASSERT(-1 != m_bend);
91
        BOOST_ASSERT((std::size_t)m_bend <= sizeof(m_buffer));
92
        BOOST_ASSERT(m_bend > 0);
93
        m_bnext = 0;
94
    }
95

    
96
    void increment(){
97
        if(++m_bnext < m_bend)
98
            return;
99
        m_bend = 
100
        m_bnext = 0;
101
        ++(this->base_reference());
102
        m_full = false;
103
    }
104

    
105
    // buffer to handle pending characters
106
    int m_bend;
107
    int m_bnext;
108
    char m_buffer[9];
109
    bool m_full;
110

    
111
public:
112
    // make composible buy using templated constructor
113
    template<class T>
114
    mb_from_wchar(T start) :
115
        super_t(Base(static_cast< T >(start))),
116
        m_bend(0),
117
        m_bnext(0),
118
        m_full(false)
119
    {}
120
    // intel 7.1 doesn't like default copy constructor
121
    mb_from_wchar(const mb_from_wchar & rhs) : 
122
        super_t(rhs.base_reference()),
123
        m_bend(rhs.m_bend),
124
        m_bnext(rhs.m_bnext),
125
        m_full(rhs.m_full)
126
    {}
127
};
128

    
129
} // namespace iterators
130
} // namespace archive
131
} // namespace boost
132

    
133
#endif // BOOST_ARCHIVE_ITERATORS_MB_FROM_WCHAR_HPP