From 170a71335701c8c0aec3c0d8441b3b38eb54edbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=8B=D1=87=D0=BA=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9?= Date: Thu, 4 Aug 2022 20:20:08 +0300 Subject: [PATCH] PIMap new functions PIByteArray checksum crc some doc fixes --- libs/main/containers/pimap.cpp | 3 + libs/main/containers/pimap.h | 458 +++++++++++++++++++++---- libs/main/containers/pistack.h | 8 +- libs/main/core/pibytearray.cpp | 14 + libs/main/core/pibytearray.h | 12 + libs/main/io_utils/piconnection.cpp | 2 +- libs/main/math/pimathmatrix.h | 18 +- utils/cloud_dispatcher/cloudserver.cpp | 2 +- 8 files changed, 436 insertions(+), 81 deletions(-) diff --git a/libs/main/containers/pimap.cpp b/libs/main/containers/pimap.cpp index 3c0b0034..008ae5d9 100644 --- a/libs/main/containers/pimap.cpp +++ b/libs/main/containers/pimap.cpp @@ -19,6 +19,9 @@ * \fn PIMap::PIMap(const PIMap & other); * \brief Contructs a copy of "other" + * + * + * * \fn PIMapIterator PIMap::makeIterator() const * \brief Returns PIMapIterator for this map diff --git a/libs/main/containers/pimap.h b/libs/main/containers/pimap.h index 4c10a2bb..9863ffab 100644 --- a/libs/main/containers/pimap.h +++ b/libs/main/containers/pimap.h @@ -42,25 +42,81 @@ template class PIMapIterator; +template +class PIMapReverseIterator; + +//! \addtogroup Containers +//! \{ +//! \class PIMap +//! \brief +//! \~english Associative array. +//! \~russian Словарь. +//! \~\} +//! \details +//! \~english +//! A collection of key/value pairs, from which you retrieve a value using its associated key. +//! There is a finite number of keys in the map, and each key has exactly one value associated with it. +//! \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(). +//! A key in the Map may only occur once. +//! \~russian +//! Словари, в принципе, похожи на обычные, используемые в повседневной жизни. +//! Они хранят элементы одного и того же типа, индексируемые ключевыми значениями. +//! Достоинство словаря в том, что он позволяет быстро получать значение, +//! ассоциированное с заданным ключом. +//! Ключи должны быть уникальными. +//! Элемент +//! В контейнеры этого типа заносятся элементы вместе с ключами, +//! по которым их можно найти, которыми могут выступать значения любого типа. +//! \a operator [] позволяет получить доступ к элементу по ключу, +//! и если такого эелемента небыло, то он будет создан. template class PIMap { template friend class PIMapIterator; + template friend class PIMapReverseIterator; template friend PIBinaryStream

& operator <<(PIBinaryStream

& s, const PIMap & v); template friend PIBinaryStream

