#include "format.h" #include "mmap_manager.h" #include #include template memvector::memvector( std::string fname ): data_( new mmap_manager( fname ) ) { if ( !data_->size() ) { data_->resize( byte_io::byte_length() ); byte_io::write( data_->rw_base( 0 ), 0 ); } } template memvector::~memvector() { } template void memvector::print( std::ostream& out ) const { out << format( "size(): %s\n" ) % size(); for ( const_iterator first = begin(), past = end(); first != past; ++first ) { out << *first << std::endl; } } template void memvector::resize( size_type n_s ) { if ( size() >= n_s ) return; using namespace byte_io; data_->resize( n_s * byte_length() + byte_length() ); iterator p_end = end(); write( data_->rw_base( 0 ), n_s ); while ( p_end != end() ) { *p_end = value_type(); ++p_end; } } template void memvector::insert( const_iterator where, const value_type v ) { assert( !( where < begin() ) ); assert( where <= end() ); const unsigned to_idx = where.raw() - data_->ronly_base( 0 ); data_->resize( ( size() + 1 ) * byte_io::byte_length() + byte_io::byte_length() ); unsigned char* to = data_->rw_base( to_idx ); // make space: std::memmove( to + byte_io::byte_length(), to, end().raw() - to ); byte_io::write( to, v ); byte_io::write( data_->rw_base( 0 ), size() + 1 ); } template void memvector::erase( iterator where ) { assert( size() ); assert( !( where < begin() ) ); assert( where < end() ); iterator next = where; ++next; std::memmove( const_cast( where.raw() ), next.raw(), end().raw() - next.raw() ); byte_io::write( data_->rw_base( 0 ), size() - 1 ); } template void memvector::clear() { data_->resize( byte_io::byte_length() ); byte_io::write( data_->rw_base( 0 ), 0 ); } template void memvector::remove( std::string fname ) { ::unlink( fname.c_str() ); }