#include <language/utils/IncDecOperatorRegisterForR.hpp>

#include <language/utils/IncDecOperatorProcessorBuilder.hpp>
#include <language/utils/OperatorRepository.hpp>

void
IncDecOperatorRegisterForR::_register_unary_minusminus()
{
  OperatorRepository& repository = OperatorRepository::instance();

  auto R = ASTNodeDataType::build<ASTNodeDataType::double_t>();

  repository.addIncDecOperator<language::unary_minusminus>(R, std::make_shared<IncDecOperatorProcessorBuilder<
                                                                language::unary_minusminus, double_t>>());
}

void
IncDecOperatorRegisterForR::_register_unary_plusplus()
{
  OperatorRepository& repository = OperatorRepository::instance();

  auto R = ASTNodeDataType::build<ASTNodeDataType::double_t>();

  repository.addIncDecOperator<
    language::unary_plusplus>(R,
                              std::make_shared<IncDecOperatorProcessorBuilder<language::unary_plusplus, double_t>>());
}

void
IncDecOperatorRegisterForR::_register_post_minusminus()
{
  OperatorRepository& repository = OperatorRepository::instance();

  auto R = ASTNodeDataType::build<ASTNodeDataType::double_t>();

  repository.addIncDecOperator<
    language::post_minusminus>(R,
                               std::make_shared<IncDecOperatorProcessorBuilder<language::post_minusminus, double_t>>());
}

void
IncDecOperatorRegisterForR::_register_post_plusplus()
{
  OperatorRepository& repository = OperatorRepository::instance();

  auto R = ASTNodeDataType::build<ASTNodeDataType::double_t>();

  repository.addIncDecOperator<
    language::post_plusplus>(R, std::make_shared<IncDecOperatorProcessorBuilder<language::post_plusplus, double_t>>());
}

IncDecOperatorRegisterForR::IncDecOperatorRegisterForR()
{
  this->_register_unary_minusminus();
  this->_register_unary_plusplus();
  this->_register_post_minusminus();
  this->_register_post_plusplus();
}