On Oct 27, 2011, at 12:58 PM, Chuck Remes wrote:

> e.g. int zmq_msg_flagmatch(zmq_msg_t *msg, unsigned long flags);

In another thread ("Behavior of Labels, Identities, and Socket Types in 3.0"), 
a similar issue was raised. I had a quick chat with Greg on irc and we refined 
the proposal to be more C-like.

int zmq_msg_flags(zmq_msg_t *msg);

This function would return an integer with the appropriate bits set for 
RCVMORE, RCVLABEL, etc. Callers could do explicit tests against these bits like 
a lot of idiomatic C code. Higher-level APIs that wrap this could provide 
specific method calls to test for each flag individually.

So the earlier code example would now look a tiny bit different.

int flags;
zmq_msg_t *part;
do {
   part = malloc (sizeof(zmq_msg_t);
   assert (zmq_msg_init (part) == 0);
   assert (zmq_recvmsg (socket, part, 0) != -1);
   flags = zmq_msg_flags(part);

   if (flags & ZMQ_RCVLABEL)
     fprintf (stderr, "label part");
   else
     fprintf (stderr, "body part");
   zmq_msg_close (&part); 
} while (flags & RCVMORE);

That is very C-like. Wrapping that up in Ruby (or another higher level lang) 
could make for a simple and pretty API for things like Message#more?, 
Message#label?, etc.

There's a possibility that this API would be too low-level for some folks. It 
would require C users to write macros:

#define TEST_ZMQ_MSG_MORE(flags) (flags & ZMQ_RCMORE)

Adding a slightly redundant function could eliminate that macro.

int zmq_msg_flag(zmq_msg_t *msg, unsigned int flag)

That would return 0/1 for the specific flag.

Thoughts?

cr

_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to