00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 #ifndef STXXL_SCAN_HEADER
00014 #define STXXL_SCAN_HEADER
00015 
00016 #include <stxxl/bits/namespace.h>
00017 #include <stxxl/bits/mng/buf_istream.h>
00018 #include <stxxl/bits/mng/buf_ostream.h>
00019 
00020 
00021 __STXXL_BEGIN_NAMESPACE
00022 
00025 
00035 template <typename _ExtIterator, typename _UnaryFunction>
00036 _UnaryFunction for_each(_ExtIterator _begin, _ExtIterator _end, _UnaryFunction _functor, int_type nbuffers)
00037 {
00038     typedef buf_istream<typename _ExtIterator::block_type, typename _ExtIterator::bids_container_iterator> buf_istream_type;
00039 
00040     _begin.flush();     
00041 
00042     
00043     buf_istream_type in(_begin.bid(), _end.bid() + ((_end.block_offset()) ? 1 : 0), nbuffers / 2);
00044 
00045     _ExtIterator _cur = _begin - _begin.block_offset();
00046 
00047     
00048     for ( ; _cur != _begin; ++_cur)
00049     {
00050         typename _ExtIterator::value_type tmp;
00051         in >> tmp;
00052     }
00053 
00054     
00055     for ( ; _cur != _end; ++_cur)
00056     {
00057         typename _ExtIterator::value_type tmp;
00058         in >> tmp;
00059         _functor(tmp);
00060     }
00061 
00062     
00063     if (_end.block_offset())
00064     {
00065         _ExtIterator _last_block_end = _end - _end.block_offset() + _ExtIterator::block_type::size;
00066         for ( ; _cur != _last_block_end; ++_cur)
00067         {
00068             typename _ExtIterator::value_type tmp;
00069             in >> tmp;
00070         }
00071     }
00072 
00073     return _functor;
00074 }
00075 
00076 
00086 template <typename _ExtIterator, typename _UnaryFunction>
00087 _UnaryFunction for_each_m(_ExtIterator _begin, _ExtIterator _end, _UnaryFunction _functor, int_type nbuffers)
00088 {
00089     typedef buf_istream<typename _ExtIterator::block_type, typename _ExtIterator::bids_container_iterator> buf_istream_type;
00090     typedef buf_ostream<typename _ExtIterator::block_type, typename _ExtIterator::bids_container_iterator> buf_ostream_type;
00091 
00092     _begin.flush();     
00093 
00094     
00095     buf_istream_type in(_begin.bid(), _end.bid() + ((_end.block_offset()) ? 1 : 0), nbuffers / 2);
00096     
00097     buf_ostream_type out(_begin.bid(), nbuffers / 2);
00098     
00099     
00100 
00101     _ExtIterator _cur = _begin - _begin.block_offset();
00102 
00103     
00104     for ( ; _cur != _begin; ++_cur)
00105     {
00106         typename _ExtIterator::value_type tmp;
00107         in >> tmp;
00108         out << tmp;
00109     }
00110 
00111     
00112     for ( ; _cur != _end; ++_cur)
00113     {
00114         typename _ExtIterator::value_type tmp;
00115         in >> tmp;
00116         _functor(tmp);
00117         out << tmp;
00118     }
00119 
00120     
00121     if (_end.block_offset())
00122     {
00123         _ExtIterator _last_block_end = _end - _end.block_offset() + _ExtIterator::block_type::size;
00124         for ( ; _cur != _last_block_end; ++_cur)
00125         {
00126             typename _ExtIterator::value_type tmp;
00127             in >> tmp;
00128             out << tmp;
00129         }
00130     }
00131 
00132     return _functor;
00133 }
00134 
00135 
00142 template <typename _ExtIterator, typename _Generator>
00143 void generate(_ExtIterator _begin, _ExtIterator _end, _Generator _generator, int_type nbuffers)
00144 {
00145     typedef typename _ExtIterator::block_type block_type;
00146     typedef buf_ostream<block_type, typename _ExtIterator::bids_container_iterator> buf_ostream_type;
00147 
00148 
00149     while (_begin.block_offset())    
00150     
00151     {
00152         if (_begin == _end)
00153             return;
00154 
00155         *_begin = _generator();
00156         ++_begin;
00157     }
00158 
00159     _begin.flush();     
00160 
00161     
00162     buf_ostream_type outstream(_begin.bid(), nbuffers);
00163 
00164     assert(_begin.block_offset() == 0);
00165 
00166     while (_end != _begin)
00167     {
00168         if (_begin.block_offset() == 0)
00169             _begin.touch();
00170 
00171         *outstream = _generator();
00172         ++_begin;
00173         ++outstream;
00174     }
00175 
00176     typename _ExtIterator::const_iterator out = _begin;
00177 
00178     while (out.block_offset())    
00179     {
00180         *outstream = *out;
00181         ++out;
00182         ++outstream;
00183     }
00184     _begin.flush();
00185 }
00186 
00195 template <typename _ExtIterator, typename _EqualityComparable>
00196 _ExtIterator find(_ExtIterator _begin, _ExtIterator _end, const _EqualityComparable & _value, int_type nbuffers)
00197 {
00198     typedef buf_istream<typename _ExtIterator::block_type, typename _ExtIterator::bids_container_iterator> buf_istream_type;
00199 
00200     _begin.flush();     
00201 
00202     
00203     buf_istream_type in(_begin.bid(), _end.bid() + ((_end.block_offset()) ? 1 : 0), nbuffers);
00204 
00205     _ExtIterator _cur = _begin - _begin.block_offset();
00206 
00207     
00208     for ( ; _cur != _begin; ++_cur)
00209         ++in;
00210 
00211 
00212     
00213     for ( ; _cur != _end; ++_cur)
00214     {
00215         typename _ExtIterator::value_type tmp;
00216         in >> tmp;
00217         if (tmp == _value)
00218             return _cur;
00219     }
00220 
00221     return _cur;
00222 }
00223 
00225 
00226 __STXXL_END_NAMESPACE
00227 
00228 #endif // !STXXL_SCAN_HEADER