From 6be61e2f3980b2abdc109ff9eadec68ad1bae055 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: Tue, 13 Aug 2019 12:12:09 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/pip@843 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5 --- main.cpp | 310 +++++++++++----------------------- src_main/core/pibase.h | 2 +- src_main/core/pibytearray.cpp | 2 +- src_main/core/pibytearray.h | 12 ++ src_main/core/pistring.cpp | 2 +- src_main/core/pistring.h | 2 + 6 files changed, 111 insertions(+), 219 deletions(-) diff --git a/main.cpp b/main.cpp index 0e84caf2..e0a51bdd 100644 --- a/main.cpp +++ b/main.cpp @@ -1,232 +1,110 @@ #include "pip.h" -#include "piintrospection_server.h" -#include "piintrospection_containers_p.h" -//#include -class CL: public PIObject { - PIOBJECT(CL) + +template +class PIHash { public: - EVENT_HANDLER1(void, nc, PIEthernet * , client) { - piCout << "client" << client; + inline PIHash() { + shift = 0; + r_size = 0; } -}; + inline T & operator [](size_t index) {return content[index].second;} + inline const T & operator [](size_t index) const {return content[index].second;} + inline size_t size() const {return r_size;} + inline ssize_t size_s() const {return r_size;} + inline size_t capacity() const {return content.capacity();} + inline bool isEmpty() const {return content.isEmpty();} -PIKbdListener kbd(0, 0, false); -#include -#define PIIS_TYPENAME(t) typeid(t).name() - -template class Name -{ -public: - static const char * name() {return PIIS_TYPENAME(T);} -}; - -PISystemMonitor sys_mon; - - - -class TestRec: public PIObject { - PIOBJECT(TestRec) -public: - EVENT_HANDLER(void, reinitSpec) {/*piCout << "reinitSpec";*/int a = 10; (void*)&a;} - - EVENT_HANDLER(void, coeffsChanged) {piCout << "coeffsChanged";} - EVENT_HANDLER(void, guiAboutSend) {piCout << "guiAboutSend";} - EVENT_HANDLER(void, guiAfterSend) {piCout << "guiAfterSend";} - EVENT_HANDLER(void, guiReceived) {piCout << "guiReceived";} - - EVENT_HANDLER(void, playerReceived) {/*piCout << "playerReceived";*/int a = 10; (void*)&a;} - - EVENT_HANDLER(void, playerValuesReceived) {piCout << "playerValuesReceived";} - EVENT_HANDLER(void, calculate) {piCout << "calculate";} - EVENT_HANDLER(void, autostart) {piCout << "autostart";} - - EVENT_HANDLER(void, syncOff) {/*piCout << "syncOff";*/int a = 10; (void*)&a;} - - EVENT_HANDLER(void, del) {piCout << "DEL";} -}; - -class TestSnd: public PIObject { - PIOBJECT(TestSnd) -public: - EVENT(reinitSpec) - EVENT(coeffsChanged) - EVENT(guiAboutSend) - EVENT(guiAfterSend) - EVENT(guiReceived) - EVENT(playerReceived) - EVENT(playerValuesReceived) - EVENT(calculate) - EVENT(autostart) - EVENT(syncOff); -}; - -class CA: public PIObject { - PIOBJECT(CA) - EVENT(evA) -}; - -class CB: public CA { - PIOBJECT_SUBCLASS(CB, CA) - EVENT(evB) -}; - -class CC: public CB { - PIOBJECT_SUBCLASS(CC, CB) - EVENT(evC) -}; - -#define CONN(sn) CONNECTU(snd, sn, rec, sn) -uint HashLy(const void* d, int l) { - uint hash = 0u; - for(int i = 0; i < l; ++i) - hash = (hash * 1664525u) + ((uchar*)d)[i] + 1013904223u; - return hash; -} -int main(int argc, char * argv[]) { - //sys_mon.startOnSelf(); - - PITimeMeasurer tm; - - TestRec * rec = 0; - TestSnd * snd = 0; - - for (int i = 0; i < 1; ++i) { - if (rec) delete rec; - if (snd) delete snd; - rec = new TestRec(); - snd = new TestSnd(); + inline PIHash & push_back(const T & v) { + uint h = piHash(v); + add_hash(h); + int i = (h >> (32 - shift)); + if (content[i].first == 0) r_size++; + content[i] = HashPair(h, v); + //for (int i=0; ireinitSpec(); - snd->playerReceived(); - snd->syncOff(); + inline PIHash & append(const T & v) {return push_back(v);} +// inline PIVector & append(const PIVector & other) { +// assert(&other != this); +// size_t ps = piv_size; +// alloc(piv_size + other.piv_size); +// newT(piv_data + ps, other.piv_data, other.piv_size); +// return *this; +// } + inline PIHash & operator <<(const T & v) {return push_back(v);} +// inline PIVector & operator <<(const PIVector & other) {return append(other);} +private: + typedef PIPair HashPair; + void add_hash(uint nh) { + piCout << "add" << nh; + //for (int i=0; i> (32 - shift)); + while (content[i].first != nh && content[i].first != 0) { + shift++; + i = (nh >> (32 - shift)); + content.resize(1 << shift, HashPair(0, T())); + rehash(); + } + //for (int i=0; i > tmpc(content.size(), HashPair(0, T())); + for (int i=0; i> (32 - shift)); + tmpc[h] = content[i]; + piCout << i << "->" << h; + } + content.swap(tmpc); } - /*piCout << "****"; - PIPeer().dump(); - piCout << "----";*/ + PIVector > content; + uint shift; + size_t r_size; +}; -/* PIString _s = "012345678901234567890123456789"; - CRC_32 crc = standardCRC_32(); - PIByteArray _sd = _s.toByteArray(); - double el; - uint ret; - tm.reset(); - for (int i = 0; i < 1000000; ++i) { - ret = crc.calculate(_sd.data(), _sd.size_s()); +template +inline PICout operator <<(PICout s, const PIHash & v) { + s.space(); + s.setControl(0, true); + s << "{"; + for (size_t i = 0; i < v.size(); ++i) { + s << v[i]; + if (i < v.size() - 1) + s << ", "; } - el = tm.elapsed_m(); - piCout << ""; - piCout << ret; - piCout << "crc" << el; + s << "}"; + s.restoreControl(); + return s; +} - tm.reset(); - for (int i = 0; i < 1000000; ++i) { - ret = HashLy(_sd.data(), _sd.size_s()); + +int main() { + PIHash v; + v << "x"; + v << "bbb"; + v << "bbc"; + v << "aaa"; + v << "123"; + v << "321"; + v << "aaa" << "bbb" << "ccc"; + piCout << v.size() << v.capacity(); + //piCout << (1 << 2); + PIHash v2; + for (int i=0; i<1000; ++i) { + v2 << PIString::fromNumber(randomi()); } - el = tm.elapsed_m(); - piCout << ""; - piCout << ret; - piCout << " ly" << el; - - tm.reset(); - for (int i = 0; i < 1000000; ++i) { - ret = murmur3_32((const uchar*)_sd.data(), _sd.size_s()); - } - el = tm.elapsed_m(); - piCout << ""; - piCout << ret; - piCout << "mur" << el; -*/ - delete snd; - delete rec; - - return 0; - - PIString s; - s = "gafaffaf"; - piCout << s; - piCout << s; - s = "dd"; - piCout << s; - return 0; - - PIINTROSPECTION_START; - //uint id = standardCRC_32().calculate("6PIChar"); - //PIIntrospectionContainers * ci = PIINTROSPECTION_CONTAINERS->p; - FOREVER { - piMSleep(100); - //piCout << ci->data[id].count << ci->data[id].bytes_allocated << ci->data[id].bytes_used; - } - return 0; - - PICLI cli(argc, argv); - cli.setDebug(false); - cli.addArgument("send"); - //PISystemInfo::machineID(); - kbd.enableExitCapture(); - kbd.start(); - - if (cli.hasArgument("send")) { - /*piCout << "send mode"; - PIEthernet eth; - eth.setSendAddress(cli.rawArguments().back() + ":15123"); - eth.open(); - while (!kbd.exiting) { - eth.send(PIByteArray("test string", 12)); - piMSleep(500); - }*/ - PIEthernet eth(PIEthernet::TCP_Server); - eth.listen(cli.rawArguments().back() + ":15123", true); - //eth.open(); - CL cl; - CONNECTU(ð, newConnection, &cl, nc); - - WAIT_FOR_EXIT; - piCout << "exiting ..."; - - } else { - piCout << "recv mode"; - PIEthernet eth(PIEthernet::TCP_Client); - //eth.setReadAddress(cli.rawArguments().back() + ":15123"); - eth.startThreadedRead(); - int s = eth.socket(); - piCout << s; - piCout << "connect ..."; - eth.connect(cli.rawArguments().back() + /*":13361"*/":15123"); - piCout << "connect done" << eth.isConnected(); - //fcntl(fd, F_SETFL, O_NONBLOCK); - - WAIT_FOR_EXIT; - piCout << "exiting ..."; - - } - /*PIThread t; - t.start(10); - //WAIT_FOR_EXIT; - piSleep(20.); - t.stop(true);*/ - piCout << "exit main ..."; + piCout << v2.size() << v2.capacity(); return 0; } diff --git a/src_main/core/pibase.h b/src_main/core/pibase.h index 9ebb3b2c..a3da4151 100644 --- a/src_main/core/pibase.h +++ b/src_main/core/pibase.h @@ -461,7 +461,7 @@ uint letobe_i(uint v) {return (v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF #endif /// \brief Generic hash function, impements murmur3/32 algorithm -inline uint piHash(const uchar * data, uint len, uint seed = 0) { +inline uint piHashData(const uchar * data, uint len, uint seed = 0) { if (!data || len <= 0) return 0u; uint h = seed; if (len > 3) { diff --git a/src_main/core/pibytearray.cpp b/src_main/core/pibytearray.cpp index c8ccc751..9384e3c7 100755 --- a/src_main/core/pibytearray.cpp +++ b/src_main/core/pibytearray.cpp @@ -278,7 +278,7 @@ uint PIByteArray::checksumPlain32() const { uint PIByteArray::hash() const { - return piHash(data(), size_s()); + return piHashData(data(), size_s()); } diff --git a/src_main/core/pibytearray.h b/src_main/core/pibytearray.h index 9c022f84..adf5f6d9 100755 --- a/src_main/core/pibytearray.h +++ b/src_main/core/pibytearray.h @@ -315,4 +315,16 @@ __PIBYTEARRAY_SIMPLE_TYPE__(double) __PIBYTEARRAY_SIMPLE_TYPE__(ldouble) __PIBYTEARRAY_SIMPLE_TYPE__(PIChar) + + +template +inline uint piHash(const T & v) { + PIByteArray ba; + ba << v; + return ba.hash(); +} + +template<> inline uint piHash(const PIByteArray & ba) {return ba.hash();} + + #endif // PIBYTEARRAY_H diff --git a/src_main/core/pistring.cpp b/src_main/core/pistring.cpp index 2b47a08e..a0017dd6 100755 --- a/src_main/core/pistring.cpp +++ b/src_main/core/pistring.cpp @@ -420,7 +420,7 @@ const char * PIString::dataAscii() const { uint PIString::hash() const { buildData(); - return piHash(data_.data(), data_.size_s() - 1); + return piHashData(data_.data(), data_.size_s() - 1); } diff --git a/src_main/core/pistring.h b/src_main/core/pistring.h index c6603f3b..77abac57 100755 --- a/src_main/core/pistring.h +++ b/src_main/core/pistring.h @@ -863,4 +863,6 @@ inline PIByteArray & operator >>(PIByteArray & s, PIStringList & v) {int sz; s > //! \relatesalso PIStringList \relatesalso PICout \brief Output operator to PICout inline PICout operator <<(PICout s, const PIStringList & v) {s.space(); s.setControl(0, true); s << "{"; for (uint i = 0; i < v.size(); ++i) {s << "\"" << v[i] << "\""; if (i < v.size() - 1) s << ", ";} s << "}"; s.restoreControl(); return s;} +template<> inline uint piHash(const PIString & s) {return s.hash();} + #endif // PISTRING_H