From a1d77eff324ef4acfdc5de8be3dae773923ee8ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B5=D0=BB=D0=B8=D0=BF=D0=B5=D0=BD=D0=BA=D0=BE=20?= =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD?= Date: Wed, 15 Mar 2017 08:45:29 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/pip@318 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5 --- main.cpp | 20 +++++++++++-- src/console/piscreentiles.cpp | 1 + src/containers/pideque.h | 56 +++++++++++++++++++++-------------- src/math/pifft.cpp | 54 ++++++++++++++++++++++++++++----- src/math/pifft.h | 8 +++-- 5 files changed, 103 insertions(+), 36 deletions(-) diff --git a/main.cpp b/main.cpp index 5bf1c94e..2004c105 100644 --- a/main.cpp +++ b/main.cpp @@ -63,9 +63,23 @@ int main(int argc, char *argv[]) { c.start(); piMSleep(3000);*/ - PISystemTime st = PISystemTime::current(); - piCout << PIDateTime::current(); - piCout << PIDateTime::fromSystemTime(st); + /*PIScreen s; + s.enableExitCapture(PIKbdListener::F10); + s.start(); + TileList * list = new TileList(); + for (int i = 0; i < 100; ++i) + list->content << TileList::Row(i, PIScreenTypes::CellFormat()); + s.rootTile()->addTile(list); + s.waitForFinish();*/ + + PIDeque d; + d.resize(atoi(argv[1])); + while (1) { + d.push_back(1); + d.pop_front(); + piCout << d.size() << d.capacity() << d._start(); + } + return 0; } diff --git a/src/console/piscreentiles.cpp b/src/console/piscreentiles.cpp index 9b956283..93aac25c 100644 --- a/src/console/piscreentiles.cpp +++ b/src/console/piscreentiles.cpp @@ -156,6 +156,7 @@ void TileList::drawEvent(PIScreenDrawer * d) { //int osp = piMini(3, lhei / 4); int is = piClampi(offset, 0, piMaxi(0, content.size_s() - 1)), ie = piClampi(offset + lhei, 0, content.size_s()); if (is > 0) d->drawText(x_, y_, PIString(" /\\ ").repeat(width_ / 4), Green, Default, Bold); + if (ie < content.size_s()) d->drawText(x_, y_ + height_ - 1, PIString(" \\/ ").repeat(width_ / 4), Green, Default, Bold); //piCout << is << ie << offset << lhei << content.size_s(); for (int i = is; i < ie; ++i) { Row & r(content[i]); diff --git a/src/containers/pideque.h b/src/containers/pideque.h index 5c69c697..078dab78 100755 --- a/src/containers/pideque.h +++ b/src/containers/pideque.h @@ -166,6 +166,7 @@ public: ssize_t size_s() const {return pid_size;} size_t length() const {return pid_size;} size_t capacity() const {return pid_rsize;} + size_t _start() const {return pid_start;} bool isEmpty() const {return (pid_size == 0);} T & operator [](size_t index) {return pid_data[pid_start + index];} @@ -380,31 +381,40 @@ private: inline void elementDelete(T & from) {from.~T();} void dealloc() {deleteRaw(pid_data);} inline void checkMove(bool direction) { - if (pid_size >= 4 && pid_size < pid_rsize / 6) { - /*if (direction) { - if (pid_start >= 4 && pid_start > pid_size + pid_size && pid_start > pid_rsize / 2) { - piCout << (int)this << "checkMove" << direction << pid_start << (int)pid_data << pid_rsize << pid_size; - piCout << (int)this << "move from" << pid_start << "to" << pid_size << "," << (int)pid_data << pid_rsize << pid_size; - memmove(pid_data + pid_size, pid_data + pid_start, pid_size * sizeof(T)); - pid_start = pid_size; - } - } else { - if (ssize_t(pid_start) < ssize_t(pid_rsize) - pid_size - pid_size && ssize_t(pid_start) < ssize_t(pid_rsize / 2) - pid_size) { - piCout << (int)this << "checkMove" << direction << pid_start << (int)pid_data << pid_rsize << pid_size; - piCout << (int)this << "move from" << pid_start << "to" << (ssize_t(pid_rsize) - pid_size) << "," << (int)pid_data << pid_rsize << pid_size; - memmove(pid_data + ssize_t(pid_rsize) - pid_size - pid_size, pid_data + pid_start, pid_size * sizeof(T)); - pid_start = ssize_t(pid_rsize) - pid_size - pid_size; - } - }*/ - //printf("(%p) check move st=%d sz=%d rs=%d\n", this, pid_start, pid_size, pid_rsize); - if (pid_start < pid_size + pid_size || pid_start > pid_rsize - pid_size - pid_size) { - ssize_t ns = (pid_rsize - pid_size) / 2; - if (pid_start != ns) { - //printf("(%p) move %d -> %d\n", this, pid_start, ns); - memmove(pid_data + ns, pid_data + pid_start, pid_size * sizeof(T)); - pid_start = ns; + if (pid_size >= 4) { + if (pid_size < pid_rsize / 6) { + /*if (direction) { + if (pid_start >= 4 && pid_start > pid_size + pid_size && pid_start > pid_rsize / 2) { + piCout << (int)this << "checkMove" << direction << pid_start << (int)pid_data << pid_rsize << pid_size; + piCout << (int)this << "move from" << pid_start << "to" << pid_size << "," << (int)pid_data << pid_rsize << pid_size; + memmove(pid_data + pid_size, pid_data + pid_start, pid_size * sizeof(T)); + pid_start = pid_size; + } + } else { + if (ssize_t(pid_start) < ssize_t(pid_rsize) - pid_size - pid_size && ssize_t(pid_start) < ssize_t(pid_rsize / 2) - pid_size) { + piCout << (int)this << "checkMove" << direction << pid_start << (int)pid_data << pid_rsize << pid_size; + piCout << (int)this << "move from" << pid_start << "to" << (ssize_t(pid_rsize) - pid_size) << "," << (int)pid_data << pid_rsize << pid_size; + memmove(pid_data + ssize_t(pid_rsize) - pid_size - pid_size, pid_data + pid_start, pid_size * sizeof(T)); + pid_start = ssize_t(pid_rsize) - pid_size - pid_size; + } + }*/ + //printf("(%p) check move st=%d sz=%d rs=%d\n", this, pid_start, pid_size, pid_rsize); + if (pid_start < pid_size + pid_size || pid_start > pid_rsize - pid_size - pid_size) { + ssize_t ns = (pid_rsize - pid_size) / 2; + if (pid_start != ns) { + //printf("(%p) move %d -> %d\n", this, pid_start, ns); + memmove(pid_data + ns, pid_data + pid_start, pid_size * sizeof(T)); + pid_start = ns; + } } } + } else { + ssize_t ns = (pid_rsize - pid_size) / 2; + if (pid_start != ns) { + //printf("(%p) move %d -> %d\n", this, pid_start, ns); + memmove(pid_data + ns, pid_data + pid_start, pid_size * sizeof(T)); + pid_start = ns; + } } } inline void alloc(size_t new_size, bool direction, ssize_t start_offset = 0) { // direction == true -> alloc forward diff --git a/src/math/pifft.cpp b/src/math/pifft.cpp index 0c63ae33..1e53fa61 100644 --- a/src/math/pifft.cpp +++ b/src/math/pifft.cpp @@ -59,14 +59,33 @@ PIVector * PIFFT_double::calcFFT(const PIVector & val) { } -PIVector PIFFT_double::getAmplitude() { - PIVector a; +PIVector PIFFT_double::getAmplitude() const { + PIVector ret; + ret.resize(result.size()); double tmp; for (uint i = 0; i < result.size(); i++) { tmp = sqrt(result[i].real() * result[i].real() + result[i].imag() * result[i].imag()); - a.push_back(tmp); + ret[i] = tmp; } - return a; + return ret; +} + + +PIVector PIFFT_double::getReal() const { + PIVector ret; + ret.resize(result.size()); + for (uint i = 0; i < result.size(); i++) + ret[i] = result[i].real(); + return ret; +} + + +PIVector PIFFT_double::getImag() const { + PIVector ret; + ret.resize(result.size()); + for (uint i = 0; i < result.size(); i++) + ret[i] = result[i].imag(); + return ret; } @@ -980,14 +999,33 @@ PIVector * PIFFT_float::calcFFT(const PIVector & val) { } -PIVector PIFFT_float::getAmplitude() { - PIVector a; +PIVector PIFFT_float::getAmplitude() const { + PIVector ret; + ret.resize(result.size()); float tmp; for (uint i = 0; i < result.size(); i++) { tmp = sqrt(result[i].real() * result[i].real() + result[i].imag() * result[i].imag()); - a.push_back(tmp); + ret[i] = tmp; } - return a; + return ret; +} + + +PIVector PIFFT_float::getReal() const { + PIVector ret; + ret.resize(result.size()); + for (uint i = 0; i < result.size(); i++) + ret[i] = result[i].real(); + return ret; +} + + +PIVector PIFFT_float::getImag() const { + PIVector ret; + ret.resize(result.size()); + for (uint i = 0; i < result.size(); i++) + ret[i] = result[i].imag(); + return ret; } diff --git a/src/math/pifft.h b/src/math/pifft.h index a0c05b0b..3e91b40a 100644 --- a/src/math/pifft.h +++ b/src/math/pifft.h @@ -34,7 +34,9 @@ public: PIVector * calcFFT(const PIVector &val); PIVector * calcFFTinverse(const PIVector &val); PIVector * calcHilbert(const PIVector &val); - PIVector getAmplitude(); + PIVector getAmplitude() const; + PIVector getReal() const; + PIVector getImag() const; private: PIVector result; @@ -78,7 +80,9 @@ public: PIVector * calcFFT(const PIVector &val); PIVector * calcFFTinverse(const PIVector &val); PIVector * calcHilbert(const PIVector &val); - PIVector getAmplitude(); + PIVector getAmplitude() const; + PIVector getReal() const; + PIVector getImag() const; private: PIVector result;