1 | // Boost.Units - A C++ library for zero-overhead dimensional analysis and |
2 | // unit/quantity manipulation and conversion |
3 | // |
4 | // Copyright (C) 2003-2009 Matthias Christian Schabel |
5 | // Copyright (C) 2007-2009 Steven Watanabe |
6 | // |
7 | // Distributed under the Boost Software License, Version 1.0. (See |
8 | // accompanying file LICENSE_1_0.txt or copy at |
9 | // http://www.boost.org/LICENSE_1_0.txt) |
10 | |
11 | /** |
12 | \file |
13 | |
14 | \brief test_constants.cpp |
15 | |
16 | \details |
17 | Test all combinations of operators with the constants. |
18 | |
19 | **/ |
20 | |
21 | #include <boost/units/systems/detail/constants.hpp> |
22 | #include <boost/units/quantity.hpp> |
23 | #include <boost/units/pow.hpp> |
24 | #include <boost/units/systems/si/length.hpp> |
25 | #include <boost/units/systems/si/time.hpp> |
26 | |
27 | using boost::units::quantity; |
28 | using boost::units::si::length; |
29 | using boost::units::si::meters; |
30 | using boost::units::si::seconds; |
31 | using boost::units::static_rational; |
32 | using boost::units::pow; |
33 | using boost::units::root; |
34 | |
35 | BOOST_UNITS_PHYSICAL_CONSTANT(length_constant, quantity<length>, 2.0 * meters, 0.5 * meters); |
36 | |
37 | template<class T> |
38 | void check_same(const T&, const T&); |
39 | |
40 | template<class T> |
41 | typename T::value_type unwrap(const boost::units::constant<T>&); |
42 | |
43 | template<class T> |
44 | T unwrap(const T&); |
45 | |
46 | #define BOOST_UNITS_CHECK_RESULT(arg1, op, arg2) check_same((arg1) op (arg2), unwrap(arg1) op unwrap(arg2)); |
47 | |
48 | void test_add() { |
49 | BOOST_UNITS_CHECK_RESULT(length_constant, +, length_constant); |
50 | BOOST_UNITS_CHECK_RESULT(length_constant, +, 1.0 * meters); |
51 | BOOST_UNITS_CHECK_RESULT(1.0* meters, +, length_constant); |
52 | } |
53 | |
54 | void test_subtract() { |
55 | BOOST_UNITS_CHECK_RESULT(length_constant, -, length_constant); |
56 | BOOST_UNITS_CHECK_RESULT(length_constant, -, 1.0 * meters); |
57 | BOOST_UNITS_CHECK_RESULT(1.0* meters, -, length_constant); |
58 | } |
59 | |
60 | void test_multiply() { |
61 | BOOST_UNITS_CHECK_RESULT(length_constant, *, length_constant); |
62 | BOOST_UNITS_CHECK_RESULT(length_constant, *, 1.0 * seconds); |
63 | BOOST_UNITS_CHECK_RESULT(1.0 * seconds, *, length_constant); |
64 | BOOST_UNITS_CHECK_RESULT(length_constant, *, 1.0); |
65 | BOOST_UNITS_CHECK_RESULT(1.0, *, length_constant); |
66 | BOOST_UNITS_CHECK_RESULT(length_constant, *, seconds); |
67 | BOOST_UNITS_CHECK_RESULT(seconds, *, length_constant); |
68 | } |
69 | |
70 | void test_divide() { |
71 | BOOST_UNITS_CHECK_RESULT(length_constant, /, length_constant); |
72 | BOOST_UNITS_CHECK_RESULT(length_constant, /, 1.0 * seconds); |
73 | BOOST_UNITS_CHECK_RESULT(1.0 * seconds, /, length_constant); |
74 | BOOST_UNITS_CHECK_RESULT(length_constant, /, 1.0); |
75 | BOOST_UNITS_CHECK_RESULT(1.0, /, length_constant); |
76 | BOOST_UNITS_CHECK_RESULT(length_constant, /, seconds); |
77 | BOOST_UNITS_CHECK_RESULT(seconds, /, length_constant); |
78 | } |
79 | |
80 | void test_pow() { |
81 | check_same(pow<2>(x: length_constant), pow<2>(x: unwrap(length_constant))); |
82 | check_same(root<2>(x: length_constant), root<2>(x: unwrap(length_constant))); |
83 | check_same(pow<5>(x: length_constant), pow<5>(x: unwrap(length_constant))); |
84 | check_same(root<5>(x: length_constant), root<5>(x: unwrap(length_constant))); |
85 | check_same(pow<static_rational<2, 3> >(x: length_constant), pow<static_rational<2, 3> >(x: unwrap(length_constant))); |
86 | check_same(root<static_rational<2, 3> >(x: length_constant), root<static_rational<2, 3> >(x: unwrap(length_constant))); |
87 | } |
88 | |