From 1170808e188d6db8524c731a1543074a1ae4a845 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Sat, 27 May 2017 16:18:49 +0300 Subject: [PATCH 1/7] Add clang-4.0 to Travis --- .travis.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.travis.yml b/.travis.yml index bd99c4f..908ed99 100644 --- a/.travis.yml +++ b/.travis.yml @@ -189,6 +189,17 @@ 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: osx env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++11 From dbfa5dd5fb094ae33f279a16badedc11a9db1a3c Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Sat, 27 May 2017 16:38:29 +0300 Subject: [PATCH 2/7] Add compiler: to Travis; add clang-4 for 14/1z --- .travis.yml | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/.travis.yml b/.travis.yml index 908ed99..b01d5d9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,6 +28,7 @@ matrix: include: - os: linux + compiler: gcc-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: gcc-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: gcc-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: gcc-5 env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++11 addons: apt: @@ -64,6 +68,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux + compiler: gcc-5 env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++14 addons: apt: @@ -73,6 +78,17 @@ matrix: - ubuntu-toolchain-r-test - os: linux + compiler: gcc-5 + env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++1z + addons: + apt: + packages: + - g++-5 + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: gcc-6 env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++11 addons: apt: @@ -82,6 +98,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux + compiler: gcc-6 env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++14 addons: apt: @@ -91,6 +108,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux + compiler: gcc-6 env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++1z addons: apt: @@ -100,6 +118,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux + compiler: clang-3.5 env: TOOLSET=clang COMPILER=clang++-3.5 CXXSTD=c++11 addons: apt: @@ -110,6 +129,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 +140,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 +151,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 +162,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 +173,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 +184,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 +195,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 +206,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: @@ -200,13 +227,38 @@ matrix: - 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: From 0bdb46c59bec9a47ef8ad5cc17109b3cf2850e84 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Sat, 27 May 2017 17:31:56 +0300 Subject: [PATCH 3/7] Add gcc-7 to Travis --- .travis.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.travis.yml b/.travis.yml index b01d5d9..773bde8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -117,6 +117,16 @@ matrix: sources: - ubuntu-toolchain-r-test + - os: linux + compiler: g++-7 + env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=c++11 + 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 From daec21ea02f181c7fd35a01f07ca7517fd0d70a9 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Sat, 27 May 2017 17:41:47 +0300 Subject: [PATCH 4/7] Try gcc-7 again, on trusty this time --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 773bde8..286df03 100644 --- a/.travis.yml +++ b/.travis.yml @@ -118,6 +118,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux + dist: trusty compiler: g++-7 env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=c++11 addons: From 75f7f442fab2adbb6b95c2dc9400b84fc91ef2b4 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Sat, 27 May 2017 18:08:07 +0300 Subject: [PATCH 5/7] Change compiler: to g++; add 14/1z to gcc-7 --- .travis.yml | 70 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 24 deletions(-) diff --git a/.travis.yml b/.travis.yml index 286df03..9c1d6ff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,7 +28,7 @@ matrix: include: - os: linux - compiler: gcc-4.7 + compiler: g++-4.7 env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=c++11 addons: apt: @@ -38,7 +38,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux - compiler: gcc-4.8 + compiler: g++-4.8 env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=c++11 addons: apt: @@ -48,7 +48,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux - compiler: gcc-4.9 + compiler: g++-4.9 env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=c++11 addons: apt: @@ -58,7 +58,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux - compiler: gcc-5 + compiler: g++-5 env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++11 addons: apt: @@ -68,7 +68,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux - compiler: gcc-5 + compiler: g++-5 env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++14 addons: apt: @@ -78,7 +78,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux - compiler: gcc-5 + compiler: g++-5 env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++1z addons: apt: @@ -88,7 +88,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux - compiler: gcc-6 + compiler: g++-6 env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++11 addons: apt: @@ -98,7 +98,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux - compiler: gcc-6 + compiler: g++-6 env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++14 addons: apt: @@ -108,7 +108,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux - compiler: gcc-6 + compiler: g++-6 env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++1z addons: apt: @@ -129,7 +129,29 @@ matrix: - ubuntu-toolchain-r-test - os: linux - compiler: clang-3.5 + 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: @@ -140,7 +162,7 @@ matrix: - llvm-toolchain-precise-3.5 - os: linux - compiler: clang-3.6 + compiler: clang++-3.6 env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=c++11 addons: apt: @@ -151,7 +173,7 @@ matrix: - llvm-toolchain-precise-3.6 - os: linux - compiler: clang-3.7 + compiler: clang++-3.7 env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=c++11 addons: apt: @@ -162,7 +184,7 @@ matrix: - llvm-toolchain-precise-3.7 - os: linux - compiler: clang-3.8 + compiler: clang++-3.8 env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++11 addons: apt: @@ -173,7 +195,7 @@ matrix: - llvm-toolchain-precise-3.8 - os: linux - compiler: clang-3.8 + compiler: clang++-3.8 env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++14 addons: apt: @@ -184,7 +206,7 @@ matrix: - llvm-toolchain-precise-3.8 - os: linux - compiler: clang-3.8 + compiler: clang++-3.8 env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++1z addons: apt: @@ -195,7 +217,7 @@ matrix: - llvm-toolchain-precise-3.8 - os: linux - compiler: clang-3.9 + compiler: clang++-3.9 env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=c++11 addons: apt: @@ -206,7 +228,7 @@ matrix: - llvm-toolchain-precise-3.9 - os: linux - compiler: clang-3.9 + compiler: clang++-3.9 env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=c++14 addons: apt: @@ -217,7 +239,7 @@ matrix: - llvm-toolchain-precise-3.9 - os: linux - compiler: clang-3.9 + compiler: clang++-3.9 env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=c++1z addons: apt: @@ -228,7 +250,7 @@ matrix: - llvm-toolchain-precise-3.9 - os: linux - compiler: clang-4.0 + compiler: clang++-4.0 env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=c++11 addons: apt: @@ -239,7 +261,7 @@ matrix: - llvm-toolchain-trusty-4.0 - os: linux - compiler: clang-4.0 + compiler: clang++-4.0 env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=c++14 addons: apt: @@ -250,7 +272,7 @@ matrix: - llvm-toolchain-trusty-4.0 - os: linux - compiler: clang-4.0 + compiler: clang++-4.0 env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=c++1z addons: apt: @@ -261,15 +283,15 @@ matrix: - llvm-toolchain-trusty-4.0 - os: osx - compiler: clang + compiler: clang++ env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++11 - os: osx - compiler: clang + compiler: clang++ env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++14 - os: osx - compiler: clang + compiler: clang++ env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++1z install: From c7923ca0418f00fe4647891eb377f21f89cdb5b7 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Mon, 29 May 2017 03:04:12 +0300 Subject: [PATCH 6/7] Change back mp_for_each to not use mp_identity --- doc/html/mp11.html | 4 ++-- doc/mp11/algorithm.qbk | 2 +- include/boost/mp11/algorithm.hpp | 2 +- test/mp_for_each.cpp | 8 +++----- 4 files changed, 7 insertions(+), 9 deletions(-) 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..d33b248 100644 --- a/include/boost/mp11/algorithm.hpp +++ b/include/boost/mp11/algorithm.hpp @@ -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/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; From f6d92069a9f75f5211fc0b44ded2d2241f9e2d38 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Mon, 29 May 2017 05:56:55 +0300 Subject: [PATCH 7/7] Make mp_at SFINAE-friendly --- include/boost/mp11/algorithm.hpp | 4 ++-- test/Jamfile.v2 | 1 + test/mp_at_sf.cpp | 39 ++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 test/mp_at_sf.cpp diff --git a/include/boost/mp11/algorithm.hpp b/include/boost/mp11/algorithm.hpp index d33b248..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 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(); +}