test_default_conversion.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // Boost.Units - A C++ library for zero-overhead dimensional analysis and
  2. // unit/quantity manipulation and conversion
  3. //
  4. // Copyright (C) 2003-2008 Matthias Christian Schabel
  5. // Copyright (C) 2008 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. #include <boost/test/minimal.hpp>
  11. #include <boost/units/base_dimension.hpp>
  12. #include <boost/units/base_unit.hpp>
  13. #include <boost/units/make_system.hpp>
  14. #include <boost/units/scaled_base_unit.hpp>
  15. #include <boost/units/conversion.hpp>
  16. #include <boost/units/unit.hpp>
  17. struct dimension1_tag : boost::units::base_dimension<dimension1_tag, 1> {};
  18. struct dimension2_tag : boost::units::base_dimension<dimension2_tag, 2> {};
  19. typedef dimension1_tag::dimension_type dimension1;
  20. typedef dimension2_tag::dimension_type dimension2;
  21. typedef boost::mpl::times<dimension1, dimension2>::type dimension12;
  22. struct unit1_tag : boost::units::base_unit<unit1_tag, dimension1, 1> {};
  23. struct unit2_tag : boost::units::base_unit<unit2_tag, dimension1, 2> {};
  24. struct unit3_tag : boost::units::base_unit<unit3_tag, dimension1, 3> {};
  25. struct unit4_tag : boost::units::base_unit<unit4_tag, dimension2, 4> {};
  26. struct unit5_tag : boost::units::base_unit<unit5_tag, dimension12, 5> {};
  27. struct unit6_tag : boost::units::base_unit<unit6_tag, dimension1, 6> {};
  28. struct unit7_tag : boost::units::base_unit<unit7_tag, dimension1, 7> {};
  29. BOOST_UNITS_DEFINE_CONVERSION_FACTOR(unit1_tag, unit2_tag, double, 2.0);
  30. BOOST_UNITS_DEFINE_CONVERSION_FACTOR(unit2_tag, unit3_tag, double, 3.0);
  31. BOOST_UNITS_DEFINE_CONVERSION_FACTOR(unit6_tag, unit3_tag, double, 5.0);
  32. BOOST_UNITS_DEFINE_CONVERSION_FACTOR(unit7_tag, unit1_tag, double, 7.0);
  33. typedef boost::units::multiply_typeof_helper<unit3_tag::unit_type, unit4_tag::unit_type>::type unit34_type;
  34. BOOST_UNITS_DEFINE_CONVERSION_FACTOR(unit5_tag, unit34_type , double, 5.0);
  35. template<class BaseUnit>
  36. struct make_unit {
  37. typedef boost::units::unit<
  38. typename BaseUnit::dimension_type,
  39. typename boost::units::make_system<BaseUnit>::type> type;
  40. };
  41. BOOST_UNITS_DEFAULT_CONVERSION(unit1_tag, unit2_tag);
  42. BOOST_UNITS_DEFAULT_CONVERSION(unit3_tag, unit2_tag);
  43. BOOST_UNITS_DEFAULT_CONVERSION(unit5_tag, unit34_type);
  44. BOOST_UNITS_DEFAULT_CONVERSION(unit6_tag, make_unit<unit3_tag>::type);
  45. BOOST_UNITS_DEFAULT_CONVERSION(unit7_tag, make_unit<unit1_tag>::type);
  46. int test_main(int, char*[]) {
  47. BOOST_CONSTEXPR_OR_CONST double value1 = boost::units::conversion_factor(unit3_tag::unit_type(), unit1_tag::unit_type());
  48. BOOST_CHECK(std::abs(value1 - 1.0/6.0) < .0000000001);
  49. BOOST_CONSTEXPR_OR_CONST double value2 = boost::units::conversion_factor(unit5_tag::unit_type() / unit4_tag::unit_type(), unit1_tag::unit_type());
  50. BOOST_CHECK(std::abs(value2 - 5.0/6.0) < .0000000001);
  51. typedef boost::units::scaled_base_unit<unit5_tag, boost::units::scale<2, boost::units::static_rational<1> > > scaled_unit5_tag;
  52. BOOST_CONSTEXPR_OR_CONST double value3 = boost::units::conversion_factor(scaled_unit5_tag::unit_type() / unit4_tag::unit_type(), unit1_tag::unit_type());
  53. BOOST_CHECK(std::abs(value3 - 10.0/6.0) < .0000000001);
  54. // check homogeneous unit conversions
  55. BOOST_CONSTEXPR_OR_CONST double value4 = boost::units::conversion_factor(make_unit<unit3_tag>::type(), make_unit<unit1_tag>::type());
  56. BOOST_CHECK(std::abs(value4 - 1.0/6.0) < .0000000001);
  57. BOOST_CONSTEXPR_OR_CONST double value5 = boost::units::conversion_factor(unit3_tag::unit_type(), make_unit<unit1_tag>::type());
  58. BOOST_CHECK(std::abs(value5 - 1.0/6.0) < .0000000001);
  59. BOOST_CONSTEXPR_OR_CONST double value6 = boost::units::conversion_factor(make_unit<unit3_tag>::type(), unit1_tag::unit_type());
  60. BOOST_CHECK(std::abs(value6 - 1.0/6.0) < .0000000001);
  61. // check chained homogeneous conversions
  62. BOOST_CONSTEXPR_OR_CONST double value7 = boost::units::conversion_factor(unit6_tag::unit_type(), unit7_tag::unit_type());
  63. BOOST_CHECK(std::abs(value7 - 5.0/42.0) < .0000000001);
  64. return(0);
  65. }