/*
 * BorderArray.cpp
 *
 *  Created on: 1. 11. 2014
 *      Author: Tomas Pecka
 */

#include "BorderArray.h"

#include <container/ObjectsVector.h>
#include <container/ObjectsPair.h>
#include <string/String.h>
#include <primitive/Integer.h>
#include <string/LinearString.h>

namespace stringology {

namespace exact {

std::vector<unsigned> BorderArray::construct(const string::String& string) {
	return dispatch(string.getData());
}

std::vector<unsigned> BorderArray::construct(const string::LinearString& string) {
	const auto& w = string.getContent();
	std::vector<unsigned> res(w.size() + 1);

	res[0] = 0;
	res[1] = 0;
	for(size_t i = 1; i < w.size(); i++) {
		unsigned b = res[i];
		while (b > 0 && w[i + 1 - 1] != w[b + 1 - 1])
			b = res[b];

		if(w[i + 1 - 1] == w[b + 1 - 1])
			res[i + 1] = b + 1;
		else
			res[i + 1] = 0;
	}

	return res;
}

auto BorderArrayLinearString = BorderArray::RegistratorWrapper<std::vector<unsigned>, string::LinearString>(BorderArray::construct);

} /* namespace exact */

} /* namespace stringology */