#include <libwccl/values/position.h>
#include <libwccl/sentencecontext.h>
#include <boost/lexical_cast.hpp>

namespace Wccl {

const char* Position::type_name = "Position";

#ifndef _MSC_VER
//If you're strict about standards, if you want to use
//integral or enum static consts in a program, you still
//have to define them even if the declaration has an initializer.
//Well, at least GCC is strict about it.
const int Position::Nowhere;
const int Position::End;
const int Position::Begin;
#endif

std::string Position::to_raw_string() const
{
	switch (val_) {
	case Nowhere:
		return "nowhere";
	case Begin:
		return "begin";
	case End:
		return "end";
	default:
		return boost::lexical_cast<std::string>(val_);
	}
}

std::string Position::var_repr(const std::string &var_name)
{
	std::stringstream ss;
	ss << "$" << var_name;
	return ss.str();
}

bool Position::is_inside(const SentenceContext& context) const
{
	int abs_position = context.get_abs_position(*this);
	return context.is_inside(abs_position);
}

bool Position::equals(const Position& other, const SentenceContext& context) const
{
	return context.get_abs_position(*this) == context.get_abs_position(other);
}

} /* end ns Wccl */