& operator >>(PIBinaryStream

& s, PIMap & v); public: - PIMap() {;} + typedef T mapped_type; + typedef Key key_type; + typedef PIPair value_type; + + //! \~english Constructs an empty map. + //! \~russian Создает пустой словарь. + PIMap() {} + + //! \~english Copy constructor. + //! \~russian Копирующий конструктор. PIMap(const PIMap & other) {*this = other;} + + //! \~english Move constructor. + //! \~russian Перемещающий конструктор. PIMap(PIMap && other) : pim_content(std::move(other.pim_content)), pim_index(std::move(other.pim_index)) {} + + //! \~english Contructs map from + //! [C++11 initializer list](https://en.cppreference.com/w/cpp/utility/initializer_list). + //! \~russian Создает словарь из + //! [списка инициализации C++11](https://ru.cppreference.com/w/cpp/utility/initializer_list). + //! \~\details + //! \~\code + //! PIMap m{{1, "a"}, {2, "b"}}; + //! piCout << m; // {1, 2, 3} + //! \endcode PIMap(std::initializer_list> init_list) { for (auto i: init_list) { insert(std::get<0>(i), std::get<1>(i)); } } - virtual ~PIMap() {;} + //! \~english Assign operator. + //! \~russian Оператор присваивания. PIMap & operator =(const PIMap & other) { if (this == &other) return *this; clear(); @@ -69,14 +125,12 @@ public: return *this; } + //! \~english Assign move operator. + //! \~russian Оператор перемещающего присваивания. PIMap & operator =(PIMap && other) { swap(other); return *this; } - - typedef T mapped_type; - typedef Key key_type; - typedef PIPair value_type; class iterator { friend class PIMap; @@ -88,7 +142,9 @@ public: iterator(): parent(nullptr), pos(0) {} const Key & key() const {return const_cast * >(parent)->_key(pos);} T & value() {return const_cast * >(parent)->_value(pos);} - inline PIPair operator *() const {return PIPair(const_cast * >(parent)->_key(pos), const_cast * >(parent)->_value(pos));} + inline PIPair operator *() const { + return PIPair(const_cast * >(parent)->_key(pos), const_cast * >(parent)->_value(pos)); + } void operator ++() {++pos;} void operator ++(int) {++pos;} void operator --() {--pos;} @@ -107,7 +163,9 @@ public: reverse_iterator(): parent(nullptr), pos(0) {} const Key & key() const {return const_cast * >(parent)->_key(pos);} T & value() const {return const_cast * >(parent)->_value(pos);} - inline PIPair operator *() const {return PIPair(const_cast * >(parent)->_key(pos), const_cast * >(parent)->_value(pos));} + inline PIPair operator *() const { + return PIPair(const_cast * >(parent)->_key(pos), const_cast * >(parent)->_value(pos)); + } void operator ++() {--pos;} void operator ++(int) {--pos;} void operator --() {++pos;} @@ -152,26 +210,45 @@ public: bool operator !=(const const_reverse_iterator & it) const {return (pos != it.pos);} }; + iterator begin() {return iterator(this, 0);} + iterator end() {return iterator(this, size());} + const_iterator begin() const {return const_iterator(this, 0);} + const_iterator end() const {return const_iterator(this, size());} + const_iterator constBegin() const {return const_iterator(this, 0);} + const_iterator constEnd() const {return const_iterator(this, size());} + reverse_iterator rbegin() {return reverse_iterator(this, size() - 1);} + reverse_iterator rend() {return reverse_iterator(this, -1);} + const_reverse_iterator rbegin() const {return const_reverse_iterator(this, size() - 1);} + const_reverse_iterator rend() const {return const_reverse_iterator(this, -1);} + const_reverse_iterator constRbegin() const {return const_reverse_iterator(this, size() - 1);} + const_reverse_iterator constRend() const {return const_reverse_iterator(this, -1);} + //! \relatesalso PIMapIterator PIMapIterator makeIterator() const {return PIMapIterator(*this);} - PIMapIterator makeReverseIterator() const {return PIMapIterator(*this, true);} + + //! \relatesalso PIMapReverseIterator + PIMapReverseIterator makeReverseIterator() const {return PIMapReverseIterator(*this);} size_t size() const {return pim_content.size();} + int size_s() const {return pim_content.size_s();} + size_t length() const {return pim_content.size();} + bool isEmpty() const {return (pim_content.size() == 0);} + bool isNotEmpty() const {return (pim_content.size() > 0);} T & operator [](const Key & key) { @@ -183,6 +260,15 @@ public: return pim_content.back(); } T at(const Key & key) const {return value(key);} + + T take(const Key & key) const { + bool f(false); + ssize_t i = _find(key, f); + if (!f) return T(); + T ret(pim_content[pim_index[i].index]); + _remove(i); + return ret; + } PIMap & operator <<(const PIMap & other) { #ifndef NDEBUG @@ -192,24 +278,66 @@ public: #endif assert(&other != this); if (other.isEmpty()) return *this; - if (other.size() == 1) {insert(other.pim_index[0].key, other.pim_content[0]); return *this;} - if (other.size() == 2) {insert(other.pim_index[0].key, other.pim_content[0]); insert(other.pim_index[1].key, other.pim_content[1]); return *this;} + if (other.size() == 1) { + insert(other.pim_index[0].key, other.pim_content[0]); + return *this; + } + if (other.size() == 2) { + insert(other.pim_index[0].key, other.pim_content[0]); + insert(other.pim_index[1].key, other.pim_content[1]); + return *this; + } for (int i = 0; i < other.pim_index.size_s(); ++i) { insert(other.pim_index[i].key, other.pim_content[other.pim_index[i].index]); } return *this; } - bool operator ==(const PIMap & t) const {return (pim_content == t.pim_content && pim_index == t.pim_index);} - bool operator !=(const PIMap & t) const {return (pim_content != t.pim_content || pim_index != t.pim_index);} - bool contains(const Key & key) const {bool f(false); _find(key, f); return f;} + bool operator ==(const PIMap & t) const { + return (pim_content == t.pim_content && pim_index == t.pim_index); + } + bool operator !=(const PIMap & t) const { + return (pim_content != t.pim_content || pim_index != t.pim_index); + } + bool contains(const Key & key) const { + bool f(false); _find(key, f); + return f; + } - PIMap & reserve(size_t new_size) {pim_content.reserve(new_size); pim_index.reserve(new_size); return *this;} + bool containsValue(const T & value) const { + return pim_content.contains(value); + } - PIMap & removeOne(const Key & key) {bool f(false); ssize_t i = _find(key, f); if (f) _remove(i); return *this;} - PIMap & remove(const Key & key) {return removeOne(key);} - PIMap & erase(const Key & key) {return removeOne(key);} - PIMap & clear() {pim_content.clear(); pim_index.clear(); return *this;} + PIMap & reserve(size_t new_size) { + pim_content.reserve(new_size); + pim_index.reserve(new_size); + return *this; + } + + PIMap & remove(const Key & key) { + bool f(false); + ssize_t i = _find(key, f); + if (f) _remove(i); + return *this; + } + + + PIMap & removeWhere(std::function test) { + for (int i = 0; i < pim_index.size_s(); ++i) { + if (pim_index[i].key, pim_content[pim_index[i].index]) { + _remove(i); + --i; + } + } + } + + PIMap & erase(const Key & key) {return remove(key);} + + PIMap & clear() { + pim_content.clear(); + pim_index.clear(); + return *this; + } void swap(PIMap & other) { pim_content.swap(other.pim_content); @@ -219,7 +347,6 @@ public: PIMap & insert(const Key & key, const T & value) { bool f(false); ssize_t i = _find(key, f); - //piCout << "insert key=" << key << "found=" << f << "index=" << i << "value=" << value; if (f) { pim_content[pim_index[i].index] = value; } else { @@ -231,7 +358,6 @@ public: PIMap & insert(const Key & key, T && value) { bool f(false); ssize_t i = _find(key, f); - //piCout << "insert key=" << key << "found=" << f << "index=" << i << "value=" << value; if (f) { pim_content[pim_index[i].index] = std::move(value); } else { @@ -240,28 +366,85 @@ public: } return *this; } - T value(const Key & key, const T & default_ = T()) const {bool f(false); ssize_t i = _find(key, f); if (!f) return default_; return pim_content[pim_index[i].index];} + PIMap & insert(const PIPair & pair) { + bool f(false); + ssize_t i = _find(pair.first, f); + if (f) { + pim_content[pim_index[i].index] = pair.second; + } else { + pim_content.push_back(pair.second); + pim_index.insert(i, MapIndex(pair.first, pim_content.size() - 1)); + } + return *this; + } + PIMap & insert(PIPair && pair) { + bool f(false); + Key k(std::move(pair.first)); + ssize_t i = _find(k, f); + if (f) { + pim_content[pim_index[i].index] = std::move(pair.second); + } else { + pim_content.push_back(std::move(pair.second)); + pim_index.insert(i, MapIndex(k, pim_content.size() - 1)); + } + return *this; + } + + T value(const Key & key, const T & default_ = T()) const { + bool f(false); + ssize_t i = _find(key, f); + if (!f) return default_; + return pim_content[pim_index[i].index]; + } + PIVector values() const {return pim_content;} - Key key(const T & value_, const Key & default_ = Key()) const {for (int i = 0; i < pim_index.size_s(); ++i) if (pim_content[pim_index[i].index] == value_) return pim_index[i].key; return default_;} + + Key key(const T & value_, const Key & default_ = Key()) const { + for (int i = 0; i < pim_index.size_s(); ++i) { + if (pim_content[pim_index[i].index] == value_) { + return pim_index[i].key; + } + } + return default_; + } + PIVector keys() const { PIVector ret; - for (int i = 0; i < pim_index.size_s(); ++i) + ret.reserve(pim_index.size()); + for (int i = 0; i < pim_index.size_s(); ++i) { ret << pim_index[i].key; + } + return ret; + } + + void forEach(std::function f) const { + for (int i = 0; i < pim_index.size_s(); ++i) { + f(pim_index[i].key, pim_content[pim_index[i].index]); + } + } + + template + inline PIMap map(std::function(const Key & key, const T & value)> f) const { + PIMap ret; ret.reserve(size()); + for (int i = 0; i < pim_index.size_s(); ++i) { + ret.insert(f(pim_index[i].key, pim_content[pim_index[i].index])); + } + return ret; + } + + template + inline PIVector map(std::function f) const { + PIVector ret; ret.reserve(size()); + for (int i = 0; i < pim_index.size_s(); ++i) { + ret << f(pim_index[i].key, pim_content[pim_index[i].index]); + } return ret; } -// void dump() { -// piCout << "PIMap" << size() << "entries" << PICoutManipulators::NewLine << "content:"; -// for (size_t i = 0; i < pim_content.size(); ++i) -// piCout << PICoutManipulators::Tab << i << ":" << pim_content[i]; -// piCout << "index:"; -// for (size_t i = 0; i < pim_index.size(); ++i) -// piCout << PICoutManipulators::Tab << i << ":" << pim_index[i].key << "->" << pim_index[i].index; -// } - private: struct MapIndex { - MapIndex(Key k = Key(), size_t i = 0): key(k), index(i) {;} + MapIndex(const Key & k = Key(), size_t i = 0): key(k), index(i) {} + MapIndex(Key && k, size_t i = 0): key(std::move(k)), index(i) {} Key key; size_t index; bool operator ==(const MapIndex & s) const {return key == s.key;} @@ -269,6 +452,7 @@ private: bool operator <(const MapIndex & s) const {return key < s.key;} bool operator >(const MapIndex & s) const {return key > s.key;} }; + template friend PIBinaryStream

