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