p += 2 + 4; \
} \
static void _denc_finish(size_t& p, \
- __u8 *struct_v, \
- __u8 *struct_compat, \
char **, uint32_t *) { } \
/* encode */ \
static void _denc_start(::ceph::buffer::list::contiguous_appender& p, \
*start_oob_off = p.get_out_of_band_offset(); \
} \
static void _denc_finish(::ceph::buffer::list::contiguous_appender& p, \
- __u8 *struct_v, \
- __u8 *struct_compat, \
char **len_pos, \
uint32_t *start_oob_off) { \
*(ceph_le32*)*len_pos = p.get_pos() - *len_pos - sizeof(uint32_t) + \
*start_pos = const_cast<char*>(p.get_pos()); \
} \
static void _denc_finish(::ceph::buffer::ptr::const_iterator& p, \
- __u8 *struct_v, __u8 *struct_compat, \
char **start_pos, \
uint32_t *struct_len) { \
const char *pos = p.get_pos(); \
_denc_start(p, &struct_v.v, &struct_compat, &_denc_pchar, &_denc_u32); \
do {
+// the variant for seldom-used cases when we manually select encoding version
+#define DENC_START_UNCHECKED(_v, compat, p) \
+ __u8 struct_v = _v; \
+ __u8 struct_compat = compat; \
+ char *_denc_pchar; \
+ uint32_t _denc_u32; \
+ static_assert(CEPH_RELEASE >= (CEPH_RELEASE_SQUID /*19*/ + 2) || compat == 1); \
+ _denc_start(p, &struct_v, &struct_compat, &_denc_pchar, &_denc_u32); \
+ do {
+
// For the only type that is with compat 2: unittest.
#define DENC_START_COMPAT_2(_v, compat, p) \
StructVChecker<_v> struct_v{_v}; \
#define DENC_FINISH(p) \
} while (false); \
- _denc_finish(p, &struct_v.v, &struct_compat, &_denc_pchar, &_denc_u32);
-
+ _denc_finish(p, &_denc_pchar, &_denc_u32);
// ----------------------------------------------------------------------