|
From: Steven W. <ste...@us...> - 2007-04-12 00:39:21
|
Update of /cvsroot/boost-sandbox/boost-sandbox/boost/units/detail In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv15994/boost-sandbox/boost/units/detail Modified Files: system_impl.hpp conversion_impl.hpp dimension_impl.hpp dim_impl.hpp Log Message: Switched metafunctions to mpl Index: conversion_impl.hpp =================================================================== RCS file: /cvsroot/boost-sandbox/boost-sandbox/boost/units/detail/conversion_impl.hpp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- conversion_impl.hpp 9 Apr 2007 18:35:01 -0000 1.5 +++ conversion_impl.hpp 12 Apr 2007 00:39:12 -0000 1.6 @@ -362,10 +362,14 @@ }; }; +struct heterogeneous_system_by_dimension_dim_tag {}; + // the hardest case: heterogeneous->heterogeneous template<class Tag, class Value> struct heterogeneous_system_by_dimension_dim { + typedef heterogeneous_system_by_dimension_dim type; + typedef heterogeneous_system_by_dimension_dim_tag tag; typedef Tag tag_type; typedef Value value_type; }; @@ -385,26 +389,56 @@ boost::mpl::true_ { }; -} +} // namespace detail -template<class T1, class V1, class V2> -struct static_add<detail::heterogeneous_system_by_dimension_dim<T1, V1>, detail::heterogeneous_system_by_dimension_dim<T1, V2> > +} // namespace units + +namespace mpl { + +template<> +struct plus_impl< + boost::units::detail::heterogeneous_system_by_dimension_dim_tag, + boost::units::detail::heterogeneous_system_by_dimension_dim_tag +> { - typedef detail::heterogeneous_system_by_dimension_dim<T1, typename detail::merge_dimensions<V1, V2>::type> type; + template<class T0, class T1> + struct apply { + BOOST_STATIC_ASSERT((boost::is_same<typename T0::tag_type, typename T1::tag_type>::value == true)); + typedef boost::units::detail::heterogeneous_system_by_dimension_dim< + typename T0::tag_type, + typename boost::units::detail::merge_dimensions< + typename T0::value_type, + typename T1::value_type + >::type + > type; + }; }; -template<class T1, class V1> -struct static_negate<detail::heterogeneous_system_by_dimension_dim<T1, V1> > +template<> +struct negate_impl<boost::units::detail::heterogeneous_system_by_dimension_dim_tag> { - typedef typename detail::static_inverse_impl<mpl::size<V1>::value>::template apply<typename mpl::begin<V1>::type>::type inverse; - typedef detail::heterogeneous_system_by_dimension_dim<T1, inverse> type; + template<class T0> + struct apply { + typedef typename boost::units::detail::static_inverse_impl<mpl::size<typename T0::value_type>::value>::template apply< + typename mpl::begin<typename T0::value_type>::type + >::type inverse; + typedef boost::units::detail::heterogeneous_system_by_dimension_dim<typename T0::tag_type, inverse> type; + }; }; +} // namespace mpl + +namespace units { + namespace detail { +struct heterogeneous_system_by_dimension_value_tag {}; + template<class SystemTag, class Value> struct heterogeneous_system_by_dimension_value { + typedef heterogeneous_system_by_dimension_value type; + typedef heterogeneous_system_by_dimension_value_tag tag; typedef SystemTag tag_type; typedef Value value_type; }; @@ -424,20 +458,41 @@ boost::mpl::true_ { }; -} +} // namespace detail -template<class T1, class V1, class V2> -struct static_add<detail::heterogeneous_system_by_dimension_value<T1, V1>, detail::heterogeneous_system_by_dimension_value<T1, V2> > +} // namespace units + +namespace mpl { + +template<> +struct plus_impl< + boost::units::detail::heterogeneous_system_by_dimension_value_tag, + boost::units::detail::heterogeneous_system_by_dimension_value_tag +> { - typedef detail::heterogeneous_system_by_dimension_value<T1, typename static_add<V1, V2>::type> type; + template<class T0, class T1> + struct apply { + BOOST_STATIC_ASSERT((boost::is_same<typename T0::tag_type, typename T1::tag_type>::value == true)); + typedef boost::units::detail::heterogeneous_system_by_dimension_value< + typename T0::tag_type, + typename plus<typename T0::value_type, typename T1::value_type>::type + > type; + }; }; -template<class T1, class V1> -struct static_negate<detail::heterogeneous_system_by_dimension_value<T1, V1> > +template<> +struct negate_impl<boost::units::detail::heterogeneous_system_by_dimension_value_tag> { - typedef detail::heterogeneous_system_by_dimension_value<T1, typename static_negate<V1>::type> type; + template<class T0> + struct apply { + typedef boost::units::detail::heterogeneous_system_by_dimension_value<typename T0::tag_type, typename negate<typename T0::value_type>::type> type; + }; }; +} // namespace mpl + +namespace units { + namespace detail { template<int N> Index: system_impl.hpp =================================================================== RCS file: /cvsroot/boost-sandbox/boost-sandbox/boost/units/detail/system_impl.hpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- system_impl.hpp 16 Mar 2007 18:12:44 -0000 1.1.1.1 +++ system_impl.hpp 12 Apr 2007 00:39:12 -0000 1.2 @@ -48,9 +48,17 @@ typedef Dimensions dimension_type; }; +namespace detail { + +struct heterogeneous_system_element_tag {}; + +} + template<class System, class Dimensions> struct heterogeneous_system_element { + typedef heterogeneous_system_element type; + typedef detail::heterogeneous_system_element_tag tag; typedef System tag_type; typedef Dimensions value_type; }; @@ -145,7 +153,7 @@ struct multiply_systems { typedef typename detail::merge_dimensions<typename S1::type, typename S2::type>::type type1; - typedef typename static_multiply<typename S1::dimension, typename S2::dimension>::type dimension; + typedef typename mpl::times<typename S1::dimension, typename S2::dimension>::type dimension; typedef typename make_system<mpl::size<type1>::value == 1>::template apply<type1,dimension>::type type; }; @@ -156,7 +164,7 @@ typedef typename detail::static_inverse_impl<mpl::size<s2>::value>::template apply<typename mpl::begin<s2>::type>::type inverse; typedef typename detail::merge_dimensions<typename S1::type, inverse>::type type1; - typedef typename static_divide<typename S1::dimension, typename S2::dimension>::type dimension; + typedef typename mpl::divides<typename S1::dimension, typename S2::dimension>::type dimension; typedef typename make_system<mpl::size<type1>::value == 1>::template apply<type1, dimension>::type type; }; Index: dim_impl.hpp =================================================================== RCS file: /cvsroot/boost-sandbox/boost-sandbox/boost/units/detail/dim_impl.hpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- dim_impl.hpp 16 Mar 2007 18:12:44 -0000 1.1.1.1 +++ dim_impl.hpp 12 Apr 2007 00:39:12 -0000 1.2 @@ -23,6 +23,12 @@ namespace units { +namespace detail { + +struct dim_tag {}; + +} + /// \brief Dimension tag/exponent pair for a single fundamental dimension. /// /// \detailed @@ -37,6 +43,8 @@ template<typename T,typename V> struct dim { + typedef dim type; + typedef detail::dim_tag tag; typedef T tag_type; typedef V value_type; }; Index: dimension_impl.hpp =================================================================== RCS file: /cvsroot/boost-sandbox/boost-sandbox/boost/units/detail/dimension_impl.hpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- dimension_impl.hpp 16 Mar 2007 18:12:44 -0000 1.1.1.1 +++ dimension_impl.hpp 12 Apr 2007 00:39:12 -0000 1.2 @@ -153,7 +153,7 @@ struct apply { typedef sort_dims_list< - typename static_add<T, typename Sequence::item>::type, + typename mpl::plus<T, typename Sequence::item>::type, typename Sequence::next > type; }; @@ -409,7 +409,7 @@ template<typename Begin1, typename Begin2, int N1, int N2> struct apply { - typedef typename static_add<typename boost::mpl::deref<Begin1>::type, typename boost::mpl::deref<Begin2>::type>::type combined; + typedef typename mpl::plus<typename boost::mpl::deref<Begin1>::type, typename boost::mpl::deref<Begin2>::type>::type combined; typedef typename push_front_if<!is_empty_dim<combined>::value>::template apply< typename merge_dimensions_impl<N1 - 1, N2 - 1>::template apply< typename boost::mpl::next<Begin1>::type, @@ -512,7 +512,7 @@ typename static_inverse_impl<N - 1>::template apply< typename boost::mpl::next<Begin>::type >::type, - typename static_negate<typename boost::mpl::deref<Begin>::type>::type + typename mpl::negate<typename boost::mpl::deref<Begin>::type>::type >::type type; }; }; @@ -535,7 +535,7 @@ { typedef typename mpl::push_front< typename detail::static_power_impl<N - 1>::template apply<typename mpl::next<Begin>::type, Ex>::type, - typename static_multiply<typename mpl::deref<Begin>::type, Ex>::type + typename mpl::times<typename mpl::deref<Begin>::type, Ex>::type >::type type; }; }; @@ -556,7 +556,7 @@ struct apply { typedef typename mpl::push_front< typename detail::static_root_impl<N - 1>::template apply<typename mpl::next<Begin>::type, Ex>::type, - typename static_divide<typename mpl::deref<Begin>::type, Ex>::type + typename mpl::divides<typename mpl::deref<Begin>::type, Ex>::type >::type type; }; }; |