void
 Sink::send_one(Part& msg, bool use_copy) throw(ZmqErrorType)
 {
   if (use_copy)
   {
     Part p;
     p.copy(msg);
     send_owned(p);
   }
   else
   {
     send_owned(msg);
   }
 }
 Sink&
 Sink::operator<< (const RawMessage& m)
   throw (ZmqErrorType)
 {
   if (m.deleter)
   {
     Part part(m.data.ptr, m.sz, m.deleter, m.hint);
     send_owned(part);
   }
   else
   {
     Part part;
     init_msg(m.data.cptr, m.sz, part.msg());
     send_owned(part);
   }
   return *this;
 }
 Sink&
 Sink::operator<< (const T& t) throw (ZmqErrorType)
 {
   MsgPtr msg(new zmq::message_t);
   bool binary_mode = options_ & OutOptions::BINARY_MODE;
   init_msg(t, *msg, binary_mode);
   send_owned(msg.release());
   return *this;
 }
 void
 Sink::relay_from(
   zmq::socket_t& relay_src, OccupationAccumulator acc)
   throw (ZmqErrorType)
 {
   while (has_more(relay_src))
   {
     MsgPtr cur_part(new zmq::message_t);
     recv_msg(relay_src, *cur_part);
     size_t sz = cur_part->size();
     acc(sz);
     send_owned(cur_part.release());
   }
 }
 void
 Sink::relay_from(
   zmq::socket_t& relay_src, ReceiveObserver* receive_observer)
   throw (ZmqErrorType)
 {
   for (bool more = has_more(relay_src); more; )
   {
     Part cur_part;
     recv_msg(relay_src, cur_part.msg());
     more = has_more(relay_src);
     if (receive_observer)
     {
       receive_observer->on_receive_part(cur_part.msg(), more);
     }
     send_owned(cur_part);
   }
 }