// 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 |