diff --git a/.travis.yml b/.travis.yml index bd99c4f..9c1d6ff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,6 +28,7 @@ matrix: include: - os: linux + compiler: g++-4.7 env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=c++11 addons: apt: @@ -37,6 +38,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux + compiler: g++-4.8 env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=c++11 addons: apt: @@ -46,6 +48,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux + compiler: g++-4.9 env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=c++11 addons: apt: @@ -55,6 +58,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux + compiler: g++-5 env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++11 addons: apt: @@ -64,6 +68,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux + compiler: g++-5 env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++14 addons: apt: @@ -73,6 +78,17 @@ matrix: - ubuntu-toolchain-r-test - os: linux + compiler: g++-5 + env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++1z + addons: + apt: + packages: + - g++-5 + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: g++-6 env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++11 addons: apt: @@ -82,6 +98,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux + compiler: g++-6 env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++14 addons: apt: @@ -91,6 +108,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux + compiler: g++-6 env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++1z addons: apt: @@ -100,6 +118,40 @@ matrix: - ubuntu-toolchain-r-test - os: linux + dist: trusty + compiler: g++-7 + env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=c++11 + addons: + apt: + packages: + - g++-7 + sources: + - ubuntu-toolchain-r-test + + - os: linux + dist: trusty + compiler: g++-7 + env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=c++14 + addons: + apt: + packages: + - g++-7 + sources: + - ubuntu-toolchain-r-test + + - os: linux + dist: trusty + compiler: g++-7 + env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=c++1z + addons: + apt: + packages: + - g++-7 + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: clang++-3.5 env: TOOLSET=clang COMPILER=clang++-3.5 CXXSTD=c++11 addons: apt: @@ -110,6 +162,7 @@ matrix: - llvm-toolchain-precise-3.5 - os: linux + compiler: clang++-3.6 env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=c++11 addons: apt: @@ -120,6 +173,7 @@ matrix: - llvm-toolchain-precise-3.6 - os: linux + compiler: clang++-3.7 env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=c++11 addons: apt: @@ -130,6 +184,7 @@ matrix: - llvm-toolchain-precise-3.7 - os: linux + compiler: clang++-3.8 env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++11 addons: apt: @@ -140,6 +195,7 @@ matrix: - llvm-toolchain-precise-3.8 - os: linux + compiler: clang++-3.8 env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++14 addons: apt: @@ -150,6 +206,7 @@ matrix: - llvm-toolchain-precise-3.8 - os: linux + compiler: clang++-3.8 env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++1z addons: apt: @@ -160,6 +217,7 @@ matrix: - llvm-toolchain-precise-3.8 - os: linux + compiler: clang++-3.9 env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=c++11 addons: apt: @@ -170,6 +228,7 @@ matrix: - llvm-toolchain-precise-3.9 - os: linux + compiler: clang++-3.9 env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=c++14 addons: apt: @@ -180,6 +239,7 @@ matrix: - llvm-toolchain-precise-3.9 - os: linux + compiler: clang++-3.9 env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=c++1z addons: apt: @@ -189,13 +249,49 @@ matrix: - ubuntu-toolchain-r-test - llvm-toolchain-precise-3.9 + - os: linux + compiler: clang++-4.0 + env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=c++11 + addons: + apt: + packages: + - clang-4.0 + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-trusty-4.0 + + - os: linux + compiler: clang++-4.0 + env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=c++14 + addons: + apt: + packages: + - clang-4.0 + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-trusty-4.0 + + - os: linux + compiler: clang++-4.0 + env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=c++1z + addons: + apt: + packages: + - clang-4.0 + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-trusty-4.0 + - os: osx + compiler: clang++ env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++11 - os: osx + compiler: clang++ env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++14 - os: osx + compiler: clang++ env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++1z install: diff --git a/doc/html/mp11.html b/doc/html/mp11.html index 06276b0..2c2c378 100644 --- a/doc/html/mp11.html +++ b/doc/html/mp11.html @@ -2029,7 +2029,7 @@

mp_for_each<L>(f) calls - f with mp_identity<T>() for each element T + f with T() for each element T of the list L, in order.

@@ -2504,7 +2504,7 @@ - +

Last revised: May 25, 2017 at 18:31:25 GMT

Last revised: May 28, 2017 at 23:51:44 GMT


