/*
 Copyright (C) 2002  Simon Goodall, Martin Pollard (Xmp)

 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details. 

 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software Foundation,
 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

// Rewritten for Ember by Martin Pollard (Xmp)

// Originally written for Sear by Simon Goodall, University of Southampton
// Original Copyright (C) 2001 - 2002 

#include "Tokeniser.h"

namespace Ember {

Tokeniser::Tokeniser() :
		mDelimeters(" "),
		mPos(std::string::npos),
		mLastPos(std::string::npos) {
}

Tokeniser::Tokeniser(const std::string& tokens) :
		mDelimeters(" "),
		mPos(std::string::npos),
		mLastPos(std::string::npos) {
	initTokens(tokens);
}

Tokeniser::Tokeniser(const std::string& tokens, std::string delimiters) :
		mDelimeters(std::move(delimiters)),
		mPos(std::string::npos),
		mLastPos(std::string::npos) {
	initTokens(tokens);
}

void Tokeniser::initTokens(const std::string& tokens) {
	mTokenString = tokens;
	//  try {
	mLastPos = mTokenString.find_first_not_of(mDelimeters, 0);
	mPos = mTokenString.find_first_of(mDelimeters, mLastPos);
	//  } catch (...) {
	//
	//  }

}

std::string Tokeniser::nextToken() {
	if (mLastPos == std::string::npos)
		return "";
	//  try {
	std::string token = mTokenString.substr(mLastPos, mPos - mLastPos);
	mLastPos = mTokenString.find_first_not_of(mDelimeters, mPos);
	mPos = mTokenString.find_first_of(mDelimeters, mLastPos);
	return token;
	//  } catch (...) {
	//    return "";
	//  }
}

std::string Tokeniser::remainingTokens() const {
	if (!hasRemainingTokens())
		return "";
	//try {
	return mTokenString.substr(mLastPos, mTokenString.size() - mLastPos);
	//  } catch (...) {
	//    return "";
	//  }
}

bool Tokeniser::hasRemainingTokens() const {
	return mLastPos != std::string::npos;
}

std::vector<std::string> Tokeniser::split(const std::string& tokens, const std::string& delimiters) {
	std::vector<std::string> tokenStore;
	Tokeniser tokeniser(tokens, delimiters);
	while (tokeniser.hasRemainingTokens()) {
		tokenStore.push_back(tokeniser.nextToken());
	}
	return tokenStore;
}

}// end of namespace Ember
