diff --git a/MEL_deepcopy.hpp b/MEL_deepcopy.hpp index e2f7496..4f5e856 100644 --- a/MEL_deepcopy.hpp +++ b/MEL_deepcopy.hpp @@ -304,9 +304,9 @@ namespace MEL { template using enable_if_stl = typename std::enable_if::value || is_list::value, R>::type; // || is_string::value template - using enable_if_not_pointer_not_stl = typename std::enable_if<(!is_vector::value || is_list::value) && !std::is_pointer::value, R>::type; // || is_string::value + using enable_if_not_pointer_not_stl = typename std::enable_if::value || is_list::value) && !std::is_pointer::value, R>::type; // || is_string::value template - using enable_if_deep_not_pointer_not_stl = typename std::enable_if::Has && (!is_vector::value || is_list::value) && !std::is_pointer::value, R>::type; // || is_string::value + using enable_if_deep_not_pointer_not_stl = typename std::enable_if::Has && !(is_vector::value || is_list::value) && !std::is_pointer::value, R>::type; // || is_string::value template using DEEP_FUNCTOR = void(*)(T&, MEL::Deep::Message&); @@ -531,6 +531,21 @@ namespace MEL { ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // STL + inline void packSTL(std::string &obj) { + int len; + if (TRANSPORT_METHOD::SOURCE) { + len = obj.size(); + transport(len); + } + else { + transport(len); + new (&obj) std::string(len, ' '); + } + + char *p = &obj[0]; + if (len > 0) transport(p, len); + }; + template inline enable_if_not_deep packSTL(std::vector &obj) { int len = obj.size(); @@ -747,11 +762,16 @@ namespace MEL { return *this; }; - template + template inline Message& operator&(T &obj) { packVar(obj); return *this; }; + + inline Message& operator&(std::string &obj) { + packSTL(obj); + return *this; + }; }; #define TEMPLATE_STL template @@ -906,9 +926,14 @@ namespace MEL { ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Pointer + TEMPLATE_P + inline enable_if_pointer

Send(const P &ptr, const int dst, const int tag, const Comm &comm) { + Send((P) ptr, dst, tag, comm); + }; + TEMPLATE_P inline enable_if_pointer

Send(P &ptr, const int dst, const int tag, const Comm &comm) { - Message msg(dst, tag, comm); + Message msg(dst, tag, comm); msg.packRootPtr(ptr); }; @@ -2250,6 +2275,11 @@ namespace MEL { MEL::Deep::BufferedFileWrite(ptr, file, MEL::Deep::BufferSize(ptr)); }; + TEMPLATE_P + inline enable_if_pointer

BufferedFileWrite_FUCK(P &ptr, std::ofstream &file) { + MEL::Deep::BufferedFileWrite(ptr, file, MEL::Deep::BufferSize(ptr)); + }; + TEMPLATE_P_F(TransportBufferWrite) inline enable_if_pointer

BufferedFileWrite(P &ptr, std::ofstream &file) { MEL::Deep::BufferedFileWrite(ptr, file, MEL::Deep::BufferSize(ptr));