#include <memory>
#include <iostream>
#define RC
#define WR
#define mixin class
#define interface class
typedef unsigned short ushort;
typedef unsigned long long ulong64;
typedef unsigned long ulong;
// Карандаши и кисточки.
namespace PaintingToolbox
{
// Внутренние классы.
namespace private_classes
{
// Предмет для письма (интерфейс класса).
interface IDrawStick
{
public:
virtual void draw () = 0;
;
};
// Коробка или контейнер (интерфейс класса).
template <class T> interface IHolder
{
public:
virtual void add (const ulong, const T &) = 0;
virtual void remove (const ulong) = 0;
virtual bool isEmpty () = 0;
;
};
// Коробка или контейнер (добавляемый код).
template <class T> mixin THolder
{
public:
THolder () {}
~THolder () {}
;
protected:
ulong counter = 0;
void incCounter ()
{
this->counter ++;
}
void decCounter ()
{
this->counter --;
}
bool checkIsEmpty ()
{
return (this->counter == 0) ? true : false;
}
;
};
};
using IDrawStick = private_classes::IDrawStick;
template <class T> using IHolder = private_classes::IHolder <T>;
template <class T> using THolder = private_classes::THolder <T>;
// Карандаш.
class Pencil : public IDrawStick
{
public:
Pencil () {}
virtual ~Pencil () {}
virtual void draw ()
{
std::cout << "Pencil::draw ()" << std::endl;
}
;
};
// Кисточка.
class Brush : public IDrawStick
{
public:
Brush () {}
virtual ~Brush () {}
virtual void draw ()
{
std::cout << "Brush::draw ()" << std::endl;
}
;
};
// Контейнер с чем угодно.
template <class T> class Container : public IHolder <T>, private THolder <T>
{
public:
Container () {}
virtual ~Container () {}
virtual void add (const ulong id, const T &item)
{
std::cout << "Container::add ()" << std::endl;
this->incCounter ();
}
virtual void remove (const ulong id)
{
std::cout << "Container::remove ()" << std::endl;
this->decCounter ();
}
virtual bool isEmpty ()
{
std::cout << "Container::isEmpty ()" << std::endl;
return this->checkIsEmpty ();
}
;
};
// Коробка с чем угодно.
template <class T> class Box : public IHolder <T>, private THolder <T>
{
public:
Box () {}
virtual ~Box () {}
virtual void add (const ulong id, const T &item)
{
std::cout << "Box::add ()" << std::endl;
this->incCounter ();
}
virtual void remove (const ulong id)
{
std::cout << "Box::remove ()" << std::endl;
this->decCounter ();
}
virtual bool isEmpty ()
{
std::cout << "Box::isEmpty ()" << std::endl;
return this->checkIsEmpty ();
}
;
};
};
using namespace PaintingToolbox;
int main ()
{
// Карандаш.
std::shared_ptr <Pencil> pencil (
new Pencil ()
);
// Коробка с карандашами.
std::shared_ptr <Box <Pencil>> pencilBox (
new Box <Pencil> ()
);
// Контейнер с коробками с кисточками.
std::shared_ptr <Container <Box <Brush>>> container (
new Container <Box <Brush>> ()
);
// И...
pencil->draw ();
pencilBox->add (0xFF, *pencil);
std::cout << pencilBox->isEmpty () << std::endl;
std::cout << container->isEmpty () << std::endl;
// Табы лучше, чем пробелы.
return 0;
}