• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*=============================================================================
2     Copyright (c) 2001-2011 Hartmut Kaiser
3 
4     Distributed under the Boost Software License, Version 1.0. (See accompanying
5     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 ==============================================================================*/
7 #include <boost/detail/lightweight_test.hpp>
8 
9 #include <boost/spirit/home/x3/binary.hpp>
10 #include <boost/cstdint.hpp>
11 #include <boost/predef/other/endian.h>
12 #include "test.hpp"
13 
14 ///////////////////////////////////////////////////////////////////////////////
main()15 int main()
16 {
17     using spirit_test::test_attr;
18     using spirit_test::test;
19     using spirit_test::binary_test;
20     using spirit_test::binary_test_attr;
21 
22     using boost::spirit::x3::byte_;
23     using boost::spirit::x3::word;
24     using boost::spirit::x3::dword;
25     using boost::spirit::x3::big_word;
26     using boost::spirit::x3::big_dword;
27     using boost::spirit::x3::little_word;
28     using boost::spirit::x3::little_dword;
29 #ifdef BOOST_HAS_LONG_LONG
30     using boost::spirit::x3::qword;
31     using boost::spirit::x3::big_qword;
32     using boost::spirit::x3::little_qword;
33 #endif
34     using boost::spirit::x3::bin_float;
35     using boost::spirit::x3::big_bin_float;
36     using boost::spirit::x3::little_bin_float;
37     using boost::spirit::x3::bin_double;
38     using boost::spirit::x3::big_bin_double;
39     using boost::spirit::x3::little_bin_double;
40 
41     boost::uint8_t uc;
42     boost::uint16_t us;
43     boost::uint32_t ui;
44 #ifdef BOOST_HAS_LONG_LONG
45     boost::uint64_t ul;
46 #endif
47     float f;
48     double d;
49 
50     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(byte_);
51     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(word);
52     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(dword);
53     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(big_word);
54     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(big_dword);
55     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(little_word);
56     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(little_dword);
57 #ifdef BOOST_HAS_LONG_LONG
58     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(qword);
59     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(big_qword);
60     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(little_qword);
61     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(bin_float);
62     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(big_bin_float);
63     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(little_bin_float);
64     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(bin_double);
65     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(big_bin_double);
66     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(little_bin_double);
67 #endif
68 
69 // TODO: boost::endian::endian_arithmetic value constructor is not constexpr
70 #if 0
71     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(byte_(1));
72     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(word(1));
73     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(dword(1));
74     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(big_word(1));
75     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(big_dword(1));
76     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(little_word(1));
77     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(little_dword(1));
78 #ifdef BOOST_HAS_LONG_LONG
79     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(qword(1));
80     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(big_qword(1));
81     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(little_qword(1));
82 #endif
83     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(bin_float(1.0f));
84     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(big_bin_float(1.0f));
85     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(little_bin_float(1.0f));
86     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(bin_double(1.0));
87     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(big_bin_double(1.0));
88     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(little_bin_double(1.0));
89 #endif
90 
91     {   // test native endian binaries
92 #if BOOST_ENDIAN_LITTLE_BYTE
93         BOOST_TEST(test_attr("\x01", byte_, uc) && uc == 0x01);
94         BOOST_TEST(test_attr("\x01\x02", word, us) && us == 0x0201);
95         BOOST_TEST(test_attr("\x01\x02\x03\x04", dword, ui) && ui == 0x04030201);
96 #ifdef BOOST_HAS_LONG_LONG
97         BOOST_TEST(test_attr("\x01\x02\x03\x04\x05\x06\x07\x08", qword, ul) &&
98             ul == 0x0807060504030201LL);
99 #endif
100         BOOST_TEST(binary_test_attr("\x00\x00\x80\x3f", 4, bin_float, f) &&
101             f == 1.0f);
102         BOOST_TEST(binary_test_attr("\x00\x00\x00\x00\x00\x00\xf0\x3f",
103             8, bin_double, d) && f == 1.0);
104 #else
105         BOOST_TEST(test_attr("\x01", byte_, uc) && uc == 0x01);
106         BOOST_TEST(test_attr("\x01\x02", word, us) && us ==  0x0102);
107         BOOST_TEST(test_attr("\x01\x02\x03\x04", dword, ui) && ui == 0x01020304);
108 #ifdef BOOST_HAS_LONG_LONG
109         BOOST_TEST(test_attr("\x01\x02\x03\x04\x05\x06\x07\x08", qword, ul) &&
110             ul == 0x0102030405060708LL);
111 #endif
112         BOOST_TEST(binary_test_attr("\x3f\x80\x00\x00", 4, bin_float, f) &&
113             f == 1.0f);
114         BOOST_TEST(binary_test_attr("\x3f\xf0\x00\x00\x00\x00\x00\x00",
115             8, bin_double, d) && f == 1.0);
116 #endif
117     }
118 
119     {   // test native endian binaries
120 #if BOOST_ENDIAN_LITTLE_BYTE
121         BOOST_TEST(test("\x01", byte_(0x01)));
122         BOOST_TEST(test("\x01\x02", word(0x0201)));
123         BOOST_TEST(test("\x01\x02\x03\x04", dword(0x04030201)));
124 #ifdef BOOST_HAS_LONG_LONG
125         BOOST_TEST(test("\x01\x02\x03\x04\x05\x06\x07\x08",
126             qword(0x0807060504030201LL)));
127 #endif
128         BOOST_TEST(binary_test("\x00\x00\x80\x3f", 4, bin_float(1.0f)));
129         BOOST_TEST(binary_test("\x00\x00\x00\x00\x00\x00\xf0\x3f", 8,
130             bin_double(1.0)));
131 #else
132         BOOST_TEST(test("\x01", byte_(0x01)));
133         BOOST_TEST(test("\x01\x02", word(0x0102)));
134         BOOST_TEST(test("\x01\x02\x03\x04", dword(0x01020304)));
135 #ifdef BOOST_HAS_LONG_LONG
136         BOOST_TEST(test("\x01\x02\x03\x04\x05\x06\x07\x08",
137             qword(0x0102030405060708LL)));
138 #endif
139         BOOST_TEST(binary_test("\x3f\x80\x00\x00", 4, bin_float(1.0f)));
140         BOOST_TEST(binary_test("\x3f\x80\x00\x00\x00\x00\x00\x00", 8,
141             bin_double(1.0)));
142 #endif
143     }
144 
145     {   // test big endian binaries
146         BOOST_TEST(test_attr("\x01\x02", big_word, us) && us == 0x0102);
147         BOOST_TEST(test_attr("\x01\x02\x03\x04", big_dword, ui) && ui == 0x01020304);
148 #ifdef BOOST_HAS_LONG_LONG
149         BOOST_TEST(test_attr("\x01\x02\x03\x04\x05\x06\x07\x08", big_qword, ul)
150             && ul == 0x0102030405060708LL);
151 #endif
152         BOOST_TEST(binary_test_attr("\x3f\x80\x00\x00", 4, big_bin_float, f) &&
153             f == 1.0f);
154         BOOST_TEST(binary_test_attr("\x3f\xf0\x00\x00\x00\x00\x00\x00",
155             8, big_bin_double, d) && f == 1.0);
156     }
157 
158     {
159         BOOST_TEST(test("\x01\x02", big_word(0x0102)));
160         BOOST_TEST(test("\x01\x02\x03\x04", big_dword(0x01020304)));
161 #ifdef BOOST_HAS_LONG_LONG
162         BOOST_TEST(test("\x01\x02\x03\x04\x05\x06\x07\x08",
163             big_qword(0x0102030405060708LL)));
164 #endif
165         BOOST_TEST(binary_test("\x3f\x80\x00\x00", 4, big_bin_float(1.0f)));
166         BOOST_TEST(binary_test("\x3f\xf0\x00\x00\x00\x00\x00\x00", 8,
167             big_bin_double(1.0)));
168     }
169 
170     {   // test little endian binaries
171         BOOST_TEST(test_attr("\x01\x02", little_word, us) && us == 0x0201);
172         BOOST_TEST(test_attr("\x01\x02\x03\x04", little_dword, ui) && ui == 0x04030201);
173 #ifdef BOOST_HAS_LONG_LONG
174         BOOST_TEST(test_attr("\x01\x02\x03\x04\x05\x06\x07\x08", little_qword, ul)
175             && ul == 0x0807060504030201LL);
176 #endif
177         BOOST_TEST(binary_test_attr("\x00\x00\x80\x3f", 4,
178             little_bin_float, f) && f == 1.0f);
179         BOOST_TEST(binary_test_attr("\x00\x00\x00\x00\x00\x00\xf0\x3f",
180             8, little_bin_double, d) && f == 1.0);
181     }
182 
183     {
184         BOOST_TEST(test("\x01\x02", little_word(0x0201)));
185         BOOST_TEST(test("\x01\x02\x03\x04", little_dword(0x04030201)));
186 #ifdef BOOST_HAS_LONG_LONG
187         BOOST_TEST(test("\x01\x02\x03\x04\x05\x06\x07\x08",
188             little_qword(0x0807060504030201LL)));
189 #endif
190         BOOST_TEST(binary_test("\x00\x00\x80\x3f", 4, little_bin_float(1.0f)));
191         BOOST_TEST(binary_test("\x00\x00\x00\x00\x00\x00\xf0\x3f", 8,
192             little_bin_double(1.0)));
193     }
194 
195     return boost::report_errors();
196 }
197