Add ListTagAppend and ListTagAppendUnique

This commit is contained in:
Sujin Philip 2018-06-21 13:35:57 -04:00
parent 55eafbafee
commit ecb46023f6
3 changed files with 45 additions and 1 deletions

@ -73,6 +73,22 @@ struct ListTagJoin : detail::ListRoot
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
/// can be subclassed and still behave like a list tag.
template <typename ListTag1, typename ListTag2>

@ -229,7 +229,14 @@ struct ListCrossProductImpl
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

@ -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>
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 }),
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;