From 9fd7c2bd87181e1056bcf0db1041251f1e811337 Mon Sep 17 00:00:00 2001 From: Alberto Cardellino Date: Tue, 2 Feb 2016 11:39:48 +0100 Subject: [PATCH 1/6] VectorOf.h: add implementation of read / write calling vectorBase function. Does not change the behaviour for standard types, but enables the possibility to implement specific read/write function for template types --- src/libYARP_sig/include/yarp/sig/Vector.h | 25 +++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/libYARP_sig/include/yarp/sig/Vector.h b/src/libYARP_sig/include/yarp/sig/Vector.h index a73efba3c10..61f3afaa415 100644 --- a/src/libYARP_sig/include/yarp/sig/Vector.h +++ b/src/libYARP_sig/include/yarp/sig/Vector.h @@ -257,6 +257,24 @@ class yarp::sig::VectorOf : public VectorBase len = 0; first = nullptr; } + + /** + * Read vector from a connection. + * return true if a vector was read correctly + */ + virtual bool read(yarp::os::ConnectionReader& connection) override + { + return VectorBase::read(connection); + } + + /** + * Write vector to a connection. + * return true if a vector was written correctly + */ + virtual bool write(yarp::os::ConnectionWriter& connection) override + { + return VectorBase::write(connection); + } }; @@ -457,16 +475,15 @@ class YARP_sig_API yarp::sig::Vector : public yarp::os::Portable void clear () { storage.clear();} - ///////// Serialization methods - /* + /** * Read vector from a connection. - * return true iff a vector was read correctly + * @return true if a vector was read correctly */ virtual bool read(yarp::os::ConnectionReader& connection) override; /** * Write vector to a connection. - * return true iff a vector was written correctly + * @return true if a vector was written correctly */ virtual bool write(yarp::os::ConnectionWriter& connection) override; From fd13e59ef4ab8982772634f381eee7a68a8aae7d Mon Sep 17 00:00:00 2001 From: Nicolo' Genesio Date: Fri, 9 Mar 2018 15:20:58 +0100 Subject: [PATCH 2/6] libYARP_OS: add `setExternal` in `ManagedBytes`. cc @pattacini @claudiofantacci --- src/libYARP_OS/include/yarp/os/ManagedBytes.h | 7 +++++++ src/libYARP_OS/src/ManagedBytes.cpp | 13 +++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/libYARP_OS/include/yarp/os/ManagedBytes.h b/src/libYARP_OS/include/yarp/os/ManagedBytes.h index 7407c307843..46d91557176 100644 --- a/src/libYARP_OS/include/yarp/os/ManagedBytes.h +++ b/src/libYARP_OS/include/yarp/os/ManagedBytes.h @@ -139,6 +139,13 @@ class YARP_OS_API yarp::os::ManagedBytes : public Portable { return owned; } + /** + * @brief Use this to wrap an external blob of data. + * @param extData, pointer to the external data. + * @param len, size in bytes of the external blob + */ + void setExternal(const char* extData, size_t len); + private: Bytes b; bool owned; diff --git a/src/libYARP_OS/src/ManagedBytes.cpp b/src/libYARP_OS/src/ManagedBytes.cpp index 8640af5c8bc..da8250dcb4d 100644 --- a/src/libYARP_OS/src/ManagedBytes.cpp +++ b/src/libYARP_OS/src/ManagedBytes.cpp @@ -179,3 +179,16 @@ bool ManagedBytes::write(ConnectionWriter& writer) { writer.convertTextMode(); return !writer.isError(); } + +void ManagedBytes::setExternal(const char *extData, size_t len) +{ + if (!extData) + { + return; + } + clear(); + owned = false; + Bytes extb(const_cast(extData), len); + b = extb; + setUsed(len); +} From 02f481f9289de29aedffff03be47232be2f155a1 Mon Sep 17 00:00:00 2001 From: Nicolo' Genesio Date: Fri, 9 Mar 2018 15:28:02 +0100 Subject: [PATCH 3/6] tests: enable `VectorOfTest` --- tests/libYARP_sig/TestList.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/libYARP_sig/TestList.h b/tests/libYARP_sig/TestList.h index 227da9bb06c..4d2004ab5a0 100644 --- a/tests/libYARP_sig/TestList.h +++ b/tests/libYARP_sig/TestList.h @@ -24,6 +24,7 @@ namespace yarp { // method. extern yarp::os::impl::UnitTest& getImageTest(); extern yarp::os::impl::UnitTest& getVectorTest(); +extern yarp::os::impl::UnitTest& getVectorOfTest(); extern yarp::os::impl::UnitTest& getSoundTest(); extern yarp::os::impl::UnitTest& getMatrixTest(); @@ -33,6 +34,7 @@ class yarp::sig::impl::TestList { yarp::os::impl::UnitTest& root = yarp::os::impl::UnitTest::getRoot(); root.add(getImageTest()); root.add(getVectorTest()); + root.add(getVectorOfTest()); root.add(getMatrixTest()); root.add(getSoundTest()); } From e20c77f908b0b7c69bfd20685f27e131d372d665 Mon Sep 17 00:00:00 2001 From: Nicolo' Genesio Date: Fri, 9 Mar 2018 18:32:11 +0100 Subject: [PATCH 4/6] Update release notes --- doc/release/v3_0_0.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/release/v3_0_0.md b/doc/release/v3_0_0.md index c89047af95e..1727fc9ddfc 100644 --- a/doc/release/v3_0_0.md +++ b/doc/release/v3_0_0.md @@ -33,6 +33,7 @@ Important Changes * The `shmem` carrier is no longer builtin inside `YARP_OS` and it is now a plugin. +* Added `setExternal` method in `yarp::os::ManagedBytes`. #### `YARP_dev` From 1607336d9a577bafb1dbc815e860c17137ca4bf2 Mon Sep 17 00:00:00 2001 From: Nicolo' Genesio Date: Tue, 13 Mar 2018 17:37:08 +0100 Subject: [PATCH 5/6] VectorOfTest: cleanup, removes unused classes --- tests/libYARP_sig/VectorOfTest.cpp | 165 ----------------------------- 1 file changed, 165 deletions(-) diff --git a/tests/libYARP_sig/VectorOfTest.cpp b/tests/libYARP_sig/VectorOfTest.cpp index 8fe8c310524..e1f5e946f21 100644 --- a/tests/libYARP_sig/VectorOfTest.cpp +++ b/tests/libYARP_sig/VectorOfTest.cpp @@ -23,171 +23,6 @@ using namespace yarp::os::impl; using namespace yarp::os; using namespace yarp::sig; -template -class SenderThread:public Thread -{ -public: - SenderThread(Port *p) - { - portOut=p; - } - - bool threadInit() override - { - success=false; - return true; - } - - void run() override - { - VectorOf v; - - int times=10; - - while(times--) - { - v.clear(); - int k=0; - for(k=0;k<10;k++) - v.push_back(42); - - portOut->write(v); - Time::delay(0.1); - v.clear(); - - for(k=0;k<42;k++) - v.push_back(k); - - portOut->write(v); - } - - success=true; - } - - Port *portOut; - bool success; -}; - -class Thread2b:public Thread -{ - int value; -public: - Thread2b(Port *p) - { - portIn=p; - } - - void init(int val) - { - value = val; - } - - - bool threadInit() override - { - success=false; - return true; - } - - void run() override - { - VectorOf v; - - int times=10; - bool ok=true; - while(times--) - { - portIn->read(v); - - int k; - int s=(int)v.size(); - if (s!=10) - ok=false; - for(k=0;kread(v); - s=(int)v.size(); - if (s!=42) - ok=false; - for(k=0;kread(v); - - int k; - int s = (int)v.size(); - if (s != 10) - ok = false; - for (k = 0; kread(v); - - s = (int)v.size(); - if (s != 42) - ok = false; - for (k = 0; k < s; k++) - { - if (v.get(k).asInt() != k) - { - - ok = false; - } - } - - } - - success = ok; - } - - Port *portIn; - bool success; -}; - class VectorOfTest : public UnitTest { public: From b9ee051fccaea5412c319814a0b03cd0bb3b464f Mon Sep 17 00:00:00 2001 From: Nicolo' Genesio Date: Tue, 13 Mar 2018 17:40:19 +0100 Subject: [PATCH 6/6] VectorOfTest: fix checkSendReceiveInt test. --- tests/libYARP_sig/VectorOfTest.cpp | 120 ++++++++++++++++++----------- 1 file changed, 76 insertions(+), 44 deletions(-) diff --git a/tests/libYARP_sig/VectorOfTest.cpp b/tests/libYARP_sig/VectorOfTest.cpp index e1f5e946f21..5e1f554d128 100644 --- a/tests/libYARP_sig/VectorOfTest.cpp +++ b/tests/libYARP_sig/VectorOfTest.cpp @@ -23,6 +23,7 @@ using namespace yarp::os::impl; using namespace yarp::os; using namespace yarp::sig; + class VectorOfTest : public UnitTest { public: @@ -31,68 +32,99 @@ class VectorOfTest : public UnitTest { { report(0, "check VectorO send receive"); - Port portIn; - Port portOut; + { + Port portIn; + Port portOut; - portOut.open("/harness_sig/vtest/o"); - portIn.open("/harness_sig/vtest/i"); + portOut.open("/harness_sig/vtest/o"); + portIn.open("/harness_sig/vtest/i"); - Network::connect("/harness_sig/vtest/o", "/harness_sig/vtest/i"); + Network::connect("/harness_sig/vtest/o", "/harness_sig/vtest/i"); - portOut.enableBackgroundWrite(true); + portOut.enableBackgroundWrite(true); - VectorOf vector; - vector.resize(10); - for (unsigned int k = 0; k < vector.size(); k++) - { - vector[k] = k; - } + VectorOf vector; + vector.resize(10); + for (unsigned int k = 0; k < vector.size(); k++) + { + vector[k] = k; + } - portOut.write(vector); + bool success = true; + portOut.write(vector); - VectorOf tmp; - portIn.read(tmp); + VectorOf tmp; + portIn.read(tmp); - //compare vector and tmp - bool success = true; - if (tmp.size() != vector.size()) - { - success = false; - } - else - { - for (unsigned int k = 0; k < vector.size(); k++) + //compare vector and tmp + if (tmp.size() != vector.size()) { - if (tmp[k] != vector[k]) - success = false; + success = false; } + else + { + for (unsigned int k = 0; k < vector.size(); k++) + { + if (tmp[k] != vector[k]) + success = false; + } + } + + checkTrue(success, "VectorOf was sent and received correctly"); + portOut.interrupt(); + portOut.close(); + portIn.interrupt(); + portIn.close(); } - checkTrue(success, "VectorOf was sent and received correctly"); + report(0, "check VectorOf bottle compatibility"); + { + //write the same vector again and receive it as a bottle + Port portIn; + Port portOut; + bool success = true; - report(0, "check VectorO bottle compatibility"); - //write the same vector again and receive it as a bottle - portOut.write(vector); - Bottle tmp2; - portIn.read(tmp2); + portOut.open("/harness_sig/vtest/o"); + portIn.open("/harness_sig/vtest/i"); - //compare vector and tmp - success = true; - if (tmp2.size() != (int)vector.size()) - { - success = false; - } - else - { + Network::connect("/harness_sig/vtest/o", "/harness_sig/vtest/i"); + + portOut.enableBackgroundWrite(true); + + + VectorOf vector; + vector.resize(10); for (unsigned int k = 0; k < vector.size(); k++) { - if (tmp2.get(k).asInt() != vector[k]) - success = false; + vector[k] = k; + } + portOut.write(vector); + Bottle tmp2; + success = portIn.read(tmp2); + checkTrue(success,"correctly read from the port"); + + //compare vector and tmp + success = true; + if (tmp2.size() != (int)vector.size()) + { + success = false; + } + else + { + for (unsigned int k = 0; k < vector.size(); k++) + { + if (tmp2.get(k).asInt() != vector[k]) + success = false; + } } - } - checkTrue(success, "VectorOf was received correctly in a Bottle"); + checkTrue(success, "VectorOf was received correctly in a Bottle"); + portOut.interrupt(); + portOut.close(); + portIn.interrupt(); + portIn.close(); + } }