diff --git a/doc/mp11/algorithm.qbk b/doc/mp11/algorithm.qbk index 9f603f9..08f7a53 100644 --- a/doc/mp11/algorithm.qbk +++ b/doc/mp11/algorithm.qbk @@ -284,7 +284,7 @@ is `mp_size`. [section `mp_for_each(f)`] template constexpr F mp_for_each(F&& f); -`mp_for_each(f)` calls `f` with `mp_identity()` for each element `T` of the list `L`, in order. +`mp_for_each(f)` calls `f` with `T()` for each element `T` of the list `L`, in order. Returns `std::forward(f)`. [endsect] diff --git a/include/boost/mp11/algorithm.hpp b/include/boost/mp11/algorithm.hpp index 0f68974..5d27cba 100644 --- a/include/boost/mp11/algorithm.hpp +++ b/include/boost/mp11/algorithm.hpp @@ -325,8 +325,8 @@ template struct mp_at_c_impl } // namespace detail -template using mp_at_c = typename detail::mp_at_c_impl::type; -template using mp_at = typename detail::mp_at_c_impl::type; +template using mp_at_c = typename mp_if_c<(I < mp_size::value), detail::mp_at_c_impl, void>::type; +template using mp_at = mp_at_c; // mp_take(_c) namespace detail @@ -882,7 +882,7 @@ namespace detail template BOOST_CONSTEXPR F mp_for_each_impl( mp_list, F && f ) { using A = int[sizeof...(T)]; - return (void)A{ ((void)f(mp_identity()), 0)... }, std::forward(f); + return (void)A{ ((void)f(T()), 0)... }, std::forward(f); } #if BOOST_WORKAROUND( BOOST_MSVC, <= 1800 ) diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 2d6df0a..b086740 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -48,6 +48,7 @@ run mp_product.cpp : : : $(REQ) ; run mp_drop.cpp : : : $(REQ) ; run mp_iota.cpp : : : $(REQ) ; run mp_at.cpp : : : $(REQ) ; +run mp_at_sf.cpp : : : $(REQ) ; run mp_take.cpp : : : $(REQ) ; run mp_replace.cpp : : : $(REQ) ; run mp_replace_if.cpp : : : $(REQ) ; diff --git a/test/mp_at_sf.cpp b/test/mp_at_sf.cpp new file mode 100644 index 0000000..00463f9 --- /dev/null +++ b/test/mp_at_sf.cpp @@ -0,0 +1,39 @@ + +// Copyright 2015, 2017 Peter Dimov. +// +// 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 + + +#include +#include +#include +#include + +using boost::mp11::mp_valid; +using boost::mp11::mp_at; +using boost::mp11::mp_size_t; +using boost::mp11::mp_list; + +int main() +{ + BOOST_TEST_TRAIT_FALSE((mp_valid)); + BOOST_TEST_TRAIT_FALSE((mp_valid)); + BOOST_TEST_TRAIT_FALSE((mp_valid)); + BOOST_TEST_TRAIT_FALSE((mp_valid)); + + BOOST_TEST_TRAIT_FALSE((mp_valid>)); + + BOOST_TEST_TRAIT_FALSE((mp_valid, mp_size_t<0>>)); + + BOOST_TEST_TRAIT_TRUE((mp_valid, mp_size_t<0>>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, mp_size_t<1>>)); + + BOOST_TEST_TRAIT_TRUE((mp_valid, mp_size_t<0>>)); + BOOST_TEST_TRAIT_TRUE((mp_valid, mp_size_t<1>>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, mp_size_t<2>>)); + + return boost::report_errors(); +} diff --git a/test/mp_for_each.cpp b/test/mp_for_each.cpp index 31ad7c5..542493b 100644 --- a/test/mp_for_each.cpp +++ b/test/mp_for_each.cpp @@ -14,8 +14,6 @@ #include #include -using boost::mp11::mp_identity; - #if !defined( BOOST_NO_CXX14_CONSTEXPR ) # define CONSTEXPR14 constexpr #else @@ -26,9 +24,9 @@ struct F { int s; - CONSTEXPR14 void operator()( mp_identity ) { s = s * 10 + 1; } - CONSTEXPR14 void operator()( mp_identity ) { s = s * 10 + 2; } - CONSTEXPR14 void operator()( mp_identity ) { s = s * 10 + 3; } + CONSTEXPR14 void operator()( int ) { s = s * 10 + 1; } + CONSTEXPR14 void operator()( short ) { s = s * 10 + 2; } + CONSTEXPR14 void operator()( char ) { s = s * 10 + 3; } }; using boost::mp11::mp_list;