forked from boostorg/variant2
Finish C++11 port
This commit is contained in:
46
.travis.yml
46
.travis.yml
@ -24,9 +24,23 @@ matrix:
|
|||||||
- env: BOGUS_JOB=true
|
- env: BOGUS_JOB=true
|
||||||
|
|
||||||
include:
|
include:
|
||||||
|
- os: linux
|
||||||
|
compiler: g++
|
||||||
|
env: TOOLSET=gcc COMPILER=g++ CXXSTD=11
|
||||||
|
|
||||||
|
- os: linux
|
||||||
|
compiler: g++-4.9
|
||||||
|
env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=11
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- g++-4.9
|
||||||
|
sources:
|
||||||
|
- ubuntu-toolchain-r-test
|
||||||
|
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: g++-5
|
compiler: g++-5
|
||||||
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=14,1z
|
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=11,14,1z
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
@ -36,7 +50,7 @@ matrix:
|
|||||||
|
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: g++-6
|
compiler: g++-6
|
||||||
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=14,1z
|
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=11,14,1z
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
@ -46,7 +60,7 @@ matrix:
|
|||||||
|
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: g++-7
|
compiler: g++-7
|
||||||
env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=14,17
|
env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=11,14,17
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
@ -56,7 +70,7 @@ matrix:
|
|||||||
|
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: g++-8
|
compiler: g++-8
|
||||||
env: TOOLSET=gcc COMPILER=g++-8 CXXSTD=14,17
|
env: TOOLSET=gcc COMPILER=g++-8 CXXSTD=11,14,17
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
@ -66,7 +80,7 @@ matrix:
|
|||||||
|
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: g++-8
|
compiler: g++-8
|
||||||
env: UBSAN=1 TOOLSET=gcc COMPILER=g++-8 CXXSTD=14,17 UBSAN_OPTIONS=print_stacktrace=1 LINKFLAGS=-fuse-ld=gold
|
env: UBSAN=1 TOOLSET=gcc COMPILER=g++-8 CXXSTD=11,14,17 UBSAN_OPTIONS=print_stacktrace=1 LINKFLAGS=-fuse-ld=gold
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
@ -76,7 +90,7 @@ matrix:
|
|||||||
|
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: clang++-3.5
|
compiler: clang++-3.5
|
||||||
env: TOOLSET=clang COMPILER=clang++-3.5 CXXSTD=14,1z
|
env: TOOLSET=clang COMPILER=clang++-3.5 CXXSTD=11,14,1z
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
@ -88,7 +102,7 @@ matrix:
|
|||||||
|
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: clang++-3.6
|
compiler: clang++-3.6
|
||||||
env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=14,1z
|
env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=11,14,1z
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
@ -99,7 +113,7 @@ matrix:
|
|||||||
|
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: clang++-3.7
|
compiler: clang++-3.7
|
||||||
env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=14,1z
|
env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=11,14,1z
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
@ -110,7 +124,7 @@ matrix:
|
|||||||
|
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: clang++-3.8
|
compiler: clang++-3.8
|
||||||
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=14,1z
|
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=11,14,1z
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
@ -121,7 +135,7 @@ matrix:
|
|||||||
|
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: clang++-3.9
|
compiler: clang++-3.9
|
||||||
env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=14,1z
|
env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=11,14,1z
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
@ -132,7 +146,7 @@ matrix:
|
|||||||
|
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: clang++-4.0
|
compiler: clang++-4.0
|
||||||
env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=14,1z
|
env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=11,14,1z
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
@ -143,7 +157,7 @@ matrix:
|
|||||||
|
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: clang++-5.0
|
compiler: clang++-5.0
|
||||||
env: TOOLSET=clang COMPILER=clang++-5.0 CXXSTD=14,1z
|
env: TOOLSET=clang COMPILER=clang++-5.0 CXXSTD=11,14,1z
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
@ -154,7 +168,7 @@ matrix:
|
|||||||
|
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: clang++-6.0
|
compiler: clang++-6.0
|
||||||
env: TOOLSET=clang COMPILER=clang++-6.0 CXXSTD=14,17
|
env: TOOLSET=clang COMPILER=clang++-6.0 CXXSTD=11,14,17
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
@ -165,7 +179,7 @@ matrix:
|
|||||||
|
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: clang++-6.0
|
compiler: clang++-6.0
|
||||||
env: UBSAN=1 TOOLSET=clang COMPILER=clang++-6.0 CXXSTD=14,1z UBSAN_OPTIONS=print_stacktrace=1
|
env: UBSAN=1 TOOLSET=clang COMPILER=clang++-6.0 CXXSTD=11,14,1z UBSAN_OPTIONS=print_stacktrace=1
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
@ -184,7 +198,7 @@ matrix:
|
|||||||
|
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: clang++-libc++
|
compiler: clang++-libc++
|
||||||
env: UBSAN=1 TOOLSET=clang COMPILER=clang++-libc++ CXXSTD=14,1z UBSAN_OPTIONS=print_stacktrace=1
|
env: UBSAN=1 TOOLSET=clang COMPILER=clang++-libc++ CXXSTD=11,14,1z UBSAN_OPTIONS=print_stacktrace=1
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
@ -192,7 +206,7 @@ matrix:
|
|||||||
|
|
||||||
- os: osx
|
- os: osx
|
||||||
compiler: clang++
|
compiler: clang++
|
||||||
env: TOOLSET=clang COMPILER=clang++ CXXSTD=14,1z
|
env: TOOLSET=clang COMPILER=clang++ CXXSTD=11,14,1z
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- BOOST_BRANCH=develop && [ "$TRAVIS_BRANCH" == "master" ] && BOOST_BRANCH=master || true
|
- BOOST_BRANCH=develop && [ "$TRAVIS_BRANCH" == "master" ] && BOOST_BRANCH=master || true
|
||||||
|
@ -1503,36 +1503,97 @@ template<class F, class V1> constexpr auto visit( F&& f, V1&& v1 ) -> variant2::
|
|||||||
return mp_with_index<variant2::detail::var_size<V1>>( v1.index(), detail::visit_L1<F, V1>{ std::forward<F>(f), std::forward<V1>(v1) } );
|
return mp_with_index<variant2::detail::var_size<V1>>( v1.index(), detail::visit_L1<F, V1>{ std::forward<F>(f), std::forward<V1>(v1) } );
|
||||||
}
|
}
|
||||||
|
|
||||||
#if BOOST_WORKAROUND( BOOST_MSVC, < 1920 )
|
#if defined(BOOST_NO_CXX14_GENERIC_LAMBDAS) || BOOST_WORKAROUND( BOOST_MSVC, < 1920 )
|
||||||
|
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
|
||||||
|
template<class F, class A> struct bind_front_
|
||||||
|
{
|
||||||
|
F&& f;
|
||||||
|
A&& a;
|
||||||
|
|
||||||
|
template<class... T> auto operator()( T&&... t ) -> decltype( std::forward<F>(f)( std::forward<A>(a), std::forward<T>(t)... ) )
|
||||||
|
{
|
||||||
|
return std::forward<F>(f)( std::forward<A>(a), std::forward<T>(t)... );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<class F, class A> bind_front_<F, A> bind_front( F&& f, A&& a )
|
||||||
|
{
|
||||||
|
return bind_front_<F, A>{ std::forward<F>(f), std::forward<A>(a) };
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class F, class V1, class V2> struct visit_L2
|
||||||
|
{
|
||||||
|
F&& f;
|
||||||
|
|
||||||
|
V1&& v1;
|
||||||
|
V2&& v2;
|
||||||
|
|
||||||
|
template<class I> auto operator()( I ) const -> Vret<F, V1, V2>
|
||||||
|
{
|
||||||
|
auto f2 = bind_front( std::forward<F>(f), get<I::value>( std::forward<V1>(v1) ) );
|
||||||
|
return visit( f2, std::forward<V2>(v2) );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
template<class F, class V1, class V2> constexpr auto visit( F&& f, V1&& v1, V2&& v2 ) -> variant2::detail::Vret<F, V1, V2>
|
template<class F, class V1, class V2> constexpr auto visit( F&& f, V1&& v1, V2&& v2 ) -> variant2::detail::Vret<F, V1, V2>
|
||||||
{
|
{
|
||||||
return mp_with_index<variant2::detail::var_size<V1>>( v1.index(), [&]( auto I ){
|
return mp_with_index<variant2::detail::var_size<V1>>( v1.index(), detail::visit_L2<F, V1, V2>{ std::forward<F>(f), std::forward<V1>(v1), std::forward<V2>(v2) } );
|
||||||
|
|
||||||
auto f2 = [&]( auto&&... a ){ return std::forward<F>(f)( get<I.value>( std::forward<V1>(v1) ), std::forward<decltype(a)>(a)... ); };
|
|
||||||
return visit( f2, std::forward<V2>(v2) );
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
|
||||||
|
template<class F, class V1, class V2, class V3> struct visit_L3
|
||||||
|
{
|
||||||
|
F&& f;
|
||||||
|
|
||||||
|
V1&& v1;
|
||||||
|
V2&& v2;
|
||||||
|
V3&& v3;
|
||||||
|
|
||||||
|
template<class I> auto operator()( I ) const -> Vret<F, V1, V2, V3>
|
||||||
|
{
|
||||||
|
auto f2 = bind_front( std::forward<F>(f), get<I::value>( std::forward<V1>(v1) ) );
|
||||||
|
return visit( f2, std::forward<V2>(v2), std::forward<V3>(v3) );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
template<class F, class V1, class V2, class V3> constexpr auto visit( F&& f, V1&& v1, V2&& v2, V3&& v3 ) -> variant2::detail::Vret<F, V1, V2, V3>
|
template<class F, class V1, class V2, class V3> constexpr auto visit( F&& f, V1&& v1, V2&& v2, V3&& v3 ) -> variant2::detail::Vret<F, V1, V2, V3>
|
||||||
{
|
{
|
||||||
return mp_with_index<variant2::detail::var_size<V1>>( v1.index(), [&]( auto I ){
|
return mp_with_index<variant2::detail::var_size<V1>>( v1.index(), detail::visit_L3<F, V1, V2, V3>{ std::forward<F>(f), std::forward<V1>(v1), std::forward<V2>(v2), std::forward<V3>(v3) } );
|
||||||
|
|
||||||
auto f2 = [&]( auto&&... a ){ return std::forward<F>(f)( get<I.value>( std::forward<V1>(v1) ), std::forward<decltype(a)>(a)... ); };
|
|
||||||
return visit( f2, std::forward<V2>(v2), std::forward<V3>(v3) );
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
|
||||||
|
template<class F, class V1, class V2, class V3, class V4> struct visit_L4
|
||||||
|
{
|
||||||
|
F&& f;
|
||||||
|
|
||||||
|
V1&& v1;
|
||||||
|
V2&& v2;
|
||||||
|
V3&& v3;
|
||||||
|
V4&& v4;
|
||||||
|
|
||||||
|
template<class I> auto operator()( I ) const -> Vret<F, V1, V2, V3, V4>
|
||||||
|
{
|
||||||
|
auto f2 = bind_front( std::forward<F>(f), get<I::value>( std::forward<V1>(v1) ) );
|
||||||
|
return visit( f2, std::forward<V2>(v2), std::forward<V3>(v3), std::forward<V4>(v4) );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
template<class F, class V1, class V2, class V3, class V4> constexpr auto visit( F&& f, V1&& v1, V2&& v2, V3&& v3, V4&& v4 ) -> variant2::detail::Vret<F, V1, V2, V3, V4>
|
template<class F, class V1, class V2, class V3, class V4> constexpr auto visit( F&& f, V1&& v1, V2&& v2, V3&& v3, V4&& v4 ) -> variant2::detail::Vret<F, V1, V2, V3, V4>
|
||||||
{
|
{
|
||||||
return mp_with_index<variant2::detail::var_size<V1>>( v1.index(), [&]( auto I ){
|
return mp_with_index<variant2::detail::var_size<V1>>( v1.index(), detail::visit_L4<F, V1, V2, V3, V4>{ std::forward<F>(f), std::forward<V1>(v1), std::forward<V2>(v2), std::forward<V3>(v3), std::forward<V4>(v4) } );
|
||||||
|
|
||||||
auto f2 = [&]( auto&&... a ){ return std::forward<F>(f)( get<I.value>( std::forward<V1>(v1) ), std::forward<decltype(a)>(a)... ); };
|
|
||||||
return visit( f2, std::forward<V2>(v2), std::forward<V3>(v3), std::forward<V4>(v4) );
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
Reference in New Issue
Block a user