& operator >>(PIBinaryStream

& s, PIDeque::MapIndex> & v); template @@ -285,6 +469,7 @@ private: found = false; return first; } + ssize_t _find(const Key & k, bool & found) const { if (pim_index.isEmpty()) { found = false; @@ -292,75 +477,213 @@ private: } return _binarySearch(0, pim_index.size_s() - 1, k, found); } + void _remove(ssize_t index) { - //if (index >= pim_index.size()) return; size_t ci = pim_index[index].index, bi = pim_index.size() - 1; pim_index.remove(index); - for (size_t i = 0; i < pim_index.size(); ++i) + for (size_t i = 0; i < pim_index.size(); ++i) { if (pim_index[i].index == bi) { pim_index[i].index = ci; break; } + } piSwap(pim_content[ci], pim_content.back()); pim_content.resize(pim_index.size()); } + const value_type _pair(ssize_t index) const { - if (index < 0 || index >= pim_index.size_s()) - return value_type(); - //piCout << "_pair" << index << pim_index[index].index; + if (index < 0 || index >= pim_index.size_s()) return value_type(); return value_type(pim_index[index].key, pim_content[pim_index[index].index]); } + Key & _key(ssize_t index) {return pim_index[index].key;} + + const Key & _key(ssize_t index) const {return pim_index[index].key;} + T & _value(ssize_t index) {return pim_content[pim_index[index].index];} + + const T & _value(ssize_t index) const {return pim_content[pim_index[index].index];} + PIVector pim_content; PIDeque pim_index; }; +//! \addtogroup Containers +//! \{ +//! \class PIMapIterator +//! \brief +//! \~english Java-style iterator for \a PIMap. +//! \~russian Итератор Java стиля для \a PIMap. +//! \~\} +//! \details +//! \~english +//! This class used to easy serial access keys and values in PIMap. +//! You can use constructor to create iterator, or use \a PIMap::makeIterator() +//! \~russian +//! Этот класс используется для удобного перебора ключей и значений всего словаря в обратном порядке. +//! Ты можешь использовать конструктор, в который передать словарь, или функцию словаря \a PIMap::makeReverseIterator(). +//! \~ +//! \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 template class PIMapIterator { typedef PIMap MapType; public: - PIMapIterator(const PIMap & map, bool reverse = false): m(map), pos(-1), rev(reverse) { - if (rev) pos = m.size_s(); + PIMapIterator(const PIMap & map, bool reverse = false): m(map), pos(-1) {} + + //! \~english Returns current key. + //! \~russian Возвращает ключ текущего элемента. + //! \~\sa \a value(), \a valueRef() + const Key & key() const { + return m._key(pos); } - const Key & key() const {return const_cast(m)._key(pos);} - const T & value() const {return const_cast(m)._value(pos);} - T & valueRef() const {return const_cast(m)._value(pos);} + + //! \~english Returns current value. + //! \~russian Возвращает значение текущего элемента. + //! \~\sa \a key(), \a valueRef() + const T & value() const { + return m._value(pos); + } + + + //! \~english Returns current value reference. + //! \~russian Возвращает изменяемую ссылку на значение текущего элемента. + //! \~\sa \a key(), \a value() + T & valueRef() { + return const_cast(m)._value(pos); + } + + //! \~english Returns true if iterator can jump to next entry + //! \~russian Возвращает true если итератор может перейти к следующему элементу. inline bool hasNext() const { - if (rev) { - return pos > 0; - } else { - return pos < (m.size_s() - 1); - } - return false; + return pos < (m.size_s() - 1); } + + //! \~english Jump to next entry and return true if new position is valid. + //! \~russian Переходит к следующему элементу и возвращает true если он существует. inline bool next() { - if (rev) { - --pos; - return pos >= 0; - } else { - ++pos; - return pos < m.size_s(); - } - return false; + ++pos; + return pos < m.size_s(); } + + //! \~english Reset iterator to initial position. + //! \~russian Переходит на начало. inline void reset() { - if (rev) { - pos = m.size_s(); - } else { - pos = -1; - } + pos = -1; + } +private: + const MapType & m; + ssize_t pos; +}; + + +//! \addtogroup Containers +//! \{ +//! \class PIMapReverseIterator +//! \brief +//! \~english Java-style reverse iterator for \a PIMap. +//! \~russian Итератор Java стиля для \a PIMap в обратном порядке. +//! \~\} +//! \details +//! \~english +//! This class used to easy serial reverse access keys and values in PIMap. +//! You can use constructor to create iterator, or use \a PIMap::makeReverseIterator(). +//! \~russian +//! Этот класс используется для удобного перебора ключей и значений всего словаря в обратном порядке. +//! Ты можешь использовать конструктор, в который передать словарь, или функцию словаря \a PIMap::makeReverseIterator(). +//! \~ +//! \code +//! PIMap m; +//! m[1] = "one"; +//! m[2] = "two"; +//! m[4] = "four"; +//! auto it = m.makeReverseIterator(); +//! while (it.next()) { +//! piCout << it.key() << it.value(); +//! } +//! // 4 four +//! // 2 two +//! // 1 one +//! \endcode +//! \~english Write access: +//! \~russian Доступ на запись: +//! \~ +//! \code +//! while (it.next()) { +//! it.valueRef().append("_!"); +//! piCout << it.key() << it.value(); +//! } +//! // 4 four_! +//! // 2 two_! +//! // 1 one_! +//! \endcode +template +class PIMapReverseIterator { + typedef PIMap MapType; +public: + PIMapReverseIterator(const PIMap & map): m(map), pos(m.size_s()) {} + + //! \~english Returns current key. + //! \~russian Возвращает ключ текущего элемента. + //! \~\sa \a value(), \a valueRef() + const Key & key() const { + return m._key(pos); + } + + //! \~english Returns current value. + //! \~russian Возвращает значение текущего элемента. + //! \~\sa \a key(), \a valueRef() + const T & value() const { + return m._value(pos); + } + + + //! \~english Returns current value reference. + //! \~russian Возвращает изменяемую ссылку на значение текущего элемента. + //! \~\sa \a key(), \a value() + T & valueRef() { + return const_cast(m)._value(pos); + } + + //! \~english Returns true if iterator can jump to next entry + //! \~russian Возвращает true если итератор может перейти к следующему элементу. + inline bool hasNext() const { + return pos > 0; + } + + //! \~english Jump to next entry and return true if new position is valid. + //! \~russian Переходит к следующему элементу и возвращает true если он существует. + inline bool next() { + --pos; + return pos >= 0; + } + + //! \~english Reset iterator to initial position. + //! \~russian Переходит на начало. + inline void reset() { + pos = m.size_s(); } private: const MapType & m; ssize_t pos; - bool rev; }; #ifdef PIP_STD_IOSTREAM +//! \~english Output operator to [std::ostream](https://en.cppreference.com/w/cpp/io/basic_ostream). +//! \~russian Оператор вывода в [std::ostream](https://ru.cppreference.com/w/cpp/io/basic_ostream). template inline std::ostream & operator <<(std::ostream & s, const PIMap & v) { s << "{"; @@ -376,6 +699,10 @@ inline std::ostream & operator <<(std::ostream & s, const PIMap & v) } #endif + +//! \relatesalso PICout +//! \~english Output operator to \a PICout +//! \~russian Оператор вывода в \a PICout template inline PICout operator <<(PICout s, const PIMap & v) { s.space(); @@ -393,7 +720,8 @@ inline PICout operator <<(PICout s, const PIMap & v) { return s; } -template inline void piSwap(PIMap & f, PIMap & s) {f.swap(s);} +template +inline void piSwap(PIMap & f, PIMap & s) {f.swap(s);} #endif // PIMAP_H diff --git a/libs/main/containers/pistack.h b/libs/main/containers/pistack.h index 5b65fa90..4e29502e 100644 --- a/libs/main/containers/pistack.h +++ b/libs/main/containers/pistack.h @@ -37,13 +37,7 @@ public: T pop() {return PIVector::take_back();} T & top() {return PIVector::back();} const T & top() const {return PIVector::back();} - PIVector toVector() { - PIVector v; - v.reserve(PIVector::size()); - for (uint i = 0; i < PIVector::size(); ++i) - v.push_back(PIVector::at(i)); - return v; - } + PIVector toVector() {return PIVector(*this);} }; #endif // PISTACK_H diff --git a/libs/main/core/pibytearray.cpp b/libs/main/core/pibytearray.cpp index 7786f0e9..e660d56f 100644 --- a/libs/main/core/pibytearray.cpp +++ b/libs/main/core/pibytearray.cpp @@ -20,6 +20,7 @@ #include "pibytearray.h" #include "pistringlist.h" #include +#include "picrc.h" //! \class PIByteArray pibytearray.h //! \~\details @@ -292,6 +293,19 @@ uchar PIByteArray::checksumPlain8(bool inverse) const { } +uchar PIByteArray::checksumCRC8() const { + return standardCRC_8().calculate(data(), size()); +} + +ushort PIByteArray::checksumCRC16() const { + return standardCRC_16().calculate(data(), size()); +} + +uint PIByteArray::checksumCRC32() const { + return standardCRC_32().calculate(data(), size()); +} + + //! \~\details //! \~english //! This is sum of all bytes multiplied by index+1, if inverse then add 1 and inverse. diff --git a/libs/main/core/pibytearray.h b/libs/main/core/pibytearray.h index 34e82093..301cce65 100644 --- a/libs/main/core/pibytearray.h +++ b/libs/main/core/pibytearray.h @@ -1111,6 +1111,18 @@ public: //! \~russian Возвращает 32-битную контрольную сумму uint checksumPlain32(bool inverse = true) const; + //! \~english Returns 8-bit checksum CRC-8 + //! \~russian Возвращает 8-битную контрольную сумму CRC-8 + uchar checksumCRC8() const; + + //! \~english Returns 16-bit checksum CRC-16 + //! \~russian Возвращает 16-битную контрольную сумму CRC-16 + ushort checksumCRC16() const; + + //! \~english Returns 32-bit checksum CRC-32 + //! \~russian Возвращает 32-битную контрольную сумму CRC-32 + uint checksumCRC32() const; + //! \~english Returns hash of content //! \~russian Возвращает хэш содержимого uint hash() const; diff --git a/libs/main/io_utils/piconnection.cpp b/libs/main/io_utils/piconnection.cpp index adc19c2b..45105266 100644 --- a/libs/main/io_utils/piconnection.cpp +++ b/libs/main/io_utils/piconnection.cpp @@ -376,7 +376,7 @@ bool PIConnection::removeDevice(const PIString & full_path) { if (!dev) return false; PIStringList dntd(deviceNames(dev)); for (const PIString & n : dntd) { - device_names.removeOne(n); + device_names.remove(n); } for (auto s = senders.constBegin(); s != senders.constEnd(); s++) { if (!s.value()) continue; diff --git a/libs/main/math/pimathmatrix.h b/libs/main/math/pimathmatrix.h index 1e96a3e5..f82bae66 100644 --- a/libs/main/math/pimathmatrix.h +++ b/libs/main/math/pimathmatrix.h @@ -39,16 +39,20 @@ #pragma pack(push, 1) //! \~english -//! \brief A class that works with square matrix operations, the input data of which are columns, rows and the data type of the matrix. +//! \brief A class for fixed size and type matrix. //! \tparam `Rows` rows number of matrix. //! \tparam `Сols` columns number of matrix. //! \tparam `Type` is the data type of the matrix. There are can be basic C++ language data and different classes where the arithmetic operators(=, +=, -=, *=, /=, ==, !=, +, -, *, /) //! of the C++ language are implemented //! \~russian -//! \brief Класс, работающий с операциями над квадратными матрицами, входными данными которого являются столбцы, строки и матричный типа данных. +//! \brief Класс для работы с матрицами фиксированного размера и типа данных. +//! \details В отличие от \a PIMathMatrix не занимается динамическим выделением памяти и связанными с этим операциями. +//! То есть он тривиально копируемый. +//! Содержит проверки времени компиляции на несоответствие размера при различных математических операциях, +//! что позволяет заранее выявлять ошибки. //! \tparam `Rows` количество строк матрицы. //! \tparam `Сols` количество столбцов матрицы. -//! \tparam `Type`типа данных матрицы. Здесь можеть быть базовый тип данных C++ или различные классы, +//! \tparam `Type`тип данных матрицы. Здесь можеть быть базовый тип данных C++ или различные классы, //! где реализованы арифметические операторы(=, +=, -=, *=, /=, ==, !=, +, -, *, /) языка C++. template class PIP_EXPORT PIMathMatrixT { @@ -828,12 +832,12 @@ class PIMathMatrix; #define PIMM_FOR_R for (uint i = 0; i < _V2D::rows_; ++i) //! \~english -//! \brief A class that works with matrix operations, the input data of which is the data type of the matrix. -//! @tparam `Type` There are can be basic C++ language data and different classes where the arithmetic operators(=, +=, -=, *=, /=, ==, !=, +, -, *, /) +//! \brief A class for dynamic size and fixed type matrix. +//! \tparam `Type` There are can be basic C++ language data and different classes where the arithmetic operators(=, +=, -=, *=, /=, ==, !=, +, -, *, /) //! of the C++ language are implemented. //! \~russian -//! \brief Класс, работающий с матричными операциями, входными данными которого является тип данных матрицы. -//! @tparam `Type` Здесь можеть быть базовый тип данных C++ или различные классы, +//! \brief Класс для работы с матрицами динамического размера и фиксированного типа. +//! \tparam `Type` Здесь можеть быть базовый тип данных C++ или различные классы, //! где реализованы арифметические операторы(=, +=, -=, *=, /=, ==, !=, +, -, *, /) языка C++. template class PIP_EXPORT PIMathMatrix : public PIVector2D { diff --git a/utils/cloud_dispatcher/cloudserver.cpp b/utils/cloud_dispatcher/cloudserver.cpp index ccfb411b..eed4f2d6 100644 --- a/utils/cloud_dispatcher/cloudserver.cpp +++ b/utils/cloud_dispatcher/cloudserver.cpp @@ -42,7 +42,7 @@ void CloudServer::addClient(DispatcherClient * c) { void CloudServer::removeClient(DispatcherClient * c) { last_ping.reset(); clients.removeOne(c); - index_clients.removeOne(c->clientId()); + index_clients.remove(c->clientId()); server->sendDisconnected(c->clientId()); }