     const uint32 mems_batch = 16*1024*1024;
     nvbio::vector<device_tag,mem_filter_type::mem_type> mems( mems_batch );
 
-    while (1)
-    {
-        // load a batch of reads
-        SharedPointer<io::ReadData> h_read_data( read_data_file->next( batch_reads, batch_bps ) );
-        if (h_read_data == NULL)
-            break;
-
+    io::SequenceDataHost<DNA_N> h_read_data;
+
+    // load a batch of reads
+    while (io::next( &h_read_data, read_data_file.get(), batch_reads, batch_bps ))
+    {
         log_info(stderr, "  loading reads... started\n");
 
         // copy it to the device
-        const io::ReadDataDevice d_read_data( *h_read_data );
+        const io::SequenceDataDevice<DNA_N> d_read_data( h_read_data );
 
         const uint32 n_reads = d_read_data.size() / 2;
 

#include <nvbio/strings/infix.h>
#include <nvbio/strings/seeds.h>
#include <nvbio/fmindex/mem.h>
#include <nvbio/io/reads/reads.h>
#include <nvbio/io/fmi.h>

using namespace nvbio;

        mem_filter.rank(
            f_index,
            r_index,
            nvbio::plain_view( d_read_data ).sequence_string_set(),
            min_intv,
            max_intv,
            min_span );
