1 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
2 // test_iterators.cpp
3 
4 // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
5 // Use, modification and distribution is subject to the Boost Software
6 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
8 
9 #include <algorithm>
10 #include <list>
11 
12 #if (defined _MSC_VER) && (_MSC_VER == 1200)
13 #  pragma warning (disable : 4786) // too long name, harmless warning
14 #endif
15 
16 #include <cstdlib>
17 #include <cstddef> // size_t
18 
19 #include <boost/config.hpp>
20 #ifdef BOOST_NO_STDC_NAMESPACE
21 namespace std{
22     using ::rand;
23     using ::size_t;
24 }
25 #endif
26 
27 #include <boost/serialization/pfto.hpp>
28 
29 #include <boost/archive/iterators/binary_from_base64.hpp>
30 #include <boost/archive/iterators/base64_from_binary.hpp>
31 #include <boost/archive/iterators/insert_linebreaks.hpp>
32 #include <boost/archive/iterators/remove_whitespace.hpp>
33 #include <boost/archive/iterators/transform_width.hpp>
34 
35 #include "../test/test_tools.hpp"
36 
37 #include <iostream>
38 
39 template<typename CharType>
test_base64()40 void test_base64(){
41     CharType rawdata[150];
42     std::size_t size = sizeof(rawdata) / sizeof(CharType);
43     CharType * rptr;
44     for(rptr = rawdata + size; rptr-- > rawdata;)
45         *rptr = std::rand();
46 
47     // convert to base64
48     typedef std::list<CharType> text_base64_type;
49     text_base64_type text_base64;
50 
51     typedef
52         boost::archive::iterators::insert_linebreaks<
53             boost::archive::iterators::base64_from_binary<
54                 boost::archive::iterators::transform_width<
55                     CharType *
56                     ,6
57                     ,sizeof(CharType) * 8
58                 >
59             >
60             ,72
61         >
62         translate_out;
63 
64     std::copy(
65         translate_out(BOOST_MAKE_PFTO_WRAPPER(static_cast<CharType *>(rawdata))),
66         translate_out(BOOST_MAKE_PFTO_WRAPPER(rawdata + size)),
67         std::back_inserter(text_base64)
68     );
69 
70     // convert from base64 to binary and compare with the original
71     typedef
72         boost::archive::iterators::transform_width<
73             boost::archive::iterators::binary_from_base64<
74                 boost::archive::iterators::remove_whitespace<
75                     BOOST_DEDUCED_TYPENAME text_base64_type::iterator
76                 >
77             >,
78             sizeof(CharType) * 8,
79             6
80         > translate_in;
81 
82     BOOST_CHECK(
83         std::equal(
84             rawdata,
85             rawdata + size,
86             translate_in(BOOST_MAKE_PFTO_WRAPPER(text_base64.begin()))
87         )
88     );
89 
90 }
91 
92 int
test_main(int argc,char * argv[])93 test_main( int argc, char* argv[] )
94 {
95     test_base64<char>();
96     #ifndef BOOST_NO_CWCHAR
97     test_base64<wchar_t>();
98     #endif
99     return EXIT_SUCCESS;
100 }
101