http://stxxl.sourceforge.net
<beckmann@cs.uni-frankfurt.de>
<singler@ira.uka.de>
http://www.boost.org/LICENSE_1_0.txt
#ifndef STXXL_WBTL_FILE_HEADER
#define STXXL_WBTL_FILE_HEADER
#ifndef STXXL_HAVE_WBTL_FILE
#define STXXL_HAVE_WBTL_FILE 1
#endif
#if STXXL_HAVE_WBTL_FILE
#include <map>
#include <stxxl/bits/io/disk_queued_file.h>
__STXXL_BEGIN_NAMESPACE
class wbtl_file : public disk_queued_file
{
typedef std::pair<offset_type, offset_type> place;
typedef std::map<offset_type, offset_type> sortseq;
typedef std::map<offset_type, place> place_map;
file * storage;
offset_type sz;
size_type write_block_size;
mutex mapping_mutex;
sortseq address_mapping;
place_map reverse_mapping;
sortseq free_space;
offset_type free_bytes;
mutex buffer_mutex;
char * write_buffer[2];
offset_type buffer_address[2];
int curbuf;
size_type curpos;
request_ptr backend_request;
struct FirstFit : public std::binary_function<place, offset_type, bool>
{
bool operator () (
const place & entry,
const offset_type size) const
{
return (entry.second >= size);
}
};
public:
wbtl_file(
file * backend_file,
size_type write_buffer_size,
int write_buffers = 2,
int queue_id = DEFAULT_QUEUE,
int allocator_id = NO_ALLOCATOR);
~wbtl_file();
offset_type size();
void set_size(offset_type newsize);
void lock();
void serve(const request * req) throw (io_error);
void discard(offset_type offset, offset_type size);
const char * io_type() const;
private:
void _add_free_region(offset_type offset, offset_type size);
protected:
void sread(void * buffer, offset_type offset, size_type bytes);
void swrite(void * buffer, offset_type offset, size_type bytes);
offset_type get_next_write_block();
void check_corruption(offset_type region_pos, offset_type region_size,
sortseq::iterator pred, sortseq::iterator succ);
};
__STXXL_END_NAMESPACE
#endif
#endif