00001
00002
00011 #ifndef CXXUTILS_COPY_BOUNDED_H
00012 #define CXXUTILS_COPY_BOUNDED_H
00013
00014
00015 #include <iterator>
00016 #include <algorithm>
00017 #include "boost/range/iterator.hpp"
00018 #include "boost/range/begin.hpp"
00019 #include "boost/range/end.hpp"
00020
00021
00022 namespace CxxUtils {
00023
00024
00028 template <class InputIterator, class OutputIterator,
00029 class InputTag, class OutputTag>
00030 inline
00031 OutputIterator
00032 copy_bounded1 (InputIterator begi, InputIterator endi,
00033 OutputIterator bego, OutputIterator endo,
00034 const InputTag&,
00035 const OutputTag&)
00036 {
00037 while (begi != endi && bego != endo) {
00038 *bego = *begi;
00039 ++begi;
00040 ++bego;
00041 }
00042 return bego;
00043 }
00044
00045
00049 template <class InputIterator, class OutputIterator>
00050 inline
00051 OutputIterator
00052 copy_bounded1 (InputIterator begi, InputIterator endi,
00053 OutputIterator bego, OutputIterator endo,
00054 const std::random_access_iterator_tag&,
00055 const std::random_access_iterator_tag&)
00056 {
00057 size_t n = std::min (endi-begi, endo-bego);
00058 return std::copy (begi, begi+n, bego);
00059 }
00060
00061
00076 template <class InputIterator, class OutputIterator>
00077 inline
00078 OutputIterator
00079 copy_bounded (InputIterator begi, InputIterator endi,
00080 OutputIterator bego, OutputIterator endo)
00081 {
00082 return copy_bounded1
00083 (begi, endi, bego, endo,
00084 typename std::iterator_traits<InputIterator>::iterator_category(),
00085 typename std::iterator_traits<OutputIterator>::iterator_category());
00086 }
00087
00088
00096 template <class InputRange, class OutputRange>
00097 inline
00098 typename boost::range_iterator<OutputRange>::type
00099 copy_bounded (const InputRange& input, OutputRange& output)
00100 {
00101 return copy_bounded
00102 (boost::begin(input), boost::end(input),
00103 boost::begin(output), boost::end(output));
00104 }
00105
00106
00107 }
00108
00109
00110
00111 #endif // not CXXUTILS_COPY_BOUNDED_H