/*! \file picollection.h
* \ingroup Core
* \~\brief
* \~english Named collection of unique object classes
* \~russian Именованная коллекция уникальных классов объектов
*/
/*
PIP - Platform Independent Primitives
Peer - named I/O ethernet node, forming self-organized peering network
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see .
*/
#ifndef PICOLLECTION_H
#define PICOLLECTION_H
#include "piobject.h"
#ifdef DOXYGEN
//! \relatesalso PICollection
//! \~\brief
//! \~english Adds existing object to group "group".
//! \~russian Добавляет существующий объект в группу "group".
//! \~\details
//! \~english
//! Group is created automatically when needed. Only one object of the same
//! runtime class can be stored in one group.
//! \~russian
//! Группа создается автоматически при необходимости. В одной группе может
//! храниться только один объект одного и того же класса времени выполнения.
# define ADD_TO_COLLECTION(group, object)
//! \relatesalso PICollection
//! \~\brief
//! \~english Adds existing object to group "group" and assigns name "name".
//! \~russian Добавляет существующий объект в группу "group" и присваивает ему имя "name".
//! \~\details
//! \~english
//! Similar to \a ADD_TO_COLLECTION(group, object), but also sets object name.
//! \~russian
//! Аналогично \a ADD_TO_COLLECTION(group, object), но дополнительно задает имя объекта.
# define ADD_TO_COLLECTION_WITH_NAME(group, object, name)
//! \relatesalso PICollection
//! \~\brief
//! \~english Creates and adds new object of class "class" to group "group".
//! \~russian Создает и добавляет новый объект класса "class" в группу "group".
//! \~\details
//! \~english
//! Group is created automatically when needed. Only one object of the same
//! runtime class can be stored in one group.
//! \~russian
//! Группа создается автоматически при необходимости. В одной группе может
//! храниться только один объект одного и того же класса времени выполнения.
# define ADD_NEW_TO_COLLECTION(group, class)
//! \relatesalso PICollection
//! \~\brief
//! \~english Creates and adds new object of class "class" to group "group"
//! and assigns name "name".
//! \~russian Создает и добавляет новый объект класса "class" в группу "group"
//! и присваивает ему имя "name".
//! \~\details
//! \~english
//! Similar to \a ADD_NEW_TO_COLLECTION(group, class), but also sets object name.
//! \~russian
//! Аналогично \a ADD_NEW_TO_COLLECTION(group, class), но дополнительно задает имя объекта.
# define ADD_NEW_TO_COLLECTION_WITH_NAME(group, class, name)
#else
# define ADD_TO_COLLECTION(group, object) \
static PICollection::CollectionAdder _PIP_ADD_COUNTER(_collection_adder_)(#group, object, "", false);
# define ADD_TO_COLLECTION_WITH_NAME(group, object, name) \
static PICollection::CollectionAdder _PIP_ADD_COUNTER(_collection_adder_)(#group, object, #name, false);
# define ADD_NEW_TO_COLLECTION(group, class) \
static PICollection::CollectionAdder _PIP_ADD_COUNTER(_collection_adder_)(#group, new class(), "", true);
# define ADD_NEW_TO_COLLECTION_WITH_NAME(group, class, name) \
static PICollection::CollectionAdder _PIP_ADD_COUNTER(_collection_adder_)(#group, new class(), #name, true);
#endif
//! \ingroup Core
//! \~\brief
//! \~english Global collection of %PIObject-based instances grouped by name.
//! \~russian Глобальная коллекция экземпляров на базе %PIObject, сгруппированных по имени.
class PIP_EXPORT PICollection {
friend class __PICollectionInitializer;
public:
//! \~english Constructs collection helper.
//! \~russian Создает вспомогательный объект коллекции.
PICollection() { ; }
//! \~english Returns names of all existing groups.
//! \~russian Возвращает имена всех существующих групп.
static PIStringList groups();
//! \~english Returns all elements stored in group "group".
//! \~russian Возвращает все элементы, хранящиеся в группе "group".
static PIVector groupElements(const PIString & group);
//! \~english Adds object to group "group" if that group has no object of the
//! same runtime class.
//! \~russian Добавляет объект в группу "group", если в группе еще нет объекта
//! того же класса времени выполнения.
static bool addToGroup(const PIString & group, const PIObject * element);
//! \ingroup Core
//! \~\brief
//! \~english Helper that registers object in collection during static initialization.
//! \~russian Вспомогательный класс, регистрирующий объект в коллекции при статической инициализации.
class PIP_EXPORT CollectionAdder {
public:
//! \~english Registers object in group and optionally assigns object name.
//! \~russian Регистрирует объект в группе и при необходимости задает имя объекта.
CollectionAdder(const PIString & group, const PIObject * element, const PIString & name = PIString(), bool own = false);
};
protected:
struct PIP_EXPORT Group {
Group(const PIString & name_ = PIString()) { name = name_; }
PIString name;
PIVector elements;
};
static PIVector & _groups();
};
#endif // PICOLLECTION_H