template<int h,int w>
class screen {
public:
screen():content(h*w,'1') {}
screen(char c):content(h*w,c){}
friend class window;
char get() const {
return content[cur];
}
inline char get(int, int) const;
screen& clear(char = bkground);
private:
static const char bkground = ' ';
public:
screen& move(int r, int c);
screen& set(char);
screen& set(int, int, char);
screen& display(ostream& os)
{
do_display(os);
return *this;
}
private:
void do_display(ostream& os) const { os << content;}
int cur = 0;
string content;
};
template<int h,int w>
screen<h, w>& screen<h, w>::clear(char c)
{
content = string(h * w, c);
return *this;
}
template<int h, int w>
inline screen<h, w>& screen<h, w>:: move(int r, int c)
{
int row = r * w;
cur = row + c;
return *this;
}
template<int h, int w>
char screen<h, w>::get(int r, int c) const
{
int row = r * w;
return content[row+c];
}
template<int h, int w>
inline screen<h, w>& screen<h, w>::set(char c)
{
content[cur] = c;
return *this;
}
template<int h, int w>
inline screen<h, w>& screen<h, w>::set(int r,int col,char ch)
{
content[r*w+col] = ch;
return *this;
}
int main()
{
screen<5, 3> myscreen;
myscreen.display(cout);
cout << endl;
myscreen.move(4, 0).set('#').display(cout);
cout << endl;
screen<5, 5> nextscreen('X');
nextscreen.move(4, 0).set('#').display(cout);
cout << "\n";
nextscreen.display(cout);
cout << endl;
myscreen.clear('Z').display(cout);
cout << endl;
myscreen.move(4, 0);
myscreen.set('#');
myscreen.display(cout);
}