1/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
2// codecvt_null.cpp
3
4// Copyright (c) 2004 Robert Ramey, Indiana University (garcia@osl.iu.edu)
5// Andrew Lumsdaine, Indiana University (lums@osl.iu.edu).
6// Use, modification and distribution is subject to the Boost Software
7// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8// http://www.boost.org/LICENSE_1_0.txt)
9
10#define BOOST_WARCHIVE_SOURCE
11#include <boost/serialization/config.hpp>
12#include <boost/archive/codecvt_null.hpp>
13
14// codecvt implementation for passing wchar_t objects to char output
15// without any translation whatever. Used to implement binary output
16// of wchar_t objects.
17
18namespace boost {
19namespace archive {
20
21BOOST_SYMBOL_EXPORT std::codecvt_base::result
22codecvt_null<wchar_t>::do_out(
23 std::mbstate_t & /*state*/,
24 const wchar_t * first1,
25 const wchar_t * last1,
26 const wchar_t * & next1,
27 char * first2,
28 char * last2,
29 char * & next2
30) const {
31 while(first1 != last1){
32 // Per std::22.2.1.5.2/2, we can store no more that
33 // last2-first2 characters. If we need to more encode
34 // next internal char type, return 'partial'.
35 if(static_cast<int>(sizeof(wchar_t)) > (last2 - first2)){
36 next1 = first1;
37 next2 = first2;
38 return std::codecvt_base::partial;
39 }
40 * reinterpret_cast<wchar_t *>(first2) = * first1++;
41 first2 += sizeof(wchar_t);
42
43 }
44 next1 = first1;
45 next2 = first2;
46 return std::codecvt_base::ok;
47}
48
49BOOST_SYMBOL_EXPORT std::codecvt_base::result
50codecvt_null<wchar_t>::do_in(
51 std::mbstate_t & /*state*/,
52 const char * first1,
53 const char * last1,
54 const char * & next1,
55 wchar_t * first2,
56 wchar_t * last2,
57 wchar_t * & next2
58) const {
59 // Process input characters until we've run of them,
60 // or the number of remaining characters is not
61 // enough to construct another output character,
62 // or we've run out of place for output characters.
63 while(first2 != last2){
64 // Have we converted all input characters?
65 // Return with 'ok', if so.
66 if (first1 == last1)
67 break;
68 // Do we have less input characters than needed
69 // for a single output character?
70 if(static_cast<int>(sizeof(wchar_t)) > (last1 - first1)){
71 next1 = first1;
72 next2 = first2;
73 return std::codecvt_base::partial;
74 }
75 *first2++ = * reinterpret_cast<const wchar_t *>(first1);
76 first1 += sizeof(wchar_t);
77 }
78 next1 = first1;
79 next2 = first2;
80 return std::codecvt_base::ok;
81}
82
83BOOST_SYMBOL_EXPORT codecvt_null<wchar_t>::codecvt_null(std::size_t no_locale_manage) :
84 std::codecvt<wchar_t, char, std::mbstate_t>(no_locale_manage)
85{}
86
87BOOST_SYMBOL_EXPORT codecvt_null<wchar_t>::~codecvt_null()
88{}
89
90} // namespace archive
91} // namespace boost
92

source code of boost/libs/serialization/src/codecvt_null.cpp