/*
 * Shift.h
 *
 *  Created on: Oct 13, 2013
 *      Author: Martin Zak
 */

#ifndef SHIFT_H_
#define SHIFT_H_

#include <alib/string>
#include <alib/compare>

namespace automaton {

/**
 * Represent movement of the reading head in the Turing machine.
 */
enum class Shift {
	LEFT, RIGHT, NONE
};

int shiftToInt(const automaton::Shift& shift);
automaton::Shift intToShift(int value);

extern std::string SHIFT_NAMES[3];

std::ostream& operator<<(std::ostream& out, const automaton::Shift&);

} /* namespace automaton */

namespace ext {

template<>
struct compare<automaton::Shift> {
	int operator()(const automaton::Shift& first, const automaton::Shift& second) {
		 return automaton::shiftToInt(first) - automaton::shiftToInt(second);
	}
};

} /* namespace ext */

#endif /* SHIFT_H_ */
