#include <language/utils/BinaryOperatorRegisterForString.hpp>

#include <language/utils/BinaryOperatorProcessorBuilder.hpp>
#include <language/utils/ConcatExpressionProcessorBuilder.hpp>
#include <language/utils/OperatorRepository.hpp>

void
BinaryOperatorRegisterForString::_register_comparisons()
{
  OperatorRepository& repository = OperatorRepository::instance();

  repository.addBinaryOperator<language::eqeq_op>(
    std::make_shared<BinaryOperatorProcessorBuilder<language::eqeq_op, bool, std::string, std::string>>());

  repository.addBinaryOperator<language::not_eq_op>(
    std::make_shared<BinaryOperatorProcessorBuilder<language::not_eq_op, bool, std::string, std::string>>());
}

template <typename RHS_T>
void
BinaryOperatorRegisterForString::_register_concat()
{
  OperatorRepository& repository = OperatorRepository::instance();

  repository.addBinaryOperator<language::plus_op>(std::make_shared<ConcatExpressionProcessorBuilder<RHS_T>>());
}

BinaryOperatorRegisterForString::BinaryOperatorRegisterForString()
{
  this->_register_comparisons();

  this->_register_concat<bool>();
  this->_register_concat<unsigned long>();
  this->_register_concat<long>();
  this->_register_concat<double>();
  this->_register_concat<TinyVector<1>>();
  this->_register_concat<TinyVector<2>>();
  this->_register_concat<TinyVector<3>>();
  this->_register_concat<std::string>();
}