// 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 |