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