• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • Examples
  • File List

buf_ostream.h

00001 /***************************************************************************
00002  *  include/stxxl/bits/mng/buf_ostream.h
00003  *
00004  *  Part of the STXXL. See http://stxxl.sourceforge.net
00005  *
00006  *  Copyright (C) 2002-2004 Roman Dementiev <[email protected]>
00007  *
00008  *  Distributed under the Boost Software License, Version 1.0.
00009  *  (See accompanying file LICENSE_1_0.txt or copy at
00010  *  http://www.boost.org/LICENSE_1_0.txt)
00011  **************************************************************************/
00012 
00013 #ifndef STXXL_BUF_OSTREAM_HEADER
00014 #define STXXL_BUF_OSTREAM_HEADER
00015 
00016 #include <stxxl/bits/mng/buf_writer.h>
00017 
00018 
00019 __STXXL_BEGIN_NAMESPACE
00020 
00023 
00024 
00029 template <typename BlkTp_, typename BIDIteratorTp_>
00030 class buf_ostream
00031 {
00032     typedef BlkTp_ block_type;
00033     typedef BIDIteratorTp_ bid_iterator_type;
00034 
00035 protected:
00036     buffered_writer<block_type> writer;
00037     bid_iterator_type current_bid;
00038     int_type current_elem;
00039     block_type * current_blk;
00040 
00041 public:
00042     typedef typename block_type::const_reference const_reference;
00043     typedef typename block_type::reference reference;
00044     typedef buf_ostream<block_type, bid_iterator_type> _Self;
00045 
00049     buf_ostream(bid_iterator_type first_bid, int_type nbuffers) :
00050         writer(nbuffers, nbuffers / 2), current_bid(first_bid),
00051         current_elem(0)
00052     {
00053         current_blk = writer.get_free_block();
00054     }
00055 
00059     _Self & operator << (const_reference record)
00060     {
00061         current_blk->elem[current_elem++] = record;
00062         if (current_elem >= block_type::size)
00063         {
00064             current_elem = 0;
00065             current_blk = writer.write(current_blk, *(current_bid++));
00066         }
00067         return (*this);
00068     }
00069 
00072     reference current()
00073     {
00074         return current_blk->elem[current_elem];
00075     }
00076 
00079     reference operator * ()
00080     {
00081         return current_blk->elem[current_elem];
00082     }
00083 
00086     _Self & operator ++ ()
00087     {
00088         ++current_elem;
00089         if (current_elem >= block_type::size)
00090         {
00091             current_elem = 0;
00092             current_blk = writer.write(current_blk, *(current_bid++));
00093         }
00094         return (*this);
00095     }
00096 
00097 
00099     virtual ~buf_ostream()
00100     {
00101         assert(current_elem == 0);
00102     }
00103 };
00104 
00106 
00107 __STXXL_END_NAMESPACE
00108 
00109 #endif // !STXXL_BUF_OSTREAM_HEADER

Generated by  doxygen 1.7.1