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.
146 lines
3.9 KiB
146 lines
3.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_SCALED_BASE_UNIT_HPP_INCLUDED |
|
#define BOOST_UNITS_SCALED_BASE_UNIT_HPP_INCLUDED |
|
|
|
#include <string> |
|
|
|
#include <boost/mpl/bool.hpp> |
|
#include <boost/mpl/less.hpp> |
|
#include <boost/type_traits/is_same.hpp> |
|
#include <boost/type_traits/detail/ice_and.hpp> |
|
#include <boost/type_traits/detail/ice_or.hpp> |
|
|
|
#include <boost/units/config.hpp> |
|
#include <boost/units/dimension.hpp> |
|
#include <boost/units/static_rational.hpp> |
|
#include <boost/units/units_fwd.hpp> |
|
|
|
namespace boost { |
|
|
|
namespace units { |
|
|
|
template<class T> |
|
struct heterogeneous_system; |
|
|
|
template<class T, class D, class Scale> |
|
struct heterogeneous_system_impl; |
|
|
|
template<class T, class E> |
|
struct heterogeneous_system_dim; |
|
|
|
template<class T> |
|
struct base_unit_info; |
|
|
|
/// INTERNAL ONLY |
|
struct scaled_base_unit_tag {}; |
|
|
|
template<class S, class Scale> |
|
struct scaled_base_unit |
|
{ |
|
/// INTERNAL ONLY |
|
typedef void boost_units_is_base_unit_type; |
|
typedef scaled_base_unit type; |
|
typedef scaled_base_unit_tag tag; |
|
typedef S system_type; |
|
typedef Scale scale_type; |
|
typedef typename S::dimension_type dimension_type; |
|
|
|
#ifdef BOOST_UNITS_DOXYGEN |
|
|
|
typedef detail::unspecified unit_type; |
|
|
|
#else |
|
|
|
typedef unit< |
|
dimension_type, |
|
heterogeneous_system< |
|
heterogeneous_system_impl< |
|
list< |
|
heterogeneous_system_dim<scaled_base_unit,static_rational<1> >, |
|
dimensionless_type |
|
>, |
|
dimension_type, |
|
dimensionless_type |
|
> |
|
> |
|
> unit_type; |
|
|
|
#endif |
|
|
|
static std::string symbol() |
|
{ |
|
return(Scale::symbol() + base_unit_info<S>::symbol()); |
|
} |
|
static std::string name() |
|
{ |
|
return(Scale::name() + base_unit_info<S>::name()); |
|
} |
|
}; |
|
|
|
} // namespace units |
|
|
|
} // namespace boost |
|
|
|
#if BOOST_UNITS_HAS_BOOST_TYPEOF |
|
|
|
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP() |
|
|
|
BOOST_TYPEOF_REGISTER_TEMPLATE(boost::units::scaled_base_unit, (class)(class)) |
|
|
|
#endif |
|
|
|
namespace boost { |
|
|
|
#ifndef BOOST_UNITS_DOXYGEN |
|
|
|
namespace mpl { |
|
|
|
/// INTERNAL ONLY |
|
template<class Tag> |
|
struct less_impl<boost::units::scaled_base_unit_tag, Tag> |
|
{ |
|
template<class T0, class T1> |
|
struct apply : mpl::bool_< |
|
boost::type_traits::ice_or<(mpl::less<typename T0::system_type, T1>::value), |
|
(boost::type_traits::ice_and<boost::is_same<typename T0::system_type, T1>::value, (T0::scale_type::exponent::Numerator) < 0>::value)>::value> {}; |
|
}; |
|
|
|
/// INTERNAL ONLY |
|
template<class Tag> |
|
struct less_impl<Tag, boost::units::scaled_base_unit_tag> |
|
{ |
|
template<class T0, class T1> |
|
struct apply : mpl::bool_< |
|
boost::type_traits::ice_or<(mpl::less<T0, typename T1::system_type>::value), |
|
boost::type_traits::ice_and<(boost::is_same<T0, typename T1::system_type>::value), ((T1::scale_type::exponent::Numerator) > 0)>::value>::value> {}; |
|
}; |
|
|
|
/// INTERNAL ONLY |
|
template<> |
|
struct less_impl<boost::units::scaled_base_unit_tag, boost::units::scaled_base_unit_tag> |
|
{ |
|
template<class T0, class T1> |
|
struct apply : mpl::bool_< |
|
boost::type_traits::ice_or<(mpl::less<typename T0::system_type, typename T1::system_type>::value), |
|
boost::type_traits::ice_and<(boost::is_same<typename T0::system_type, typename T1::system_type>::value), |
|
boost::type_traits::ice_or<((T0::scale_type::base) < (T1::scale_type::base)), |
|
boost::type_traits::ice_and<((T0::scale_type::base) == (T1::scale_type::base)), |
|
(mpl::less<typename T0::scale_type::exponent,typename T1::scale_type::exponent>::value)>::value>::value>::value>::value> {}; |
|
}; |
|
|
|
} // namespace mpl |
|
|
|
#endif |
|
|
|
} // namespace boost |
|
|
|
#endif
|
|
|