|
From: Steven W. <ste...@us...> - 2007-03-29 00:31:47
|
Update of /cvsroot/boost-sandbox/boost-sandbox/boost/units/detail In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv1466/boost-sandbox/boost/units/detail Modified Files: conversion_impl.hpp Log Message: Bug Fixes Index: conversion_impl.hpp =================================================================== RCS file: /cvsroot/boost-sandbox/boost-sandbox/boost/units/detail/conversion_impl.hpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- conversion_impl.hpp 16 Mar 2007 18:12:43 -0000 1.1.1.1 +++ conversion_impl.hpp 29 Mar 2007 00:31:27 -0000 1.2 @@ -14,7 +14,10 @@ #include <cmath> #include <boost/type_traits/is_base_and_derived.hpp> +#include <boost/type_traits/is_same.hpp> +#include <boost/mpl/eval_if.hpp> +#include <boost/mpl/if.hpp> #include <boost/mpl/begin.hpp> #include <boost/mpl/deref.hpp> #include <boost/mpl/next.hpp> @@ -89,14 +92,34 @@ static one value() { return one(); } }; -template<class Tag,class System1,class System2> struct base_unit_converter; +struct identity_conversion : trivial_conversion, implicitly_convertible {}; -/// base unit conversion from system to itself is a no-op -template<class Tag,class System1> -struct base_unit_converter<Tag, System1, System1> : - public implicitly_convertible, - public trivial_conversion -{ }; +struct define_reverse_automatically {}; + +struct undefined_conversion {}; + +template<class Converter> +struct reverse_conversion + : mpl::if_<is_base_and_derived<implicitly_convertible, Converter>, implicitly_convertible, undefined_conversion>::type { + typedef typename Converter::type type; + static type value() { + return(one()/Converter::value()); + } +}; + +template<class Dimension, class Tag1, class Tag2> +struct base_unit_converter : + mpl::eval_if<is_same<Tag1, Tag2>, + mpl::identity<identity_conversion>, + mpl::if_< + is_base_and_derived< + define_reverse_automatically, + base_unit_converter<Dimension,Tag2,Tag1> + >, + reverse_conversion<base_unit_converter<Dimension,Tag2,Tag1> >, + undefined_conversion + > + >::type {}; template<class Tag,class System1,class System2> struct base_unit_is_implicitly_convertible : |