170
virtual int number_input(void) const = 0;
// количество выходных каналов сети
virtual int number_output(void) const = 0;
// получение списка всех связей
virtual linkstore_type get_links(void) const = 0;
// создание i-го автомата в сети
virtual fsm_abstract_type *create_fsm(int i) = 0;
// уничтожение его же
virtual void destroy_fsm(int i, fsm_abstract_type *pfsm) = 0;
};
private:
// класс для работы с общими данными
class shared_area_type
{
// общие данные (выходы всех автоматов и входы сети)
std::vector<data_type> m_data;
// позиции и размеры областей выходов автоматов и входов сети
std::vector<int> m_outpos, m_outsize;
// позиции входов автоматов и выходов сети
std::vector<std::vector<int> > m_inpos;
public:
// в конструкторе на основе входящего списка связей формируем
// область общих данных, список позиций выходных областей
// автоматов, а также списки позиций конкретных входов автоматов
shared_area_type(const std::vector<link_type> &links)
{
// количество автоматов = максимальный указанный + 1
int fsmnum = 0;
for (int i = 0; i < links.size(); i++)
{
fsmnum = std::max(fsmnum, links[i].first.first);
fsmnum = std::max(fsmnum, links[i].second.first);
};
fsmnum++;
// кол-ва выходов автоматов (сначала) и входов сети (последний)
std::vector<int> outsize(fsmnum + 1);
// кол-ва входов автоматов (сначала) и выходов сети (последний)
std::vector<int> insize(fsmnum + 1);
// ищем максимальные номера входов и выходов для всех
for (int i = 0; i < links.size(); i++)
{
int idxout = links[i].first.first;
int idxin = links[i].second.first;
idxout = (idxout != PSEUDOFSM_NETINPUT) ?