// Copyright Alain Miniussi 2014. // 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) // Authors: Alain Miniussi #include #include #include #include #include #include #include #include #include #include #include #include #define BOOST_TEST_MODULE mpi_cartesian_topology_init #include namespace mpi = boost::mpi; BOOST_AUTO_TEST_CASE(cartesian_dimension_init) { // Curly brace initialization syntax not supported on (very) old gnu // This typedef keeps things shorter typedef mpi::cartesian_dimension cd; { // Check the basic ctor mpi::cartesian_dimension def; mpi::cartesian_topology t1(10); BOOST_CHECK(t1.stl() == std::vector(10, def)); } #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) { // Intializer list ctor vs range based int dims[] = {2,3,4}; bool per[] = {true, false, true}; mpi::cartesian_topology t1(dims, per); mpi::cartesian_topology t2({{2,true},{3, false},{4, true}}); BOOST_CHECK(t1.size() == 3); BOOST_CHECK(t1 == t2); } #endif // Container based ctor only available as a replacement for initializer list ctor { // seq ctor vs C array ctor mpi::cartesian_dimension d[] = {cd(2,true),cd(3, false),cd(4, true)}; std::list seq; std::copy(d, d+3, std::back_inserter(seq)); mpi::cartesian_topology t1(seq); mpi::cartesian_topology t2(d); BOOST_CHECK(t1 == t2); } { // Check range based with array based ctor. boost::array d = {{cd(2,true),cd(3, false),cd(4, true)}}; int dims[] = {2,3,4}; bool per[] = {true, false, true}; mpi::cartesian_topology t1(dims, per); mpi::cartesian_topology t2(d); BOOST_CHECK(t1.size() == 3); BOOST_CHECK(t1 == t2); } { // Iterator based ctor vs C array based ctor mpi::cartesian_dimension d[] = {cd(2,true),cd(3, false),cd(4, true)}; std::vector vdims(d, d+3); mpi::cartesian_topology t1(vdims); mpi::cartesian_topology t2(d); BOOST_CHECK(t1.size() == 3); BOOST_CHECK(t1 == t2); BOOST_CHECK(!(t1 != t2)); t1[1].periodic = true; BOOST_CHECK(t1 != t2); t1[2].periodic = false; t1[2].size = 0; vdims.push_back(mpi::cartesian_dimension(3, false)); mpi::cartesian_topology t3(vdims); BOOST_CHECK(t1 != t3); } }