Merge topic 'no-std-conditional-in-list-operations'

b534bdb1b Remove std::conditional from List.h

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: Robert Maynard <robert.maynard@kitware.com>
Merge-request: !1940
This commit is contained in:
Kenneth Moreland 2020-01-09 17:31:20 +00:00 committed by Kitware Robot
commit a5c686214b

@ -151,22 +151,70 @@ namespace detail
template <vtkm::IdComponent NumSearched, typename Target, typename... Remaining> template <vtkm::IdComponent NumSearched, typename Target, typename... Remaining>
struct FindFirstOfType; struct FindFirstOfType;
// Not found; // Not found
template <vtkm::IdComponent NumSearched, typename Target> template <vtkm::IdComponent NumSearched, typename Target>
struct FindFirstOfType<NumSearched, Target> : std::integral_constant<vtkm::IdComponent, -1> struct FindFirstOfType<NumSearched, Target> : std::integral_constant<vtkm::IdComponent, -1>
{ {
}; };
// Basic search next one // Basic search next one
template <bool NextIsTarget, vtkm::IdComponent NumSearched, typename Target, typename... Remaining>
struct FindFirstOfCheckHead;
template <vtkm::IdComponent NumSearched, typename Target, typename... Ts>
struct FindFirstOfCheckHead<true, NumSearched, Target, Ts...>
: std::integral_constant<vtkm::IdComponent, NumSearched>
{
};
template <vtkm::IdComponent NumSearched, typename Target, typename Next, typename... Remaining>
struct FindFirstOfCheckHead<false, NumSearched, Target, Next, Remaining...>
: FindFirstOfCheckHead<std::is_same<Target, Next>::value, NumSearched + 1, Target, Remaining...>
{
};
// Not found
template <vtkm::IdComponent NumSearched, typename Target>
struct FindFirstOfCheckHead<false, NumSearched, Target>
: std::integral_constant<vtkm::IdComponent, -1>
{
};
template <vtkm::IdComponent NumSearched, typename Target, typename Next, typename... Remaining> template <vtkm::IdComponent NumSearched, typename Target, typename Next, typename... Remaining>
struct FindFirstOfType<NumSearched, Target, Next, Remaining...> struct FindFirstOfType<NumSearched, Target, Next, Remaining...>
: std::conditional<std::is_same<Target, Next>::value, : FindFirstOfCheckHead<std::is_same<Target, Next>::value, NumSearched, Target, Remaining...>
std::integral_constant<vtkm::IdComponent, NumSearched>,
FindFirstOfType<NumSearched + 1, Target, Remaining...>>::type
{ {
}; };
// If there are at least 6 entries, check the first 4 to quickly narrow down // If there are at least 6 entries, check the first 4 to quickly narrow down
template <bool OneInFirst4Matches, vtkm::IdComponent NumSearched, typename Target, typename... Ts>
struct FindFirstOfSplit4;
template <vtkm::IdComponent NumSearched,
typename Target,
typename T0,
typename T1,
typename T2,
typename T3,
typename... Ts>
struct FindFirstOfSplit4<true, NumSearched, Target, T0, T1, T2, T3, Ts...>
: FindFirstOfCheckHead<std::is_same<Target, T0>::value, NumSearched, Target, T1, T2, T3>
{
};
template <vtkm::IdComponent NumSearched,
typename Target,
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
typename... Ts>
struct FindFirstOfSplit4<false, NumSearched, Target, T0, T1, T2, T3, T4, Ts...>
: FindFirstOfCheckHead<std::is_same<Target, T4>::value, NumSearched + 4, Target, Ts...>
{
};
template <vtkm::IdComponent NumSearched, template <vtkm::IdComponent NumSearched,
typename Target, typename Target,
typename T0, typename T0,
@ -176,16 +224,70 @@ template <vtkm::IdComponent NumSearched,
typename T4, typename T4,
typename T5, typename T5,
typename... Ts> typename... Ts>
struct FindFirstOfType<NumSearched, Target, T0, T1, T2, T3, T3, T4, T5, Ts...> struct FindFirstOfType<NumSearched, Target, T0, T1, T2, T3, T4, T5, Ts...>
: std::conditional<(std::is_same<Target, T0>::value || std::is_same<Target, T1>::value || : FindFirstOfSplit4<(std::is_same<Target, T0>::value || std::is_same<Target, T1>::value ||
std::is_same<Target, T2>::value || std::is_same<Target, T2>::value ||
std::is_same<Target, T3>::value), std::is_same<Target, T3>::value),
FindFirstOfType<NumSearched, Target, T0, T1, T2, T3>, NumSearched,
FindFirstOfType<NumSearched + 4, Target, T4, T5, Ts...>>::type Target,
T0,
T1,
T2,
T3,
T4,
T5,
Ts...>
{ {
}; };
// If there are at least 12 entries, check the first 8 to quickly narrow down // If there are at least 12 entries, check the first 8 to quickly narrow down
template <bool OneInFirst8Matches, vtkm::IdComponent NumSearched, typename Target, typename... Ts>
struct FindFirstOfSplit8;
template <vtkm::IdComponent NumSearched,
typename Target,
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6,
typename T7,
typename... Ts>
struct FindFirstOfSplit8<true, NumSearched, Target, T0, T1, T2, T3, T4, T5, T6, T7, Ts...>
: FindFirstOfSplit4<(std::is_same<Target, T0>::value || std::is_same<Target, T1>::value ||
std::is_same<Target, T2>::value ||
std::is_same<Target, T3>::value),
NumSearched,
Target,
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7>
{
};
template <vtkm::IdComponent NumSearched,
typename Target,
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6,
typename T7,
typename... Ts>
struct FindFirstOfSplit8<false, NumSearched, Target, T0, T1, T2, T3, T4, T5, T6, T7, Ts...>
: FindFirstOfType<NumSearched + 8, Target, Ts...>
{
};
template <vtkm::IdComponent NumSearched, template <vtkm::IdComponent NumSearched,
typename Target, typename Target,
typename T0, typename T0,
@ -201,31 +303,29 @@ template <vtkm::IdComponent NumSearched,
typename T10, typename T10,
typename T11, typename T11,
typename... Ts> typename... Ts>
struct FindFirstOfType<NumSearched, struct FindFirstOfType<NumSearched, Target, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, Ts...>
Target, : FindFirstOfSplit8<(std::is_same<Target, T0>::value || std::is_same<Target, T1>::value ||
T0, std::is_same<Target, T2>::value ||
T1, std::is_same<Target, T3>::value ||
T2, std::is_same<Target, T4>::value ||
T3, std::is_same<Target, T5>::value ||
T3, std::is_same<Target, T6>::value ||
T4, std::is_same<Target, T7>::value),
T5, NumSearched,
T6, Target,
T7, T0,
T8, T1,
T9, T2,
T10, T3,
T11, T4,
Ts...> T5,
: std::conditional<(std::is_same<Target, T0>::value || std::is_same<Target, T1>::value || T6,
std::is_same<Target, T2>::value || T7,
std::is_same<Target, T3>::value || T8,
std::is_same<Target, T4>::value || T9,
std::is_same<Target, T5>::value || T10,
std::is_same<Target, T6>::value || T11,
std::is_same<Target, T7>::value), Ts...>
FindFirstOfType<NumSearched, Target, T0, T1, T2, T3, T4, T5, T6, T7>,
FindFirstOfType<NumSearched + 4, Target, T8, T9, T10, T11, Ts...>>::type
{ {
}; };
@ -308,12 +408,25 @@ using ListAppend = brigand::append<internal::AsList<Lists>...>;
namespace detail namespace detail
{ {
template <bool Has, typename State, typename Element>
struct ListIntersectTagsChoose;
template <typename State, typename Element>
struct ListIntersectTagsChoose<true, State, Element>
{
using type = brigand::push_back<State, Element>;
};
template <typename State, typename Element>
struct ListIntersectTagsChoose<false, State, Element>
{
using type = State;
};
template <class State, class Element, class List> template <class State, class Element, class List>
struct ListIntersectTags struct ListIntersectTags
: ListIntersectTagsChoose<vtkm::ListHas<List, Element>::value, State, Element>
{ {
using has_u = vtkm::ListHas<List, Element>;
using type =
typename std::conditional<has_u::value, brigand::push_back<State, Element>, State>::type;
}; };
template <typename List1, typename List2> template <typename List1, typename List2>