@@ -342,8 +342,8 @@ inline int poll(std::vector<zmq_pollitem_t> &items, long timeout_ = -1)
342
342
}
343
343
344
344
template <std::size_t SIZE>
345
- inline int poll (std::array<zmq_pollitem_t , SIZE>& items,
346
- std::chrono::milliseconds timeout)
345
+ inline int poll (std::array<zmq_pollitem_t , SIZE> & items,
346
+ std::chrono::milliseconds timeout)
347
347
{
348
348
return poll (items.data (), items.size (), static_cast <long >(timeout.count ()));
349
349
}
@@ -362,6 +362,20 @@ inline std::tuple<int, int, int> version()
362
362
zmq_version (&std::get<0 >(v), &std::get<1 >(v), &std::get<2 >(v));
363
363
return v;
364
364
}
365
+
366
+ #if !defined(ZMQ_CPP11_PARTIAL)
367
+ namespace detail
368
+ {
369
+ template <class T > struct is_char_type
370
+ {
371
+ // true if character type for string literals in C++11
372
+ static constexpr bool value =
373
+ std::is_same<T, char >::value || std::is_same<T, wchar_t >::value
374
+ || std::is_same<T, char16_t >::value || std::is_same<T, char32_t >::value;
375
+ };
376
+ }
377
+ #endif
378
+
365
379
#endif
366
380
367
381
class message_t
@@ -398,8 +412,7 @@ class message_t
398
412
int rc = zmq_msg_init_size (&msg, size_);
399
413
if (rc != 0 )
400
414
throw error_t ();
401
- if (size_)
402
- {
415
+ if (size_) {
403
416
// this constructor allows (nullptr, 0),
404
417
// memcpy with a null pointer is UB
405
418
memcpy (data (), data_, size_);
@@ -413,16 +426,40 @@ class message_t
413
426
throw error_t ();
414
427
}
415
428
429
+ // overload set of string-like types and generic containers
416
430
#if defined(ZMQ_CPP11) && !defined(ZMQ_CPP11_PARTIAL)
431
+ // NOTE this constructor will include the null terminator
432
+ // when called with a string literal.
433
+ // An overload taking const char* can not be added because
434
+ // it would be preferred over this function and break compatiblity.
435
+ template <
436
+ class Char ,
437
+ size_t N,
438
+ typename = typename std::enable_if<detail::is_char_type<Char>::value>::type>
439
+ ZMQ_DEPRECATED (" from 4.7.0, use constructors taking iterators, (pointer, size) "
440
+ " or strings instead" )
441
+ explicit message_t(const Char (&data)[N]) :
442
+ message_t(detail::ranges::begin(data), detail::ranges::end(data))
443
+ {
444
+ }
445
+
417
446
template <class Range ,
418
447
typename = typename std::enable_if<
419
448
detail::is_range<Range>::value
420
449
&& ZMQ_IS_TRIVIALLY_COPYABLE(detail::range_value_t <Range>)
450
+ && !detail::is_char_type<detail::range_value_t<Range>>::value
421
451
&& !std::is_same<Range, message_t>::value>::type>
422
452
explicit message_t(const Range &rng) :
423
453
message_t(detail::ranges::begin(rng), detail::ranges::end(rng))
424
454
{
425
455
}
456
+
457
+ explicit message_t (const std::string &str) : message_t(str.data(), str.size()) {}
458
+
459
+ #if CPPZMQ_HAS_STRING_VIEW
460
+ explicit message_t (std::string_view str) : message_t(str.data(), str.size()) {}
461
+ #endif
462
+
426
463
#endif
427
464
428
465
#ifdef ZMQ_HAS_RVALUE_REFS
@@ -1337,19 +1374,19 @@ template<int Opt, int NullTerm = 1> struct array_option
1337
1374
1338
1375
#define ZMQ_DEFINE_INTEGRAL_OPT (OPT, NAME, TYPE ) \
1339
1376
using NAME##_t = integral_option<OPT, TYPE, false >; \
1340
- ZMQ_INLINE_VAR ZMQ_CONSTEXPR_VAR NAME##_t NAME{}
1377
+ ZMQ_INLINE_VAR ZMQ_CONSTEXPR_VAR NAME##_t NAME {}
1341
1378
#define ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT (OPT, NAME, TYPE ) \
1342
1379
using NAME##_t = integral_option<OPT, TYPE, true >; \
1343
- ZMQ_INLINE_VAR ZMQ_CONSTEXPR_VAR NAME##_t NAME{}
1380
+ ZMQ_INLINE_VAR ZMQ_CONSTEXPR_VAR NAME##_t NAME {}
1344
1381
#define ZMQ_DEFINE_ARRAY_OPT (OPT, NAME ) \
1345
1382
using NAME##_t = array_option<OPT>; \
1346
- ZMQ_INLINE_VAR ZMQ_CONSTEXPR_VAR NAME##_t NAME{}
1383
+ ZMQ_INLINE_VAR ZMQ_CONSTEXPR_VAR NAME##_t NAME {}
1347
1384
#define ZMQ_DEFINE_ARRAY_OPT_BINARY (OPT, NAME ) \
1348
1385
using NAME##_t = array_option<OPT, 0 >; \
1349
- ZMQ_INLINE_VAR ZMQ_CONSTEXPR_VAR NAME##_t NAME{}
1386
+ ZMQ_INLINE_VAR ZMQ_CONSTEXPR_VAR NAME##_t NAME {}
1350
1387
#define ZMQ_DEFINE_ARRAY_OPT_BIN_OR_Z85 (OPT, NAME ) \
1351
1388
using NAME##_t = array_option<OPT, 2 >; \
1352
- ZMQ_INLINE_VAR ZMQ_CONSTEXPR_VAR NAME##_t NAME{}
1389
+ ZMQ_INLINE_VAR ZMQ_CONSTEXPR_VAR NAME##_t NAME {}
1353
1390
1354
1391
// duplicate definition from libzmq 4.3.3
1355
1392
#if defined _WIN32
@@ -2161,7 +2198,6 @@ class socket_t : public detail::socket_base
2161
2198
throw error_t ();
2162
2199
if (ctxptr == ZMQ_NULLPTR)
2163
2200
throw error_t ();
2164
-
2165
2201
}
2166
2202
};
2167
2203
0 commit comments