Skip to content
block.hxx 1.43 KiB
Newer Older
Seblu's avatar
Seblu committed
#ifndef BLOCK_HXX_
# define BLOCK_HXX_

Seblu's avatar
Seblu committed
inline Block::Block(int value = 0) {
Seblu's avatar
Seblu committed
  value_ = value;
  for (int i = 0; i < GRID_SIDE; ++i)
    forbidden_[i] = false;
}

inline bool Block::is_forbidden(int value) const {
Seblu's avatar
Seblu committed
  if (!(value > 0 && value <= GRID_SIDE))
    throw std::string("Invalid is_forbidden value");
Seblu's avatar
Seblu committed
  return forbidden_[value - 1];
}

inline bool Block::is_set() const {
  return value_ != 0;
Seblu's avatar
Seblu committed
}

Seblu's avatar
Seblu committed
inline int Block::get() const
Seblu's avatar
Seblu committed
{
  return value_;
}

inline void Block::set(int val)
{
Seblu's avatar
Seblu committed
  if (!(val > 0 && val <= GRID_SIDE))
    throw std::string("Invalid value");
  if (value_ != 0)
    throw std::string("Value already set");
  if (forbidden_[val - 1])
    throw std::string("Set a forbidden value");
Seblu's avatar
Seblu committed
  value_ = val;
Seblu's avatar
Seblu committed
  for (register int i = 0; i < GRID_SIDE; ++i)
Seblu's avatar
Seblu committed
    forbidden_[i] = true;
Seblu's avatar
Seblu committed
}

inline void Block::forbid(int val) {
Seblu's avatar
Seblu committed
  if (!(val > 0 && val <= GRID_SIDE))
    throw std::string("Invalid forbid value");
  if (value_ != 0)
    throw std::string("Try to forbid whereas case is set");
Seblu's avatar
Seblu committed
  forbidden_[val - 1] = true;
Seblu's avatar
Seblu committed
  if (forbidden_count() == GRID_SIDE)
    throw std::string("All possibilities are forbidden.");
Seblu's avatar
Seblu committed
}

inline std::ostream &operator<<(std::ostream &stream, const Block &blk) {
  if (blk.value_ == 0)
    stream << " ";
  else
    stream << blk.value_;
  return stream;
}

Seblu's avatar
Seblu committed
inline int Block::forbidden_count() const
{
  int count = 0;

  for (int i = 0; i < GRID_SIDE; ++i)
    if (forbidden_[i])
      ++count;
  return count;
}

Seblu's avatar
Seblu committed
#endif