#include <vector>
#include <string>
#include <iostream>
#include <iterator>

#include <xapian.h>

using namespace std;

int main(int argc, char** argv)
{
    string data = "aarvark beast rotterdam amsterdamse amsterdam !!!";
    
    vector<string> words;
    int pos = 0;
    while ( pos < data.length() ) {
        int end = data.find( ' ', pos );
        if ( end == string::npos ) end = data.length();
        words.push_back( data.substr( pos, end-pos ) );
        pos = end+1;
    }

    try {
        Xapian::WritableDatabase db = Xapian::WritableDatabase( "/tmp/xapian.db", Xapian::DB_CREATE_OR_OPEN );
        Xapian::Document doc = Xapian::Document();
        doc.set_data( data );
        
        pos = 1;
        for ( vector<string>::iterator i = words.begin(); i != words.end(); i++ ) {            
            doc.add_posting( *i, pos++ );
        }
        
        db.add_document( doc );
            
        Xapian::TermIterator terms = db.allterms_begin();
        string skip = "amsterdam";        
        terms.skip_to( skip );
        cout << "First term after skipping to " << skip << ": " << *terms << endl;

        terms = db.allterms_begin();
        skip = "amsterda";        
        terms.skip_to( skip );
        cout << "First term after skipping to " << skip << ": " << *terms << endl;
            
        cout << "All terms:" << endl;            
        for( Xapian::TermIterator i = db.allterms_begin(); i != db.allterms_end(); i++ ) {
            cout << *i << endl;
        }
    } catch ( const Xapian::Error& error ) {
        cout << "Exception: " << error.get_msg() << endl;
    }
}
