]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/units/test/test_quantity.cpp
1 // Boost.Units - A C++ library for zero-overhead dimensional analysis and
2 // unit/quantity manipulation and conversion
4 // Copyright (C) 2003-2008 Matthias Christian Schabel
5 // Copyright (C) 2008 Steven Watanabe
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)
14 \brief test_units_1.cpp
24 #include "test_header.hpp"
26 #include <boost/units/pow.hpp>
28 namespace bu
= boost::units
;
30 BOOST_STATIC_CONSTEXPR
double E_
= 2.718281828459045235360287471352662497757;
34 // default constructor
35 BOOST_CONSTEXPR_OR_CONST
bu::quantity
<bu::energy
> E1
;
36 BOOST_TEST(E1
.value() == double());
38 // value_type constructor
39 BOOST_CONSTEXPR_OR_CONST
bu::quantity
<bu::energy
> E2(E_
*bu::joules
);
40 BOOST_TEST(E2
.value() == E_
);
43 BOOST_CONSTEXPR_OR_CONST
bu::quantity
<bu::energy
> E3(E2
);
44 BOOST_TEST(E3
.value() == E_
);
47 BOOST_CONSTEXPR_OR_CONST
bu::quantity
<bu::energy
> E4
= E2
;
48 BOOST_TEST(E4
.value() == E_
);
50 // implicit copy constructor value_type conversion
51 BOOST_CONSTEXPR_OR_CONST
bu::quantity
<bu::energy
,float> E5(E2
);
52 BOOST_UNITS_CHECK_CLOSE(E5
.value(),float(E_
));
54 // implicit operator= value_type conversion
55 //BOOST_CONSTEXPR_OR_CONST bu::quantity<bu::energy,float> E7 = E2;
56 //BOOST_UNITS_CHECK_CLOSE(E7.value(),float(E_));
58 //BOOST_CONSTEXPR_OR_CONST bu::quantity<bu::energy,long> E8 = E2;
59 //BOOST_TEST(E8.value() == long(E_));
62 bu::quantity
<bu::energy
> E9(E2
);
63 BOOST_TEST(E9
.value() == E_
);
66 bu::quantity_cast
<double&>(E9
) = 1.5;
67 BOOST_TEST(E9
.value() == 1.5);
69 // value assignment with implicit value_type conversion
70 bu::quantity_cast
<double&>(E9
) = 2;
71 BOOST_TEST(E9
.value() == double(2));
73 // operator+=(this_type)
76 BOOST_TEST(E9
.value() == 4.0);
78 // operator-=(this_type)
81 BOOST_TEST(E9
.value() == 0.0);
83 // operator*=(value_type)
86 BOOST_TEST(E9
.value() == 4.0);
88 // operator/=(value_type)
91 BOOST_TEST(E9
.value() == 1.0);
93 // static construct quantity from value_type
94 BOOST_CONSTEXPR_OR_CONST
bu::quantity
<bu::energy
> E(bu::quantity
<bu::energy
>::from_value(2.5));
95 BOOST_TEST(E
.value() == 2.5);
100 BOOST_TEST(bu::joules
*2.0 == bu::quantity
<bu::energy
>::from_value(2.0));
103 BOOST_TEST(bu::joules
/2.0 == bu::quantity
<bu::energy
>::from_value(0.5));
106 BOOST_TEST(2.0*bu::joules
== bu::quantity
<bu::energy
>::from_value(2.0));
109 BOOST_TEST(2.0/bu::joules
== bu::quantity
<bu::inverse_energy
>::from_value(2.0));
112 BOOST_TEST(E
*2.0 == bu::quantity
<bu::energy
>::from_value(5.0));
115 BOOST_TEST(E
/2.0 == bu::quantity
<bu::energy
>::from_value(1.25));
118 BOOST_TEST(2.0*E
== bu::quantity
<bu::energy
>::from_value(5.0));
121 BOOST_TEST(2.0/E
== bu::quantity
<bu::inverse_energy
>::from_value(0.8));
123 BOOST_CONSTEXPR_OR_CONST
bu::quantity
<bu::length
> L(1.0*bu::meters
);
124 BOOST_CONSTEXPR_OR_CONST
bu::quantity
<bu::mass
> M(2.0*bu::kilograms
);
125 BOOST_CONSTEXPR_OR_CONST
bu::quantity
<bu::time
> T(3.0*bu::seconds
);
126 BOOST_CONSTEXPR_OR_CONST
bu::quantity
<bu::velocity
> V(bu::quantity
<bu::velocity
>::from_value(4.0));
129 BOOST_TEST(bu::seconds
*V
== 4.0*bu::meters
);
132 BOOST_TEST(bu::meters
/V
== 0.25*bu::seconds
);
135 BOOST_TEST(V
*bu::seconds
== 4.0*bu::meters
);
138 BOOST_TEST(V
/bu::meters
== 4.0/bu::seconds
);
141 BOOST_TEST(+V
== 4.0*bu::meters_per_second
);
144 BOOST_TEST(-V
== -4.0*bu::meters_per_second
);
146 // quantity + quantity
147 BOOST_TEST(V
+V
== 8.0*bu::meters_per_second
);
149 // quantity - quantity
150 BOOST_TEST(V
-V
== 0.0*bu::meters_per_second
);
152 // quantity * quantity
153 BOOST_TEST(V
*T
== 12.0*bu::meters
);
155 // quantity / quantity
156 BOOST_TEST(L
/V
== 0.25*bu::seconds
);
158 BOOST_CONSTEXPR_OR_CONST
bu::quantity
<bu::area
> A(2.0*bu::square_meters
);
159 BOOST_CONSTEXPR_OR_CONST
bu::quantity
<bu::volume
> VL(1.0*bu::cubic_meters
);
161 // integer power of quantity
162 BOOST_TEST(2.0*bu::pow
<2>(L
) == A
);
164 // rational power of quantity
165 BOOST_TEST((bu::pow
< bu::static_rational
<2,3> >(VL
) == 0.5*A
));
167 // integer root of quantity
168 BOOST_TEST(bu::root
<2>(A
) == std::sqrt(2.0)*L
);
170 // rational root of quantity
171 BOOST_TEST((bu::root
< bu::static_rational
<3,2> >(VL
) == 0.5*A
));
173 BOOST_CONSTEXPR_OR_CONST
bu::quantity
<bu::area
> A1(0.0*bu::square_meters
),
174 A2(0.0*bu::square_meters
),
175 A3(1.0*bu::square_meters
),
176 A4(-1.0*bu::square_meters
);
179 BOOST_TEST((A1
== A2
) == true);
180 BOOST_TEST((A1
== A3
) == false);
183 BOOST_TEST((A1
!= A2
) == false);
184 BOOST_TEST((A1
!= A3
) == true);
187 BOOST_TEST((A1
< A2
) == false);
188 BOOST_TEST((A1
< A3
) == true);
191 BOOST_TEST((A1
<= A2
) == true);
192 BOOST_TEST((A1
<= A3
) == true);
195 BOOST_TEST((A1
> A2
) == false);
196 BOOST_TEST((A1
> A4
) == true);
199 BOOST_TEST((A1
>= A2
) == true);
200 BOOST_TEST((A1
>= A4
) == true);
202 return boost::report_errors();