PIDeque fix ssize_t

fix uninitialized variables
fix PIDeque prepend with std::initializer_list
This commit is contained in:
Бычков Андрей
2022-07-22 16:31:40 +03:00
parent f5953a0ba7
commit 0116387fe3
6 changed files with 45 additions and 44 deletions

View File

@@ -3,7 +3,7 @@ cmake_policy(SET CMP0017 NEW) # need include() with .cmake
project(pip) project(pip)
set(pip_MAJOR 2) set(pip_MAJOR 2)
set(pip_MINOR 94) set(pip_MINOR 94)
set(pip_REVISION 0) set(pip_REVISION 1)
set(pip_SUFFIX ) set(pip_SUFFIX )
set(pip_COMPANY SHS) set(pip_COMPANY SHS)
set(pip_DOMAIN org.SHS) set(pip_DOMAIN org.SHS)

View File

@@ -20,11 +20,11 @@
#include "picontainers.h" #include "picontainers.h"
const ssize_t minAlloc = 64; const size_t minAlloc = 64;
ssize_t _PIContainerConstantsBase::calcMinCountPoT(ssize_t szof) { size_t _PIContainerConstantsBase::calcMinCountPoT(size_t szof) {
ssize_t ret = 0, elc = 1; size_t ret = 0, elc = 1;
while (elc * szof < minAlloc) { while (elc * szof < minAlloc) {
elc *= 2; elc *= 2;
++ret; ++ret;

View File

@@ -65,13 +65,13 @@ private:
class PIP_EXPORT _PIContainerConstantsBase { class PIP_EXPORT _PIContainerConstantsBase {
public: public:
static ssize_t calcMinCountPoT(ssize_t szof); static size_t calcMinCountPoT(size_t szof);
}; };
template<typename T> template<typename T>
class _PIContainerConstants { class _PIContainerConstants {
public: public:
static ssize_t minCountPoT() {static ssize_t ret = _PIContainerConstantsBase::calcMinCountPoT(sizeof(T)); return ret;} static size_t minCountPoT() {static size_t ret = _PIContainerConstantsBase::calcMinCountPoT(sizeof(T)); return ret;}
}; };

View File

@@ -689,7 +689,7 @@ public:
//! \endcode //! \endcode
//! \~\sa \a every(), \a contains(), \a entries(), \a forEach() //! \~\sa \a every(), \a contains(), \a entries(), \a forEach()
inline bool any(std::function<bool(const T & e)> test) const { inline bool any(std::function<bool(const T & e)> test) const {
for (ssize_t i = pid_start; i < pid_start + (ssize_t)pid_size; ++i) { for (size_t i = pid_start; i < pid_start + pid_size; ++i) {
if (test(pid_data[i])) return true; if (test(pid_data[i])) return true;
} }
return false; return false;
@@ -714,7 +714,7 @@ public:
//! \endcode //! \endcode
//! \~\sa \a any(), \a contains(), \a entries(), \a forEach() //! \~\sa \a any(), \a contains(), \a entries(), \a forEach()
inline bool every(std::function<bool(const T & e)> test) const { inline bool every(std::function<bool(const T & e)> test) const {
for (ssize_t i = pid_start; i < pid_start + (ssize_t)pid_size; ++i) { for (size_t i = pid_start; i < pid_start + pid_size; ++i) {
if (!test(pid_data[i])) return false; if (!test(pid_data[i])) return false;
} }
return true; return true;
@@ -825,7 +825,7 @@ public:
start = pid_size + start; start = pid_size + start;
if (start < 0) start = 0; if (start < 0) start = 0;
} }
for (ssize_t i = pid_start + start; i < pid_start + (ssize_t)pid_size; ++i) { for (size_t i = pid_start + size_t(start); i < pid_start + pid_size; ++i) {
if (e == pid_data[i]) return true; if (e == pid_data[i]) return true;
} }
return false; return false;
@@ -856,13 +856,13 @@ public:
//! piCout << v.entries(2, -4); // 2 //! piCout << v.entries(2, -4); // 2
//! \endcode //! \endcode
//! \~\sa \a every(), \a any(), \a contains(), \a forEach(), \a indexOf() //! \~\sa \a every(), \a any(), \a contains(), \a forEach(), \a indexOf()
inline int entries(const T & e, size_t start = 0) const { inline int entries(const T & e, ssize_t start = 0) const {
int ec = 0; int ec = 0;
if (start < 0) { if (start < 0) {
start = pid_size + start; start = pid_size + start;
if (start < 0) start = 0; if (start < 0) start = 0;
} }
for (ssize_t i = pid_start + start; i < pid_start + (ssize_t)pid_size; ++i) { for (size_t i = pid_start + size_t(start); i < pid_start + pid_size; ++i) {
if (e == pid_data[i]) ++ec; if (e == pid_data[i]) ++ec;
} }
return ec; return ec;
@@ -890,13 +890,13 @@ public:
//! Обратите внимание: если индекс отрицателен, массив всё равно просматривается от начала к концу. //! Обратите внимание: если индекс отрицателен, массив всё равно просматривается от начала к концу.
//! Значение по умолчанию равно 0, что означает, что просматривается весь массив. //! Значение по умолчанию равно 0, что означает, что просматривается весь массив.
//! \~\sa \a every(), \a any(), \a contains(), \a forEach(), \a indexWhere() //! \~\sa \a every(), \a any(), \a contains(), \a forEach(), \a indexWhere()
inline int entries(std::function<bool(const T & e)> test, size_t start = 0) const { inline int entries(std::function<bool(const T & e)> test, ssize_t start = 0) const {
int ec = 0; int ec = 0;
if (start < 0) { if (start < 0) {
start = pid_size + start; start = pid_size + start;
if (start < 0) start = 0; if (start < 0) start = 0;
} }
for (ssize_t i = pid_start + start; i < pid_start + (ssize_t)pid_size; ++i) { for (size_t i = pid_start + size_t(start); i < pid_start + pid_size; ++i) {
if (test(pid_data[i])) ++ec; if (test(pid_data[i])) ++ec;
} }
return ec; return ec;
@@ -931,14 +931,14 @@ public:
//! piCout << v.indexOf(2, -3); // 0 //! piCout << v.indexOf(2, -3); // 0
//! \endcode //! \endcode
//! \~\sa \a indexWhere(), \a lastIndexOf(), \a lastIndexWhere(), \a contains() //! \~\sa \a indexWhere(), \a lastIndexOf(), \a lastIndexWhere(), \a contains()
inline ssize_t indexOf(const T & e, size_t start = 0) const { inline ssize_t indexOf(const T & e, ssize_t start = 0) const {
if (start < 0) { if (start < 0) {
start = pid_size + start; start = pid_size + start;
if (start < 0) start = 0; if (start < 0) start = 0;
} }
for (ssize_t i = pid_start + start; i < pid_start + (ssize_t)pid_size; ++i) { for (size_t i = pid_start + size_t(start); i < pid_start + pid_size; ++i) {
if (e == pid_data[i]) { if (e == pid_data[i]) {
return i - pid_start; return ssize_t(i) - pid_start;
} }
} }
return -1; return -1;
@@ -972,14 +972,14 @@ public:
//! piCout << v.indexWhere([](const PIString & s){return s.startsWith('k');}); // -1 //! piCout << v.indexWhere([](const PIString & s){return s.startsWith('k');}); // -1
//! \endcode //! \endcode
//! \~\sa \a indexOf(), \a lastIndexOf(), \a lastIndexWhere(), \a contains() //! \~\sa \a indexOf(), \a lastIndexOf(), \a lastIndexWhere(), \a contains()
inline ssize_t indexWhere(std::function<bool(const T & e)> test, size_t start = 0) const { inline ssize_t indexWhere(std::function<bool(const T & e)> test, ssize_t start = 0) const {
if (start < 0) { if (start < 0) {
start = pid_size + start; start = pid_size + start;
if (start < 0) start = 0; if (start < 0) start = 0;
} }
for (ssize_t i = pid_start + start; i < pid_start + (ssize_t)pid_size; ++i) { for (size_t i = pid_start + size_t(start); i < pid_start + pid_size; ++i) {
if (test(pid_data[i])) { if (test(pid_data[i])) {
return i - pid_start; return ssize_t(i) - pid_start;
} }
} }
return -1; return -1;
@@ -1022,9 +1022,9 @@ public:
inline ssize_t lastIndexOf(const T & e, ssize_t start = -1) const { inline ssize_t lastIndexOf(const T & e, ssize_t start = -1) const {
if (start >= size_s()) start = pid_size - 1; if (start >= size_s()) start = pid_size - 1;
if (start < 0) start = pid_size + start; if (start < 0) start = pid_size + start;
for (ssize_t i = pid_start + start; i >= pid_start; --i) { for (size_t i = pid_start + size_t(start); i >= pid_start; --i) {
if (e == pid_data[i]) { if (e == pid_data[i]) {
return i - pid_start; return ssize_t(i) - pid_start;
} }
} }
return -1; return -1;
@@ -1058,9 +1058,9 @@ public:
inline ssize_t lastIndexWhere(std::function<bool(const T & e)> test, ssize_t start = -1) const { inline ssize_t lastIndexWhere(std::function<bool(const T & e)> test, ssize_t start = -1) const {
if (start >= size_s()) start = pid_size - 1; if (start >= size_s()) start = pid_size - 1;
if (start < 0) start = pid_size + start; if (start < 0) start = pid_size + start;
for (ssize_t i = pid_start + start; i >= pid_start; --i) { for (size_t i = pid_start + size_t(start); i >= pid_start; --i) {
if (test(pid_data[i])) { if (test(pid_data[i])) {
return i - pid_start; return ssize_t(i) - pid_start;
} }
} }
return -1; return -1;
@@ -1406,7 +1406,7 @@ public:
inline PIDeque<T> & insert(size_t index, std::initializer_list<T> init_list) { inline PIDeque<T> & insert(size_t index, std::initializer_list<T> init_list) {
bool dir = pid_rsize <= 2 ? true : (index >= pid_rsize / 2 ? true : false); bool dir = pid_rsize <= 2 ? true : (index >= pid_rsize / 2 ? true : false);
if (dir) { if (dir) {
ssize_t os = pid_size - index; ssize_t os = ssize_t(pid_size) - index;
alloc_forward(pid_size + init_list.size()); alloc_forward(pid_size + init_list.size());
if (os > 0) { if (os > 0) {
memmove((void*)(&(pid_data[index + pid_start + init_list.size()])), (const void*)(&(pid_data[index + pid_start])), os * sizeof(T)); memmove((void*)(&(pid_data[index + pid_start + init_list.size()])), (const void*)(&(pid_data[index + pid_start])), os * sizeof(T));
@@ -1461,7 +1461,7 @@ public:
piSwap<T*>(pid_data, other.pid_data); piSwap<T*>(pid_data, other.pid_data);
piSwap<size_t>(pid_size, other.pid_size); piSwap<size_t>(pid_size, other.pid_size);
piSwap<size_t>(pid_rsize, other.pid_rsize); piSwap<size_t>(pid_rsize, other.pid_rsize);
piSwap<ssize_t>(pid_start, other.pid_start); piSwap<size_t>(pid_start, other.pid_start);
} }
//! \~english Sorts the elements in non-descending order. //! \~english Sorts the elements in non-descending order.
@@ -1608,7 +1608,7 @@ public:
//! \endcode //! \endcode
//! \~\sa \a remove(), \a removeOne(), \a removeWhere() //! \~\sa \a remove(), \a removeOne(), \a removeWhere()
inline PIDeque<T> & removeAll(const T & e) { inline PIDeque<T> & removeAll(const T & e) {
for (ssize_t i = 0; i < ssize_t(pid_size); ++i) { for (size_t i = 0; i < pid_size; ++i) {
if (pid_data[i + pid_start] == e) { if (pid_data[i + pid_start] == e) {
remove(i); remove(i);
--i; --i;
@@ -1629,7 +1629,7 @@ public:
//! \endcode //! \endcode
//! \~\sa \a remove(), \a removeOne(), \a removeWhere() //! \~\sa \a remove(), \a removeOne(), \a removeWhere()
inline PIDeque<T> & removeWhere(std::function<bool(const T & e)> test) { inline PIDeque<T> & removeWhere(std::function<bool(const T & e)> test) {
for (ssize_t i = 0; i < ssize_t(pid_size); ++i) { for (size_t i = 0; i < pid_size; ++i) {
if (test(pid_data[i + pid_start])) { if (test(pid_data[i + pid_start])) {
remove(i); remove(i);
--i; --i;
@@ -1938,7 +1938,7 @@ public:
//! Добавляет элементы из //! Добавляет элементы из
//! [списка инициализации C++11](https://ru.cppreference.com/w/cpp/utility/initializer_list). //! [списка инициализации C++11](https://ru.cppreference.com/w/cpp/utility/initializer_list).
//! \~\sa \a append() //! \~\sa \a append()
inline PIDeque<T> & prepend(std::initializer_list<T> init_list) {return prepend(init_list);} inline PIDeque<T> & prepend(std::initializer_list<T> init_list) {return push_front(init_list);}
//! \~english Remove one element from the end of the array. //! \~english Remove one element from the end of the array.
//! \~russian Удаляет один элемент с конца массива. //! \~russian Удаляет один элемент с конца массива.
@@ -2280,7 +2280,8 @@ private:
if (pid_rsize + pid_rsize >= size_t(s) && pid_rsize < size_t(s)) { if (pid_rsize + pid_rsize >= size_t(s) && pid_rsize < size_t(s)) {
return pid_rsize + pid_rsize; return pid_rsize + pid_rsize;
} }
ssize_t t = _PIContainerConstants<T>::minCountPoT(), s_ = s - 1; size_t t = _PIContainerConstants<T>::minCountPoT();
size_t s_ = s - 1;
while (s_ >> t) while (s_ >> t)
++t; ++t;
return (1 << t); return (1 << t);
@@ -2348,8 +2349,8 @@ private:
inline void checkMove() { inline void checkMove() {
if (pid_size >= 4) { if (pid_size >= 4) {
if (pid_size < pid_rsize / 6) { if (pid_size < pid_rsize / 6) {
if (pid_start < ssize_t(pid_size + pid_size) || pid_start > (ssize_t(pid_rsize) - ssize_t(pid_size) - ssize_t(pid_size))) { if (pid_start < (pid_size + pid_size) || ssize_t(pid_start) > (ssize_t(pid_rsize) - ssize_t(pid_size) - ssize_t(pid_size))) {
ssize_t ns = (pid_rsize - pid_size) / 2; size_t ns = (pid_rsize - pid_size) / 2;
if (pid_start != ns) { if (pid_start != ns) {
memmove((void*)(pid_data + ns), (const void*)(pid_data + pid_start), pid_size * sizeof(T)); memmove((void*)(pid_data + ns), (const void*)(pid_data + pid_start), pid_size * sizeof(T));
pid_start = ns; pid_start = ns;
@@ -2357,7 +2358,7 @@ private:
} }
} }
} else { } else {
ssize_t ns = (pid_rsize - pid_size) / 2; size_t ns = (pid_rsize - pid_size) / 2;
if (pid_start != ns) { if (pid_start != ns) {
memmove((void*)(pid_data + ns), (const void*)(pid_data + pid_start), pid_size * sizeof(T)); memmove((void*)(pid_data + ns), (const void*)(pid_data + pid_start), pid_size * sizeof(T));
pid_start = ns; pid_start = ns;
@@ -2387,14 +2388,14 @@ private:
} }
inline void alloc_backward(size_t new_size, ssize_t start_offset = 0) { //alloc backward inline void alloc_backward(size_t new_size, ssize_t start_offset = 0) { //alloc backward
size_t as; size_t as;
if (pid_start + start_offset < 0) { if (ssize_t(pid_start) + start_offset < 0) {
as = asize(pid_rsize - start_offset); as = asize(pid_rsize - start_offset);
} else { } else {
as = pid_rsize; as = pid_rsize;
} }
if (as > pid_rsize) { if (as > pid_rsize) {
T * td = (T*)(malloc(as * sizeof(T))); T * td = (T*)(malloc(as * sizeof(T)));
ssize_t ns = pid_start + as - pid_rsize; size_t ns = pid_start + as - pid_rsize;
PIINTROSPECTION_CONTAINER_ALLOC(T, (as-pid_rsize)) PIINTROSPECTION_CONTAINER_ALLOC(T, (as-pid_rsize))
if (pid_rsize > 0 && pid_data != 0) { if (pid_rsize > 0 && pid_data != 0) {
memcpy((void*)(td + ns), (const void*)(pid_data + pid_start), pid_size * sizeof(T)); memcpy((void*)(td + ns), (const void*)(pid_data + pid_start), pid_size * sizeof(T));
@@ -2410,8 +2411,9 @@ private:
} }
T * pid_data; T * pid_data;
size_t pid_size, pid_rsize; size_t pid_size;
ssize_t pid_start; size_t pid_rsize;
size_t pid_start;
}; };

View File

@@ -563,6 +563,8 @@ void PIBinaryLog::parseLog(PIFile * f, PIBinaryLog::BinLogInfo * info, PIVector<
if (!ok) return; if (!ok) return;
PIByteArray ba; PIByteArray ba;
BinLogRecord br; BinLogRecord br;
br.id = 0;
br.size = 0;
bool first = true; bool first = true;
size_t hdr_size = sizeof(BinLogRecord) - sizeof(PIByteArray); size_t hdr_size = sizeof(BinLogRecord) - sizeof(PIByteArray);
ba.resize(hdr_size); ba.resize(hdr_size);
@@ -571,12 +573,9 @@ void PIBinaryLog::parseLog(PIFile * f, PIBinaryLog::BinLogInfo * info, PIVector<
{ {
if (f->read(ba.data(), ba.size()) > 0) { if (f->read(ba.data(), ba.size()) > 0) {
ba >> br.id >> br.size >> br.timestamp; ba >> br.id >> br.size >> br.timestamp;
} else } else break;
break; if (info->log_size - f->pos() >= br.size) f->seek(f->pos() + br.size);
if (info->log_size - f->pos() >= br.size) else break;
f->seek(f->pos() + br.size);
else
break;
} }
if (br.id > 0) { if (br.id > 0) {
if (info) { if (info) {

View File

@@ -211,9 +211,9 @@ public:
WriteConsoleInput(cstdin, ir.data(), ir.size_s(), &wrote); WriteConsoleInput(cstdin, ir.data(), ir.size_s(), &wrote);
} break; } break;
case mtResize: { case mtResize: {
int rw, rh; int rw = -1, rh = -1;
msg >> rw >> rh; msg >> rw >> rh;
resizeConsole(rw, rh); if (rw > 0 && rh > 0) resizeConsole(rw, rh);
} break; } break;
default: break; default: break;
} }