140 lines
5.9 KiB
C++
140 lines
5.9 KiB
C++
/*! \file picollection.h
|
||
* \ingroup Core
|
||
* \~\brief
|
||
* \~english Unique classes collection
|
||
* \~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 <http://www.gnu.org/licenses/>.
|
||
*/
|
||
|
||
#ifndef PICOLLECTION_H
|
||
#define PICOLLECTION_H
|
||
|
||
#include "piobject.h"
|
||
|
||
#ifdef DOXYGEN
|
||
|
||
//! \~\relatesalso PICollection
|
||
//! \~\brief
|
||
//! \~english Add existing element "object" in group with name "group"
|
||
//! \~russian Добавляет существующий элемент "object" в группу с именем "group"
|
||
//! \~\details
|
||
//! \~english
|
||
//! If this is no group with name "group" it will be created.
|
||
//! Only one element of the class "object" can be in group. If
|
||
//! this is already exists nothing be happens. \n "object" should to
|
||
//! be pointer to object based on \a PIObject.
|
||
//! \~russian
|
||
//! Если такой группы нет, она создается. В каждой группе может присутствовать
|
||
//! только один элемент класса объекта "object". Если такой элемент уже есть,
|
||
//! то ничего не изменится. \n "object" должен быть наследником \a PIObject.
|
||
# define ADD_TO_COLLECTION(group, object)
|
||
|
||
//! \~\relatesalso PICollection
|
||
//! \~\brief
|
||
//! \~english Add existing element "object" in group with name "group" and set its name to "name"
|
||
//! \~russian Добавляет существующий элемент "object" в группу с именем "group" и присваивает объекту имя "name"
|
||
//! \~\details
|
||
//! \~english
|
||
//! Similar to \a ADD_TO_COLLECTION(group, object) but set object name to "name"
|
||
//! \~russian
|
||
//! Аналогично \a ADD_TO_COLLECTION(group, object), но присваивает имя объекту "name"
|
||
# define ADD_TO_COLLECTION_WITH_NAME(group, object, name)
|
||
|
||
//! \~\relatesalso PICollection
|
||
//! \~\brief
|
||
//! \~english Add new element of class "class" in group with name "group"
|
||
//! \~russian Добавляет новый элемент класса "class" в группу с именем "group"
|
||
//! \~\details
|
||
//! \~english
|
||
//! If this is no group with name "group" it will be created.
|
||
//! Only one element of the class "class" can be in group. If
|
||
//! this is already exists nothing be happens. \n "class" should to
|
||
//! be name of the any class based on PIObject.
|
||
//! \~russian
|
||
//! Если такой группы нет, она создается. В каждой группе может присутствовать
|
||
//! только один элемент класса "class". Если такой элемент уже есть,
|
||
//! то ничего не изменится. \n "class" должен быть любым классом, наследным от \a PIObject.
|
||
# define ADD_NEW_TO_COLLECTION(group, class)
|
||
|
||
//! \~\relatesalso PICollection
|
||
//! \~\brief
|
||
//! \~english Add new element of class "class" in group with name "group" and set its name to "name"
|
||
//! \~russian Добавляет новый элемент класса "class" в группу с именем "group" и присваивает объекту имя "name"
|
||
//! \~\details
|
||
//! \~english
|
||
//! Similar to \a ADD_NEW_TO_COLLECTION(group, class) but set object name to "name"
|
||
//! \~russian
|
||
//! Аналогично \a ADD_NEW_TO_COLLECTION(group, class), но присваивает имя объекту "name"
|
||
# 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 Helper to collect and retrieve classes to groups.
|
||
//! \~russian Помощник для создания и получения классов в группы.
|
||
class PIP_EXPORT PICollection
|
||
{
|
||
friend class __PICollectionInitializer;
|
||
public:
|
||
PICollection() {;}
|
||
|
||
//! \~english Returns all existing groups by their names
|
||
//! \~russian Возвращает имена всех групп
|
||
static PIStringList groups();
|
||
|
||
//! \~english Returns all elements of group "group"
|
||
//! \~russian Возвращает все элементы группы "group"
|
||
static PIVector<const PIObject * > groupElements(const PIString & group);
|
||
|
||
static bool addToGroup(const PIString & group, const PIObject * element);
|
||
|
||
class PIP_EXPORT CollectionAdder {
|
||
public:
|
||
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<const PIObject * > elements;
|
||
};
|
||
|
||
static PIVector<Group> & _groups();
|
||
|
||
};
|
||
|
||
#endif // PICOLLECTION_H
|