| 1083 | // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/n4771.pdf |
| 1084 | |
| 1085 | class mutable_buffer |
| 1086 | { |
| 1087 | public: |
| 1088 | constexpr mutable_buffer() noexcept : _data(nullptr), _size(0) {} |
| 1089 | constexpr mutable_buffer(void *p, size_t n) noexcept : _data(p), _size(n) |
| 1090 | { |
| 1091 | #ifdef ZMQ_EXTENDED_CONSTEXPR |
| 1092 | assert(p != nullptr || n == 0); |
| 1093 | #endif |
| 1094 | } |
| 1095 | |
| 1096 | constexpr void *data() const noexcept { return _data; } |
| 1097 | constexpr size_t size() const noexcept { return _size; } |
| 1098 | mutable_buffer &operator+=(size_t n) noexcept |
| 1099 | { |
| 1100 | // (std::min) is a workaround for when a min macro is defined |
| 1101 | const auto shift = (std::min)(n, _size); |
| 1102 | _data = static_cast<char *>(_data) + shift; |
| 1103 | _size -= shift; |
| 1104 | return *this; |
| 1105 | } |
| 1106 | |
| 1107 | private: |
| 1108 | void *_data; |
| 1109 | size_t _size; |
| 1110 | }; |
| 1111 | |
| 1112 | inline mutable_buffer operator+(const mutable_buffer &mb, size_t n) noexcept |
| 1113 | { |