#include <regexp.h>
#include <iostream>
#include <buffered_iterator.h>
#include <language.h>
#include <lazy.h>
#include <dfa_matrix.h>
#include <debug.h>

int main(int argc, char **argv)
{
	regexp_cursor r(".* a|b|c|d|e f|g|h|i|j k|l|m|n|o #");
	unsigned int occurences = 0;
	buffered_input_iterator<> first(0), last;

#ifdef TEMPLATE_TEMPLATE_IMPLEMENTATION
	if (argc < 2 || strcmp(argv[1], "nolazy") != 0) {
		lazy_cursor<regexp_cursor, plain>::DFA_type dfa;
		lazy_cursor<regexp_cursor, plain> c(r, dfa);
		for(; first != last; ++first) {
			if (!c.forward(*first)) {
				cout << "transition undefined" << endl;
				break;
			}
			if (c.src_final()) ++occurences;
		}
	}
#else	
	if (argc < 2 || strcmp(argv[1], "nolazy") != 0) {
		DFA_matrix<plain, regexp_cursor::State> dfa;
		lazy_cursor<regexp_cursor, DFA_matrix<plain,  regexp_cursor::State> > c(r, dfa);
		for(; first != last; ++first) {
			if (!c.forward(*first)) {
				cout << "transition undefined" << endl;
				break;
			}
			if (c.src_final()) ++occurences;
		}
	}
#endif // TEMPLATE_TEMPLATE_IMPLEMENTATION

	else {
		for(; first != last; ++first) {
			if (!r.forward(*first)) {
				cout << "transition undefined" << endl;
				break;
			}
			if (r.src_final()) ++occurences;
		}
	}

	cout << "Found " << occurences << " occurences" << endl;
}

