119 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			119 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | //---------------------------------------------------------------------------// | ||
|  | // Copyright (c) 2013 Kyle Lutz <kyle.r.lutz@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_DETAIL_IS_CONTIGUOUS_ITERATOR_HPP | ||
|  | #define BOOST_COMPUTE_DETAIL_IS_CONTIGUOUS_ITERATOR_HPP | ||
|  | 
 | ||
|  | #include <vector> | ||
|  | #include <valarray> | ||
|  | 
 | ||
|  | #include <boost/config.hpp> | ||
|  | #include <boost/type_traits.hpp> | ||
|  | #include <boost/utility/enable_if.hpp> | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | namespace compute { | ||
|  | namespace detail { | ||
|  | 
 | ||
|  | // default = false | ||
|  | template<class Iterator, class Enable = void> | ||
|  | struct _is_contiguous_iterator : public boost::false_type {}; | ||
|  | 
 | ||
|  | // std::vector<T>::iterator = true | ||
|  | template<class Iterator> | ||
|  | struct _is_contiguous_iterator< | ||
|  |     Iterator, | ||
|  |     typename boost::enable_if< | ||
|  |         typename boost::is_same< | ||
|  |             Iterator, | ||
|  |             typename std::vector<typename Iterator::value_type>::iterator | ||
|  |         >::type | ||
|  |     >::type | ||
|  | > : public boost::true_type {}; | ||
|  | 
 | ||
|  | // std::vector<T>::const_iterator = true | ||
|  | template<class Iterator> | ||
|  | struct _is_contiguous_iterator< | ||
|  |     Iterator, | ||
|  |     typename boost::enable_if< | ||
|  |         typename boost::is_same< | ||
|  |             Iterator, | ||
|  |             typename std::vector<typename Iterator::value_type>::const_iterator | ||
|  |         >::type | ||
|  |     >::type | ||
|  | > : public boost::true_type {}; | ||
|  | 
 | ||
|  | // std::valarray<T>::iterator = true | ||
|  | template<class Iterator> | ||
|  | struct _is_contiguous_iterator< | ||
|  |     Iterator, | ||
|  |     typename boost::enable_if< | ||
|  |         typename boost::is_same< | ||
|  |             Iterator, | ||
|  |             typename std::valarray<typename Iterator::value_type>::iterator | ||
|  |         >::type | ||
|  |     >::type | ||
|  | > : public boost::true_type {}; | ||
|  | 
 | ||
|  | // std::valarray<T>::const_iterator = true | ||
|  | template<class Iterator> | ||
|  | struct _is_contiguous_iterator< | ||
|  |     Iterator, | ||
|  |     typename boost::enable_if< | ||
|  |         typename boost::is_same< | ||
|  |             Iterator, | ||
|  |             typename std::valarray<typename Iterator::value_type>::const_iterator | ||
|  |         >::type | ||
|  |     >::type | ||
|  | > : public boost::true_type {}; | ||
|  | 
 | ||
|  | // T* = true | ||
|  | template<class Iterator> | ||
|  | struct _is_contiguous_iterator< | ||
|  |     Iterator, | ||
|  |     typename boost::enable_if< | ||
|  |         boost::is_pointer<Iterator> | ||
|  |     >::type | ||
|  | > : public boost::true_type {}; | ||
|  | 
 | ||
|  | // the is_contiguous_iterator meta-function returns true if Iterator points | ||
|  | // to a range of contiguous values. examples of contiguous iterators are | ||
|  | // std::vector<>::iterator and float*. examples of non-contiguous iterators | ||
|  | // are std::set<>::iterator and std::insert_iterator<>. | ||
|  | // | ||
|  | // the implementation consists of two phases. the first checks that value_type | ||
|  | // for the iterator is not void. this must be done as for many containers void | ||
|  | // is not a valid value_type (ex. std::vector<void>::iterator is not valid). | ||
|  | // after ensuring a non-void value_type, the _is_contiguous_iterator function | ||
|  | // is invoked. it has specializations retuning true for all (known) contiguous | ||
|  | // iterators types and a default value of false. | ||
|  | template<class Iterator, class Enable = void> | ||
|  | struct is_contiguous_iterator : | ||
|  |     public _is_contiguous_iterator< | ||
|  |         typename boost::remove_cv<Iterator>::type | ||
|  |     > {}; | ||
|  | 
 | ||
|  | // value_type of void = false | ||
|  | template<class Iterator> | ||
|  | struct is_contiguous_iterator< | ||
|  |     Iterator, | ||
|  |     typename boost::enable_if< | ||
|  |         typename boost::is_void< | ||
|  |             typename Iterator::value_type | ||
|  |         >::type | ||
|  |     >::type | ||
|  | > : public boost::false_type {}; | ||
|  | 
 | ||
|  | } // end detail namespace | ||
|  | } // end compute namespace | ||
|  | } // end boost namespace | ||
|  | 
 | ||
|  | #endif // BOOST_COMPUTE_DETAIL_IS_CONTIGUOUS_ITERATOR_HPP |