From 483eb2f56657e8e7f419ab1a4fab8dce9ade8609 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 27 Apr 2024 20:24:20 +0200 Subject: Adding upstream version 14.2.21. Signed-off-by: Daniel Baumann --- src/boost/libs/mpl/test/numeric_ops.cpp | 155 ++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 src/boost/libs/mpl/test/numeric_ops.cpp (limited to 'src/boost/libs/mpl/test/numeric_ops.cpp') diff --git a/src/boost/libs/mpl/test/numeric_ops.cpp b/src/boost/libs/mpl/test/numeric_ops.cpp new file mode 100644 index 00000000..453b4aab --- /dev/null +++ b/src/boost/libs/mpl/test/numeric_ops.cpp @@ -0,0 +1,155 @@ + +// Copyright Aleksey Gurtovoy 2003-2004 +// +// 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) +// +// See http://www.boost.org/libs/mpl for documentation. + +// $Id$ +// $Date$ +// $Revision$ + +#include +#include +#include +#include +#include +#include + +struct complex_tag : int_<10> {}; + +template< typename Re, typename Im > struct complex +{ + typedef complex_tag tag; + typedef complex type; + typedef Re real; + typedef Im imag; +}; + +template< typename C > struct real : C::real {}; +template< typename C > struct imag : C::imag {}; + +namespace boost { namespace mpl { + +template<> struct BOOST_MPL_AUX_NUMERIC_CAST< integral_c_tag,complex_tag > +{ + template< typename N > struct apply + : complex< N, integral_c< typename N::value_type, 0 > > + { + }; +}; + +template<> +struct plus_impl< complex_tag,complex_tag > +{ + template< typename N1, typename N2 > struct apply + : complex< + plus< typename N1::real, typename N2::real > + , plus< typename N1::imag, typename N2::imag > + > + { + }; +}; + +template<> +struct times_impl< complex_tag,complex_tag > +{ + template< typename N1, typename N2 > struct apply + : complex< + minus< + times< typename N1::real, typename N2::real > + , times< typename N1::imag, typename N2::imag > + > + , plus< + times< typename N1::real, typename N2::imag > + , times< typename N1::imag, typename N2::real > + > + > + { + }; +}; + +template<> +struct equal_to_impl< complex_tag,complex_tag > +{ + template< typename N1, typename N2 > struct apply + : and_< + equal_to< typename N1::real, typename N2::real > + , equal_to< typename N1::imag, typename N2::imag > + > + { + }; +}; + +}} + + +typedef int_<2> i; +typedef complex< int_<5>, int_<-1> > c1; +typedef complex< int_<-5>, int_<1> > c2; + +MPL_TEST_CASE() +{ + typedef plus::type r1; + MPL_ASSERT_RELATION( real::value, ==, 0 ); + MPL_ASSERT_RELATION( imag::value, ==, 0 ); + + typedef plus::type r2; + MPL_ASSERT_RELATION( real::value, ==, 10 ); + MPL_ASSERT_RELATION( imag::value, ==, -2 ); + + typedef plus::type r3; + MPL_ASSERT_RELATION( real::value, ==, -10 ); + MPL_ASSERT_RELATION( imag::value, ==, 2 ); + +#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300) + typedef plus::type r4; + MPL_ASSERT_RELATION( real::value, ==, 7 ); + MPL_ASSERT_RELATION( imag::value, ==, -1 ); + + typedef plus::type r5; + MPL_ASSERT_RELATION( real::value, ==, -3 ); + MPL_ASSERT_RELATION( imag::value, ==, 1 ); +#endif +} + +MPL_TEST_CASE() +{ + typedef times::type r1; + MPL_ASSERT_RELATION( real::value, ==, -24 ); + MPL_ASSERT_RELATION( imag::value, ==, 10 ); + + typedef times::type r2; + MPL_ASSERT_RELATION( real::value, ==, 24 ); + MPL_ASSERT_RELATION( imag::value, ==, -10 ); + + typedef times::type r3; + MPL_ASSERT_RELATION( real::value, ==, 24 ); + MPL_ASSERT_RELATION( imag::value, ==, -10 ); + +#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300) + typedef times::type r4; + MPL_ASSERT_RELATION( real::value, ==, 10 ); + MPL_ASSERT_RELATION( imag::value, ==, -2 ); + + typedef times::type r5; + MPL_ASSERT_RELATION( real::value, ==, -10 ); + MPL_ASSERT_RELATION( imag::value, ==, 2 ); +#endif +} + +MPL_TEST_CASE() +{ + MPL_ASSERT(( equal_to )); + MPL_ASSERT(( equal_to )); + MPL_ASSERT_NOT(( equal_to )); + + MPL_ASSERT(( equal_to, long_<-1> > > )); + +#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300) + MPL_ASSERT_NOT(( equal_to )); + MPL_ASSERT_NOT(( equal_to )); +#endif +} -- cgit v1.2.3