diff options
Diffstat (limited to 'boost/compute/algorithm/is_permutation.hpp')
-rw-r--r-- | boost/compute/algorithm/is_permutation.hpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/boost/compute/algorithm/is_permutation.hpp b/boost/compute/algorithm/is_permutation.hpp new file mode 100644 index 0000000000..1e502efb37 --- /dev/null +++ b/boost/compute/algorithm/is_permutation.hpp @@ -0,0 +1,67 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2014 Roshan <thisisroshansmail@gmail.com> +// +// 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 +// +// See http://boostorg.github.com/compute for more information. +//---------------------------------------------------------------------------// + +#ifndef BOOST_COMPUTE_ALGORITHM_IS_PERMUTATION_HPP +#define BOOST_COMPUTE_ALGORITHM_IS_PERMUTATION_HPP + +#include <iterator> + +#include <boost/compute/system.hpp> +#include <boost/compute/command_queue.hpp> +#include <boost/compute/container/vector.hpp> +#include <boost/compute/detail/iterator_range_size.hpp> +#include <boost/compute/algorithm/equal.hpp> +#include <boost/compute/algorithm/sort.hpp> + +namespace boost { +namespace compute { + +/// +/// \brief Permutation checking algorithm +/// +/// Checks if the range [first1, last1) can be permuted into the +/// range [first2, last2) +/// \return True, if it can be permuted. False, otherwise. +/// +/// \param first1 Iterator pointing to start of first range +/// \param last1 Iterator pointing to end of first range +/// \param first2 Iterator pointing to start of second range +/// \param last2 Iterator pointing to end of second range +/// \param queue Queue on which to execute +/// +template<class InputIterator1, class InputIterator2> +inline bool is_permutation(InputIterator1 first1, + InputIterator1 last1, + InputIterator2 first2, + InputIterator2 last2, + command_queue &queue = system::default_queue()) +{ + typedef typename std::iterator_traits<InputIterator1>::value_type value_type1; + typedef typename std::iterator_traits<InputIterator2>::value_type value_type2; + + size_t count1 = detail::iterator_range_size(first1, last1); + size_t count2 = detail::iterator_range_size(first2, last2); + + if(count1 != count2) return false; + + vector<value_type1> temp1(first1, last1, queue); + vector<value_type2> temp2(first2, last2, queue); + + sort(temp1.begin(), temp1.end(), queue); + sort(temp2.begin(), temp2.end(), queue); + + return equal(temp1.begin(), temp1.end(), + temp2.begin(), queue); +} + +} // end compute namespace +} // end boost namespace + +#endif // BOOST_COMPUTE_ALGORITHM_IS_PERMUTATION_HPP |