146 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			146 lines
		
	
	
		
			4.9 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_MAKE_SYSTEM_HPP | ||
|  | #define BOOST_UNITS_MAKE_SYSTEM_HPP | ||
|  | 
 | ||
|  | /// \file | ||
|  | /// \brief Metafunction returning a homogeneous system that can | ||
|  | ///    represent any combination of the base units. | ||
|  | /// \details | ||
|  | /// Metafunction make_system returning a homogeneous system that can | ||
|  | /// represent any combination of the base units.  There must | ||
|  | /// be no way to represent any of the base units in terms | ||
|  | /// of the others.  make_system<foot_base_unit, meter_base_unit>::type | ||
|  | /// is not allowed, for example. | ||
|  | 
 | ||
|  | #include <boost/units/config.hpp> | ||
|  | #include <boost/units/dimensionless_type.hpp> | ||
|  | #include <boost/units/homogeneous_system.hpp> | ||
|  | #include <boost/units/detail/dimension_list.hpp> | ||
|  | #include <boost/units/detail/sort.hpp> | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | 
 | ||
|  | namespace units { | ||
|  | 
 | ||
|  | #ifdef BOOST_UNITS_DOXYGEN | ||
|  | 
 | ||
|  | namespace detail { | ||
|  | 
 | ||
|  | struct unspecified {}; | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | /// Metafunction returning a homogeneous system that can | ||
|  | /// represent any combination of the base units.  There must | ||
|  | /// be no way to represent any of the base units in terms | ||
|  | /// of the others.  make_system<foot_base_unit, meter_base_unit>::type | ||
|  | /// is not allowed, for example. | ||
|  | template<class BaseUnit0, class BaseUnit1, class BaseUnit2, ..., class BaseUnitN> | ||
|  | struct make_system | ||
|  | { | ||
|  |     typedef homogeneous_system<detail::unspecified> type; | ||
|  | }; | ||
|  | 
 | ||
|  | #else | ||
|  | 
 | ||
|  | struct na {}; | ||
|  | 
 | ||
|  | template< | ||
|  |     class U0 = na, | ||
|  |     class U1 = na, | ||
|  |     class U2 = na, | ||
|  |     class U3 = na, | ||
|  |     class U4 = na, | ||
|  |     class U5 = na, | ||
|  |     class U6 = na, | ||
|  |     class U7 = na, | ||
|  |     class U8 = na, | ||
|  |     class U9 = na | ||
|  | > | ||
|  | struct make_system; | ||
|  | 
 | ||
|  | template<> | ||
|  | struct make_system<> | ||
|  | { | ||
|  |     typedef homogeneous_system<dimensionless_type> type; | ||
|  | }; | ||
|  | 
 | ||
|  | // Codewarrior 9.2 doesn't like using the defaults.  Need | ||
|  | // to specify na explicitly. | ||
|  | template<class T0> | ||
|  | struct make_system<T0, na, na, na, na, na, na, na, na, na> | ||
|  | { | ||
|  |     typedef homogeneous_system<list<T0, dimensionless_type> > type; | ||
|  | }; | ||
|  | 
 | ||
|  | template<class T0, class T1> | ||
|  | struct make_system<T0, T1, na, na, na, na, na, na, na, na> | ||
|  | { | ||
|  |     typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, dimensionless_type> > >::type> type; | ||
|  | }; | ||
|  | 
 | ||
|  | template<class T0, class T1, class T2> | ||
|  | struct make_system<T0, T1, T2, na, na, na, na, na, na, na> | ||
|  | { | ||
|  |     typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, dimensionless_type> > > >::type> type; | ||
|  | }; | ||
|  | 
 | ||
|  | template<class T0, class T1, class T2, class T3> | ||
|  | struct make_system<T0, T1, T2, T3, na, na, na, na, na, na> | ||
|  | { | ||
|  |     typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, dimensionless_type> > > > >::type> type; | ||
|  | }; | ||
|  | 
 | ||
|  | template<class T0, class T1, class T2, class T3, class T4> | ||
|  | struct make_system<T0, T1, T2, T3, T4, na, na, na, na, na> | ||
|  | { | ||
|  |     typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, dimensionless_type> > > > > >::type> type; | ||
|  | }; | ||
|  | 
 | ||
|  | template<class T0, class T1, class T2, class T3, class T4, class T5> | ||
|  | struct make_system<T0, T1, T2, T3, T4, T5, na, na, na, na> | ||
|  | { | ||
|  |     typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, list<T5, dimensionless_type> > > > > > >::type> type; | ||
|  | }; | ||
|  | 
 | ||
|  | template<class T0, class T1, class T2, class T3, class T4, class T5, class T6> | ||
|  | struct make_system<T0, T1, T2, T3, T4, T5, T6, na, na, na> | ||
|  | { | ||
|  |     typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, list<T5, list<T6, dimensionless_type> > > > > > > >::type> type; | ||
|  | }; | ||
|  | 
 | ||
|  | template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7> | ||
|  | struct make_system<T0, T1, T2, T3, T4, T5, T6, T7, na, na> | ||
|  | { | ||
|  |     typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, list<T5, list<T6, list<T7, dimensionless_type> > > > > > > > >::type> type; | ||
|  | }; | ||
|  | 
 | ||
|  | template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8> | ||
|  | struct make_system<T0, T1, T2, T3, T4, T5, T6, T7, T8, na> | ||
|  | { | ||
|  |     typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, list<T5, list<T6, list<T7, list<T8, dimensionless_type> > > > > > > > > >::type> type; | ||
|  | }; | ||
|  | 
 | ||
|  | template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9> | ||
|  | struct make_system | ||
|  | { | ||
|  |     typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, list<T5, list<T6, list<T7, list<T8, list<T9, dimensionless_type> > > > > > > > > > >::type> type; | ||
|  | }; | ||
|  | 
 | ||
|  | #endif | ||
|  | 
 | ||
|  | } // namespace units | ||
|  | 
 | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | #endif |