/*! \addtogroup Containers
* \{
* \file picontainers.h
* \~\brief
* \~english Base macros for generic containers
* \~russian Базовые макросы для контейнеров
* \~\authors
* \~english
* Ivan Pelipenko peri4ko@yandex.ru;
* Andrey Bychkov work.a.b@yandex.ru;
* \~russian
* Иван Пелипенко peri4ko@yandex.ru;
* Андрей Бычков work.a.b@yandex.ru;
* \~\} */
/*
PIP - Platform Independent Primitives
Base macros for generic containers
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 PICONTAINERS_H
#define PICONTAINERS_H
#include "picout.h"
#include "piintrospection_containers.h"
#ifdef MAC_OS
# include
#else
# include
#endif
#include
#include
#include
#include
#if 0
/*!\brief Macro for iterate any container
* \details Use this macros instead of standard "for"
* to get read/write access to each element of container.
* Pass direction is direct \n
* Example: \snippet picontainers.cpp foreach
*/
# define piForeach(i,c)
/*!\brief Macro for iterate any container only for read
* \details Use this macros instead of standard "for"
* to get read access to each element of container.
* Pass direction is direct \n
* Example: \snippet picontainers.cpp foreachC
*/
# define piForeachC(i,c)
/*!\brief Macro for iterate any container with reverse direction
* \details Use this macros instead of standard "for"
* to get read/write access to each element of container.
* Pass direction is reverse \n
* Example: \snippet picontainers.cpp foreachR
*/
# define piForeachR(i,c)
/*!\brief Macro for iterate any container only for read with reverse direction
* \details Use this macros instead of standard "for"
* to get read access to each element of container.
* Pass direction is reverse \n
* Example: \snippet picontainers.cpp foreachCR
*/
# define piForeachCR(i,c)
#endif
template
class _PIReverseWrapper {
public:
_PIReverseWrapper(C & c): c_(c) {}
_PIReverseWrapper(const C & c): c_(const_cast(c)) {}
typename C::reverse_iterator begin() {return c_.rbegin();}
typename C::reverse_iterator end() {return c_.rend(); }
typename C::const_reverse_iterator begin() const {return c_.rbegin();}
typename C::const_reverse_iterator end() const {return c_.rend(); }
private:
C & c_;
};
template _PIReverseWrapper PIReverseWrap(C & c) {return _PIReverseWrapper(c);}
template _PIReverseWrapper PIReverseWrap(const C & c) {return _PIReverseWrapper(c);}
/*! \brief
* \~english Macro for short replacement of standart "for"
* \~russian Макрос для короткой записи стандартного цикла "for"
* \~\param c
* \~english Iteration times in loop
* \~russian Количество итераций цикла
*/
#define piForTimes(c) for(int _i##c = 0; _i##c < c; ++_i##c)
/*! \brief
* \~english Macro for iterate any container
* \~russian Макрос для перебора любых контейнеров
* \~\deprecated
* \~english Deprecated, using only for backward compatibility. Use "c++ range for".
* \~russian Устарело, используется только для обратной совместимости. Используйте "c++ range for".
* \~\details
* \~english Get read/write access to each element of container.
* Iterating in forward direction.
* Example of using:
* \~russian Перебор всех элементов контейнера с доступом на чтение и запись.
* Перебор осуществляется в прямом порядке.
* Пример использования:
* \~\code
* PIVector vec;
* vec << 1 << 2 << 3;
* piForeach(int & i, vec) piCout << i;
* // 1
* // 2
* // 3
* piForeach(int & i, vec) i++;
* piForeach(int & i, vec) piCout << i;
* // 2
* // 3
* // 4
* \endcode
*/
#define piForeach(i, c) for(i : c)
#define piForeachC(i, c) for(const i : c)
#define piForeachR(i, c) for(i : PIReverseWrap(c))
#define piForeachRC(i, c) for(const i : PIReverseWrap(c))
#define piForeachCR piForeachRC
#endif // PICONTAINERS_H