unscale.hpp
来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 234 行
HPP
234 行
// 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) 2007-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_DETAIL_UNSCALE_HPP_INCLUDED#define BOOST_UNITS_DETAIL_UNSCALE_HPP_INCLUDED#include <string>#include <boost/mpl/bool.hpp>#include <boost/mpl/size.hpp>#include <boost/mpl/begin.hpp>#include <boost/mpl/next.hpp>#include <boost/mpl/deref.hpp>#include <boost/mpl/plus.hpp>#include <boost/mpl/times.hpp>#include <boost/mpl/negate.hpp>#include <boost/mpl/less.hpp>#include <boost/units/config.hpp>#include <boost/units/dimension.hpp>#include <boost/units/scale.hpp>#include <boost/units/static_rational.hpp>#include <boost/units/units_fwd.hpp>#include <boost/units/detail/one.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 S, class Scale>struct scaled_base_unit;/// removes all scaling from a unit or a base unit.template<class T>struct unscale{#ifndef BOOST_UNITS_DOXYGEN typedef T type;#else typedef detail::unspecified type;#endif};/// INTERNAL ONLYtemplate<class S, class Scale>struct unscale<scaled_base_unit<S, Scale> >{ typedef typename unscale<S>::type type;};/// INTERNAL ONLYtemplate<class D, class S>struct unscale<unit<D, S> >{ typedef unit<D, typename unscale<S>::type> type;};/// INTERNAL ONLYtemplate<class Scale>struct scale_list_dim;/// INTERNAL ONLYtemplate<class T>struct get_scale_list{ typedef dimensionless_type type;};/// INTERNAL ONLYtemplate<class S, class Scale>struct get_scale_list<scaled_base_unit<S, Scale> >{ typedef typename mpl::times<list<scale_list_dim<Scale>, dimensionless_type>, typename get_scale_list<S>::type>::type type;};/// INTERNAL ONLYtemplate<class D, class S>struct get_scale_list<unit<D, S> >{ typedef typename get_scale_list<S>::type type;};/// INTERNAL ONLYstruct scale_dim_tag {};/// INTERNAL ONLYtemplate<class Scale>struct scale_list_dim : Scale{ typedef scale_dim_tag tag; typedef scale_list_dim type;};} // namespace units#ifndef BOOST_UNITS_DOXYGENnamespace mpl {/// INTERNAL ONLYtemplate<>struct less_impl<boost::units::scale_dim_tag, boost::units::scale_dim_tag>{ template<class T0, class T1> struct apply : mpl::bool_<((T0::base) < (T1::base))> {};};}#endifnamespace units {namespace detail {template<class Scale>struct is_empty_dim<scale_list_dim<Scale> > : mpl::false_ {};template<long N>struct is_empty_dim<scale_list_dim<scale<N, static_rational<0, 1> > > > : mpl::true_ {};template<int N>struct eval_scale_list_impl{ template<class Begin> struct apply { typedef typename eval_scale_list_impl<N-1>::template apply<typename Begin::next> next_iteration; typedef typename multiply_typeof_helper<typename next_iteration::type, typename Begin::item::value_type>::type type; static type value() { return(next_iteration::value() * Begin::item::value()); } };};template<>struct eval_scale_list_impl<0>{ template<class Begin> struct apply { typedef one type; static type value() { return(type()); } };};}/// INTERNAL ONLYtemplate<class T>struct eval_scale_list : detail::eval_scale_list_impl<T::size::value>::template apply<T> {};} // namespace units#ifndef BOOST_UNITS_DOXYGENnamespace mpl {/// INTERNAL ONLYtemplate<>struct plus_impl<boost::units::scale_dim_tag, boost::units::scale_dim_tag>{ template<class T0, class T1> struct apply { typedef boost::units::scale_list_dim< boost::units::scale< (T0::base), typename mpl::plus<typename T0::exponent, typename T1::exponent>::type > > type; };};/// INTERNAL ONLYtemplate<>struct negate_impl<boost::units::scale_dim_tag>{ template<class T0> struct apply { typedef boost::units::scale_list_dim< boost::units::scale< (T0::base), typename mpl::negate<typename T0::exponent>::type > > type; };};/// INTERNAL ONLYtemplate<>struct times_impl<boost::units::scale_dim_tag, boost::units::detail::static_rational_tag>{ template<class T0, class T1> struct apply { typedef boost::units::scale_list_dim< boost::units::scale< (T0::base), typename mpl::times<typename T0::exponent, T1>::type > > type; };};} // namespace mpl#endif} // namespace boost#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?