/*! \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 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_; }; /*! \brief * \~english Template reverse wrapper over any container * \~russian Шаблонная функция обертки любого контейнера для обратного доступа через итераторы */ 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-based for loop](https://en.cppreference.com/w/cpp/language/range-for). * \~russian Устарело, используется только для обратной совместимости. Используйте * [C++ Range-based for loop](https://ru.cppreference.com/w/cpp/language/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 * \sa \a piForeachC, \a piForeachR, \a piForeachRC */ #define piForeach(i, c) for(i : c) /*! \brief * \~english Macro for iterate any container * \~russian Макрос для перебора любых контейнеров * \~\deprecated * \~english Deprecated, using only for backward compatibility. Use * [C++ Range-based for loop](https://en.cppreference.com/w/cpp/language/range-for). * \~russian Устарело, используется только для обратной совместимости. Используйте * [C++ Range-based for loop](https://ru.cppreference.com/w/cpp/language/range-for). * \~\details * \~english Get read only access to each element of container. * Iterating in forward direction. * \~russian Перебор всех элементов контейнера с доступом только на чтение. * Перебор осуществляется в прямом порядке. * \~ \sa \a piForeach, \a piForeachR, \a piForeachRC */ #define piForeachC(i, c) for(const i : c) /*! \brief * \~english Macro for iterate any container * \~russian Макрос для перебора любых контейнеров * \~\deprecated * \~english Deprecated, using only for backward compatibility. Use * [C++ Range-based for loop](https://en.cppreference.com/w/cpp/language/range-for). * \~russian Устарело, используется только для обратной совместимости. Используйте * [C++ Range-based for loop](https://ru.cppreference.com/w/cpp/language/range-for). * \~\details * \~english Get read/write access to each element of container. * Iterating in backward direction. * \~russian Перебор всех элементов контейнера с доступом на чтение и запись. * Перебор осуществляется в обратном порядке. * \~ \sa \a piForeach, \a piForeachC, \a piForeachRC */ #define piForeachR(i, c) for(i : PIReverseWrap(c)) /*! \brief * \~english Macro for iterate any container * \~russian Макрос для перебора любых контейнеров * \~\deprecated * \~english Deprecated, using only for backward compatibility. Use * [C++ Range-based for loop](https://en.cppreference.com/w/cpp/language/range-for). * \~russian Устарело, используется только для обратной совместимости. Используйте * [C++ Range-based for loop](https://ru.cppreference.com/w/cpp/language/range-for). * \~\details * \~english Get read only access to each element of container. * Iterating in backward direction. Also has alias **piForeachCR** * \~russian Перебор всех элементов контейнера с доступом только на чтение. * Перебор осуществляется в обратном порядке. Также можно писать **piForeachCR** * \~ \sa \a piForeach, \a piForeachC, \a piForeachR */ #define piForeachRC(i, c) for(const i : PIReverseWrap(c)) #define piForeachCR piForeachRC #endif // PICONTAINERS_H