12 #ifndef ROOT_MPSendRecv
13 #define ROOT_MPSendRecv
20 #include <type_traits>
31 using MPCodeBufPair = std::pair<unsigned, std::unique_ptr<TBufferFile>>;
39 int MPSend(TSocket *s,
unsigned code);
41 template<class T, typename std::enable_if<std::is_class<T>::value>::type * =
nullptr>
42 int MPSend(TSocket *s,
unsigned code, T obj);
44 template < class T, typename std::enable_if < !std::is_class<T>::value &&!std::is_pointer<T>::value >::type * =
nullptr >
45 int MPSend(TSocket *s,
unsigned code, T obj);
47 template<class T, typename std::enable_if<std::is_same<const char *, T>::value>::type * =
nullptr>
48 int MPSend(TSocket *s,
unsigned code, T obj);
50 template < class T, typename std::enable_if < std::is_pointer<T>::value &&std::is_constructible<TObject *, T>::value >::type * =
nullptr >
51 int MPSend(TSocket *s,
unsigned code, T obj);
53 MPCodeBufPair MPRecv(TSocket *s);
57 template<class T, typename std::enable_if<std::is_class<T>::value>::type * =
nullptr>
58 T ReadBuffer(TBufferFile *buf);
61 template < class T, typename std::enable_if < !std::is_class<T>::value &&!std::is_pointer<T>::value >::type * =
nullptr >
62 T ReadBuffer(TBufferFile *buf);
65 template<class T, typename std::enable_if<std::is_same<const char *, T>::value>::type * =
nullptr>
66 T ReadBuffer(TBufferFile *buf);
69 template < class T, typename std::enable_if < std::is_pointer<T>::value &&std::is_constructible<TObject *, T>::value >::type * =
nullptr >
70 T ReadBuffer(TBufferFile *buf);
90 template<class T, typename std::enable_if<std::is_class<T>::value>::type *>
91 int MPSend(TSocket *s,
unsigned code, T obj)
93 TClass *c = TClass::GetClass<T>();
95 Error(
"MPSend",
"[E] Could not find cling definition for class %s\n",
typeid(T).name());
98 TBufferFile objBuf(TBuffer::kWrite);
99 objBuf.WriteObjectAny(&obj, c);
100 TBufferFile wBuf(TBuffer::kWrite);
101 wBuf.WriteUInt(code);
102 wBuf.WriteULong(objBuf.Length());
103 wBuf.WriteBuf(objBuf.Buffer(), objBuf.Length());
104 return s->SendRaw(wBuf.Buffer(), wBuf.Length());
110 template < class T, typename std::enable_if < !std::is_class<T>::value &&!std::is_pointer<T>::value >::type * >
111 int MPSend(TSocket *s,
unsigned code, T obj)
113 TBufferFile wBuf(TBuffer::kWrite);
114 ULong_t size =
sizeof(T);
115 wBuf << code << size << obj;
116 return s->SendRaw(wBuf.Buffer(), wBuf.Length());
121 template<class T, typename std::enable_if<std::is_same<const char *, T>::value>::type *>
122 int MPSend(TSocket *s,
unsigned code, T obj)
124 TBufferFile wBuf(TBuffer::kWrite);
125 wBuf.WriteUInt(code);
126 wBuf.WriteULong(strlen(obj) + 1);
127 wBuf.WriteString(obj);
128 return s->SendRaw(wBuf.Buffer(), wBuf.Length());
132 template < class T, typename std::enable_if < std::is_pointer<T>::value && std::is_constructible<TObject *, T>::value >::type * >
133 int MPSend(TSocket *s,
unsigned code, T obj)
136 TBufferFile objBuf(TBuffer::kWrite);
138 objBuf.WriteObjectAny(obj, obj->IsA());
141 TBufferFile wBuf(TBuffer::kWrite);
142 wBuf.WriteUInt(code);
143 wBuf.WriteULong(objBuf.Length());
145 wBuf.WriteBuf(objBuf.Buffer(), objBuf.Length());
146 return s->SendRaw(wBuf.Buffer(), wBuf.Length());
156 template<class T, typename std::enable_if<std::is_class<T>::value>::type *>
157 T ReadBuffer(TBufferFile *buf)
159 TClass *c = TClass::GetClass(
typeid(T));
160 T *objp = (T *)buf->ReadObjectAny(c);
167 template < class T, typename std::enable_if < !std::is_class<T>::value &&!std::is_pointer<T>::value >::type * >
168 T ReadBuffer(TBufferFile *buf)
176 template<class T, typename std::enable_if<std::is_same<const char *, T>::value>::type *>
177 T ReadBuffer(TBufferFile *buf)
180 char *c =
new char[buf->BufferSize()];
181 buf->ReadString(c, buf->BufferSize());
185 template < class T, typename std::enable_if < std::is_pointer<T>::value &&std::is_constructible<TObject *, T>::value >::type * >
186 T ReadBuffer(TBufferFile *buf)
189 using objType =
typename std::remove_pointer<T>::type;
190 return (T)buf->ReadObjectAny(objType::Class());