/** \class PIMap * \brief Associative array * \details This class used to store Key = Value array of any * type of data. \a value() returns value for key and leave map * unchaged in any case. \a operator [] create entry in map if * there is no entry for given key. You can retrieve all * keys by method \a keys() and all values by methos \a values(). * To iterate all entries use class PIMapIterator, or methods * \a makeIterator() and \a makeReverseIterator(). * \fn PIMap::PIMap(); * \brief Contructs an empty map * \fn PIMap::PIMap(const PIMap & other); * \brief Contructs a copy of "other" * \fn PIMap & PIMap::operator =(const PIMap & other); * \brief Copy operator * \fn PIMap::PIMap(const PIMap & other); * \brief Contructs a copy of "other" * * * * \fn PIMapIterator PIMap::makeIterator() const * \brief Returns PIMapIterator for this map * \fn PIMapIterator PIMap::makeReverseIterator() const * \brief Returns reverse PIMapIterator for this map * \fn size_t PIMap::size() const * \brief Returns entries count * \fn int PIMap::size_s() const * \brief Returns entries count * \fn size_t PIMap::length() const * \brief Returns entries count * \fn bool PIMap::isEmpty() const * \brief Returns if map is empty * \fn T & PIMap::operator [](const Key & key) * \brief Returns value for key "key". If there is no key in map, create one. * \fn const T PIMap::operator [](const Key & key) const * \brief Returns value for key "key". If there is no key in map, returns default T(). * \fn T & PIMap::at(const Key & key) * \brief Equivalent to operator [] * \fn const T PIMap::at(const Key & key) const * \brief Equivalent to operator [] * \fn PIMap & PIMap::operator <<(const PIMap & other) * \brief Insert all etries of "other" to this map. Override existing values. * \fn bool PIMap::operator ==(const PIMap & t) const * \brief Compare operator * \fn bool PIMap::operator !=(const PIMap & t) const * \brief Compare operator * \fn bool PIMap::contains(const Key & key) const * \brief Returns "true" if map contains entry with key "key" * \fn PIMap & PIMap::reserve(size_t new_size) * \brief Reserve space for "new_size" entries * \fn PIMap & PIMap::removeOne(const Key & key) * \brief Remove entry with key "key" * \fn PIMap & PIMap::remove(const Key & key) * \brief Equivalent \a removeOne(key) * \fn PIMap & PIMap::erase(const Key & key) * \brief Equivalent \a removeOne(key) * \fn PIMap & PIMap::clear() * \brief Clear map * \fn void PIMap::swap(PIMap & other) * \brief Swap map with "other" * \fn PIMap & PIMap::insert(const Key & key, const T & value) * \brief Insert or rewrite entry with key "key" and value "value" * \fn const T PIMap::value(const Key & key, const T & default = T()) * \brief Returns value for key "key". If there is no key in map, returns "default". * \fn PIVector PIMap::values() const * \brief Returns all values as PIVector * \fn Key PIMap::key(const T & value, const Key & default = Key()) const * \brief Returns key for first founded value "value". If there is no such value in map, returns "default". * \fn PIVector PIMap::keys() const * \brief Returns all keys as PIVector * */ /** \class PIMapIterator * \brief Helper class to iterate over PIMap * \details This class used to access keys and values in PIMap. * You can use constructor to create iterator, or use \a PIMap::makeIterator() * and \a PIMap::makeReverseIterator() methods. * * First usage variant: * \code * PIMap m; * m[1] = "one"; * m[2] = "two"; * m[4] = "four"; * * auto it = m.makeIterator(); * while (it.next()) { * piCout << it.key() << it.value(); * } * // 1 one * // 2 two * // 4 four * \endcode * * Using hasNext(): * \code * while (it.hasNext()) { * it.next(); * \endcode * * Using constructor: * \code * PIMapIterator it(m); * \endcode * * Write access: * \code * while (it.next()) { * it.valueRef().append("_!"); * piCout << it.key() << it.value(); * } * * // 1 one_! * // 2 two_! * // 4 four_! * \endcode * * Reverse iterator: * \code * auto it = m.makeReverseIterator(); * while (it.next()) { * piCout << it.key() << it.value(); * } * * // 4 four * // 2 two * // 1 one * \endcode * \fn PIMapIterator(const PIMap & map, bool reverse = false) * \brief Contructs iterator for "map". Current position is invalid. * \fn const Key & PIMapIterator::key() const * \brief Returns current entry key * \fn const T & PIMapIterator::value() const * \brief Returns current entry value * \fn T & PIMapIterator::valueRef() const * \brief Returns reference to current entry value * \fn bool PIMapIterator::hasNext() * \brief Returns if iterator can jump to next entry * \fn bool PIMapIterator::next() * \brief Jump to next entry and return if new position is valid. * \fn void PIMapIterator::reset() * \brief Reset iterator to initial position. * */