#ifndef SUDOKUH
#define SUDOKUH
#include <iostream>
#include "box.h"
#include "row.h"
#include "col.h"
#include "reg.h"
using namespace std;

class sudoku {
	static const size_t root = 3;
public:
	static const size_t n = root * root;
private:
	box a[n][n];
	row rows[n];
	col cols[n];
	reg regs[root][root];
public:
	sudoku(const int initial_a[n][n]);
	friend ostream& operator<<(ostream& ost, const sudoku& s);

	friend box& row::iterator::operator*() const;
	friend box& col::iterator::operator*() const;
	friend box& reg::iterator::operator*() const;

	friend box::operator row&() const;
	friend box::operator col&() const;
	friend box::operator reg&() const;
};
#endif