You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
104 lines
2.9 KiB
104 lines
2.9 KiB
// Boost.Units - A C++ library for zero-overhead dimensional analysis and |
|
// unit/quantity manipulation and conversion |
|
// |
|
// Copyright (C) 2003-2008 Matthias Christian Schabel |
|
// Copyright (C) 2008 Steven Watanabe |
|
// |
|
// Distributed under the Boost Software License, Version 1.0. (See |
|
// accompanying file LICENSE_1_0.txt or copy at |
|
// http://www.boost.org/LICENSE_1_0.txt) |
|
|
|
#ifndef BOOST_UNITS_ABSOLUTE_IMPL_HPP |
|
#define BOOST_UNITS_ABSOLUTE_IMPL_HPP |
|
|
|
#include <iosfwd> |
|
|
|
#include <boost/units/config.hpp> |
|
#include <boost/units/conversion.hpp> |
|
#include <boost/units/heterogeneous_system.hpp> |
|
#include <boost/units/units_fwd.hpp> |
|
|
|
namespace boost { |
|
|
|
namespace units { |
|
|
|
/// INTERNAL ONLY |
|
template<class D, class S> |
|
struct reduce_unit<absolute<unit<D, S> > > |
|
{ |
|
typedef absolute<typename reduce_unit<unit<D, S> >::type> type; |
|
}; |
|
|
|
namespace detail { |
|
|
|
struct undefined_affine_conversion_base { |
|
static const bool is_defined = false; |
|
}; |
|
|
|
} // namespace detail |
|
|
|
/// INTERNAL ONLY |
|
template<class From, class To> |
|
struct affine_conversion_helper : detail::undefined_affine_conversion_base { }; |
|
|
|
namespace detail { |
|
|
|
template<bool IsDefined, bool ReverseIsDefined> |
|
struct affine_conversion_impl; |
|
|
|
template<bool ReverseIsDefined> |
|
struct affine_conversion_impl<true, ReverseIsDefined> |
|
{ |
|
template<class Unit1, class Unit2, class T0, class T1> |
|
struct apply { |
|
static T1 value(const T0& t0) |
|
{ |
|
return( |
|
t0 * |
|
conversion_factor(Unit1(), Unit2()) + |
|
affine_conversion_helper<typename reduce_unit<Unit1>::type, typename reduce_unit<Unit2>::type>::value()); |
|
} |
|
}; |
|
}; |
|
|
|
template<> |
|
struct affine_conversion_impl<false, true> |
|
{ |
|
template<class Unit1, class Unit2, class T0, class T1> |
|
struct apply |
|
{ |
|
static T1 value(const T0& t0) |
|
{ |
|
return( |
|
(t0 - affine_conversion_helper<typename reduce_unit<Unit2>::type, typename reduce_unit<Unit1>::type>::value()) * |
|
conversion_factor(Unit1(), Unit2())); |
|
} |
|
}; |
|
}; |
|
|
|
} // namespace detail |
|
|
|
/// INTERNAL ONLY |
|
template<class Unit1, class T1, class Unit2, class T2> |
|
struct conversion_helper<quantity<absolute<Unit1>, T1>, quantity<absolute<Unit2>, T2> > |
|
{ |
|
typedef quantity<absolute<Unit1>, T1> from_quantity_type; |
|
typedef quantity<absolute<Unit2>, T2> to_quantity_type; |
|
static to_quantity_type convert(const from_quantity_type& source) |
|
{ |
|
return( |
|
to_quantity_type::from_value( |
|
detail::affine_conversion_impl< |
|
affine_conversion_helper<typename reduce_unit<Unit1>::type, typename reduce_unit<Unit2>::type>::is_defined, |
|
affine_conversion_helper<typename reduce_unit<Unit2>::type, typename reduce_unit<Unit1>::type>::is_defined |
|
>::template apply<Unit1, Unit2, T1, T2>::value(source.value()) |
|
) |
|
); |
|
} |
|
}; |
|
|
|
} // namespace units |
|
|
|
} // namespace boost |
|
|
|
#endif // BOOST_UNITS_ABSOLUTE_IMPL_HPP
|
|
|