69 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| // Copyright 2002 The Trustees of Indiana University.
 | |
| 
 | |
| // Use, modification and distribution is subject to 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)
 | |
| 
 | |
| //  Boost.MultiArray Library
 | |
| //  Authors: Ronald Garcia
 | |
| //           Jeremy Siek
 | |
| //           Andrew Lumsdaine
 | |
| //  See http://www.boost.org/libs/multi_array for documentation.
 | |
| 
 | |
| #ifndef COPY_ARRAY_RG092101_HPP
 | |
| #define COPY_ARRAY_RG092101_HPP
 | |
| 
 | |
| //
 | |
| // copy_array.hpp - generic code for copying the contents of one
 | |
| // Basic_MultiArray to another.  We assume that they are of the same
 | |
| // shape
 | |
| //
 | |
| #include "boost/type.hpp"
 | |
| #include "boost/assert.hpp"
 | |
| 
 | |
| namespace boost {
 | |
| namespace detail {
 | |
| namespace multi_array {
 | |
| 
 | |
| template <typename Element>
 | |
| class copy_dispatch {
 | |
| public:
 | |
|   template <typename SourceIterator, typename DestIterator>
 | |
|   static void copy_array (SourceIterator first, SourceIterator last,
 | |
|                    DestIterator result) {
 | |
|     while (first != last) {
 | |
|       copy_array(*first++,*result++);
 | |
|     }
 | |
|   }
 | |
| private:
 | |
|   // Array2 has to be passed by VALUE here because subarray
 | |
|   // pseudo-references are temporaries created by iterator::operator*()
 | |
|   template <typename Array1, typename Array2>
 | |
|   static void copy_array (const Array1& source, Array2 dest) {
 | |
|     copy_array(source.begin(),source.end(),dest.begin());
 | |
|   }
 | |
| 
 | |
|   static void copy_array (const Element& source, Element& dest) {
 | |
|     dest = source;
 | |
|   }
 | |
| 
 | |
| };
 | |
| 
 | |
| 
 | |
| template <typename Array1, typename Array2>
 | |
| void copy_array (Array1& source, Array2& dest) {
 | |
|   BOOST_ASSERT(std::equal(source.shape(),source.shape()+source.num_dimensions(),
 | |
|                           dest.shape()));
 | |
|   // Dispatch to the proper function
 | |
|   typedef typename Array1::element element_type;
 | |
|   copy_dispatch<element_type>::
 | |
|     copy_array(source.begin(),source.end(),dest.begin());
 | |
| }
 | |
| 
 | |
| 
 | |
| } // namespace multi_array
 | |
| } // namespace detail
 | |
| } // namespace boost
 | |
| 
 | |
| #endif // COPY_ARRAY_RG092101_HPP
 | 
