| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 | // 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/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 ONLYstruct 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))#endifnamespace boost {#ifndef BOOST_UNITS_DOXYGENnamespace mpl {/// INTERNAL ONLYtemplate<class Tag>struct less_impl<boost::units::scaled_base_unit_tag, Tag>{    template<class T0, class T1>    struct apply : mpl::bool_<        mpl::less<typename T0::system_type, T1>::value ||    (boost::is_same<typename T0::system_type, T1>::value && ((T0::scale_type::exponent::Numerator) < 0)) > {};};/// INTERNAL ONLYtemplate<class Tag>struct less_impl<Tag, boost::units::scaled_base_unit_tag>{    template<class T0, class T1>    struct apply : mpl::bool_<        mpl::less<T0, typename T1::system_type>::value ||    (boost::is_same<T0, typename T1::system_type>::value && ((T1::scale_type::exponent::Numerator) > 0)) > {};};/// INTERNAL ONLYtemplate<>struct less_impl<boost::units::scaled_base_unit_tag, boost::units::scaled_base_unit_tag>{    template<class T0, class T1>    struct apply : mpl::bool_<        mpl::less<typename T0::system_type, typename T1::system_type>::value ||    ((boost::is_same<typename T0::system_type, typename T1::system_type>::value) &&     ((T0::scale_type::base) < (T1::scale_type::base) ||      ((T0::scale_type::base) == (T1::scale_type::base) &&       mpl::less<typename T0::scale_type::exponent, typename T1::scale_type::exponent>::value))) > {};};} // namespace mpl#endif} // namespace boost#endif
 |