Add ListTagAppend and ListTagAppendUnique
This commit is contained in:
parent
55eafbafee
commit
ecb46023f6
@ -73,6 +73,22 @@ struct ListTagJoin : detail::ListRoot
|
|||||||
using list = typename detail::ListJoin<typename ListTag1::list, typename ListTag2::list>::type;
|
using list = typename detail::ListJoin<typename ListTag1::list, typename ListTag2::list>::type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/// A tag that is constructed by appending \c Type to \c ListTag.
|
||||||
|
template <typename ListTag, typename Type>
|
||||||
|
struct ListTagAppend : detail::ListRoot
|
||||||
|
{
|
||||||
|
using list = typename detail::ListJoin<typename ListTag::list, detail::ListBase<Type>>::type;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Append \c Type to \c ListTag only if \c ListTag does not already contain \c Type.
|
||||||
|
/// No checks are performed to see if \c ListTag itself has only unqiue elements.
|
||||||
|
template <typename ListTag, typename Type>
|
||||||
|
struct ListTagAppendUnique : detail::ListRoot
|
||||||
|
{
|
||||||
|
using list = typename detail::ListAppendUniqueImpl<typename ListTag::list, Type>::type;
|
||||||
|
};
|
||||||
|
|
||||||
/// A tag that consists of elements that are found in both tags. This struct
|
/// A tag that consists of elements that are found in both tags. This struct
|
||||||
/// can be subclassed and still behave like a list tag.
|
/// can be subclassed and still behave like a list tag.
|
||||||
template <typename ListTag1, typename ListTag2>
|
template <typename ListTag1, typename ListTag2>
|
||||||
|
@ -229,7 +229,14 @@ struct ListCrossProductImpl
|
|||||||
brigand::lazy::push_front<brigand::_1, brigand::parent<brigand::_1>>>>>>>>>>;
|
brigand::lazy::push_front<brigand::_1, brigand::parent<brigand::_1>>>>>>>>>>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
template <typename List, typename Type>
|
||||||
|
struct ListAppendUniqueImpl
|
||||||
|
{
|
||||||
|
using type = typename std::conditional<ListContainsImpl<Type, List>::value,
|
||||||
|
List,
|
||||||
|
typename ListJoin<List, ListBase<Type>>::type>::type;
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
|
@ -67,6 +67,18 @@ struct TestListTagUniversal : vtkm::ListTagUniversal
|
|||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct TestListTagAppend : vtkm::ListTagAppend<TestListTag3, TestClass<34>>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TestListTagAppendUnique1 : vtkm::ListTagAppendUnique<TestListTag3, TestClass<32>>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TestListTagAppendUnique2 : vtkm::ListTagAppendUnique<TestListTagAppendUnique1, TestClass<34>>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
template <int N, int M>
|
template <int N, int M>
|
||||||
std::pair<int, int> test_number(brigand::list<TestClass<N>, TestClass<M>>)
|
std::pair<int, int> test_number(brigand::list<TestClass<N>, TestClass<M>>)
|
||||||
{
|
{
|
||||||
@ -239,6 +251,15 @@ void TestLists()
|
|||||||
TryList(vtkm::Vec<std::pair<int, int>, 3>({ 31, 11 }, { 32, 11 }, { 33, 11 }),
|
TryList(vtkm::Vec<std::pair<int, int>, 3>({ 31, 11 }, { 32, 11 }, { 33, 11 }),
|
||||||
TestListTagCrossProduct());
|
TestListTagCrossProduct());
|
||||||
|
|
||||||
|
std::cout << "ListTagAppend" << std::endl;
|
||||||
|
TryList(vtkm::Vec<int, 4>(31, 32, 33, 34), TestListTagAppend());
|
||||||
|
|
||||||
|
std::cout << "ListTagAppendUnique1" << std::endl;
|
||||||
|
TryList(vtkm::Vec<int, 3>(31, 32, 33), TestListTagAppendUnique1());
|
||||||
|
|
||||||
|
std::cout << "ListTagAppendUnique2" << std::endl;
|
||||||
|
TryList(vtkm::Vec<int, 4>(31, 32, 33, 34), TestListTagAppendUnique2());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
std::cout << "ListTagUniversal" << std::endl;
|
std::cout << "ListTagUniversal" << std::endl;
|
||||||
|
Loading…
Reference in New Issue
Block a user