#ifndef BOOST_ALGORITHM_RG071801_HPP

#define BOOST_ALGORITHM_RG071801_HPP



//

//

// Copyright (c) 1994

// Hewlett-Packard Company

//

// Permission to use, copy, modify, distribute and sell this software

// and its documentation for any purpose is hereby granted without fee,

// provided that the above copyright notice appear in all copies and

// that both that copyright notice and this permission notice appear

// in supporting documentation.  Hewlett-Packard Company makes no

// representations about the suitability of this software for any

// purpose.  It is provided "as is" without express or implied warranty.

//

//

// Copyright (c) 1996-1998

// Silicon Graphics Computer Systems, Inc.

//

// Permission to use, copy, modify, distribute and sell this software

// and its documentation for any purpose is hereby granted without fee,

// provided that the above copyright notice appear in all copies and

// that both that copyright notice and this permission notice appear

// in supporting documentation.  Silicon Graphics makes no

// representations about the suitability of this software for any

// purpose.  It is provided "as is" without express or implied warranty.

//



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





#include "boost/iterator.hpp"



namespace boost {

namespace detail {

namespace multi_array {

//--------------------------------------------------

// copy_n (not part of the C++ standard)

#if 1



template <class InputIter, class Size, class OutputIter>

OutputIter copy_n(InputIter first, Size count,

                  OutputIter result) {

  for ( ; count > 0; --count) {

    *result = *first;

    ++first;

    ++result;

  }

  return result;

}

#else // !1



template <class InputIter, class Size, class OutputIter>

OutputIter copy_n__(InputIter first, Size count,

                                       OutputIter result,

                                       std::input_iterator_tag) {

  for ( ; count > 0; --count) {

    *result = *first;

    ++first;

    ++result;

  }

  return result;

}



template <class RAIter, class Size, class OutputIter>

inline OutputIter

copy_n__(RAIter first, Size count,

         OutputIter result,

         std::random_access_iterator_tag) {

  RAIter last = first + count;

  return std::copy(first, last, result);

}



template <class InputIter, class Size, class OutputIter>

inline OutputIter

copy_n__(InputIter first, Size count, OutputIter result) {

  typedef typename std::iterator_traits<InputIter>::iterator_category cat;

  return copy_n__(first, count, result, cat());

}



template <class InputIter, class Size, class OutputIter>

inline OutputIter

copy_n(InputIter first, Size count, OutputIter result) {

  return copy_n__(first, count, result);

}



#endif // 1

} // namespace multi_array

} // namespace detail

} // namespace boost



#endif // BOOST_ALGORITHM_RG071801_HPP

