145 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			145 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // 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 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_< | ||
|  |         mpl::less<typename T0::system_type, T1>::value || | ||
|  |     (boost::is_same<typename T0::system_type, T1>::value && ((T0::scale_type::exponent::Numerator) < 0)) > {}; | ||
|  | }; | ||
|  | 
 | ||
|  | /// INTERNAL ONLY | ||
|  | template<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 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_< | ||
|  |         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 |