!traits::featured, void>::type
bound_encode(const container& s, size_t& p) {
size_t elem_size = 0;
- denc(*(const T*)nullptr, elem_size);
- p += sizeof(uint32_t) + elem_size * s.size();
+ p += sizeof(uint32_t);
+ if (!s.empty()) {
+ // STL containers use weird element types like std::pair<const K, V>;
+ // cast to something we have denc_traits for.
+ denc(static_cast<const T&>(*s.begin()), elem_size);
+ p += sizeof(uint32_t) + elem_size * s.size();
+ }
}
template<typename U=T>
static typename std::enable_if<sizeof(U) &&
traits::featured>::type
bound_encode(const container& s, size_t& p, uint64_t f) {
size_t elem_size = 0;
- denc(*(const T*)nullptr, elem_size, f);
- p += sizeof(uint32_t) + elem_size * s.size();
+ p += sizeof(uint32_t);
+ if (!s.empty()) {
+ // STL containers use weird element types like std::pair<const K, V>;
+ // cast to something we have denc_traits for.
+ denc(static_cast<const T&>(*s.begin()), elem_size, f);
+ p += elem_size * s.size();
+ }
}
template<typename U=T>
!traits::featured, void>::type
bound_encode(const container& s, size_t& p) {
size_t elem_size = 0;
- denc(*(const T*)nullptr, elem_size);
+ denc(*s.begin(), elem_size);
p += elem_size * N;
}
template<typename U=T>
traits::featured>::type
bound_encode(const container& s, size_t& p, uint64_t f) {
size_t elem_size = 0;
- denc(*(const T*)nullptr, elem_size, f);
- p += sizeof(uint32_t) + elem_size * s.size();
+ p += sizeof(uint32_t);
+ if (!s.empty()) {
+ denc(*s.begin(), elem_size, f);
+ p += elem_size * s.size();
+ }
}
template<typename U=T>
template<typename T, size_t I, size_t J, size_t ...Is>
static void bound_encode_helper_nfb(const T& s, size_t& p,
_denc::indices<I, J, Is...>) {
- denc(*(typename std::tuple_element<I, T>::type *)nullptr, p);
+ denc(std::get<I>(s), p);
bound_encode_helper_nfb(s, p, _denc::indices<J, Is...>{});
}
template<typename T, size_t I>
static void bound_encode_helper_nfb(const T& s, size_t& p,
_denc::indices<I>) {
- denc(*(typename std::tuple_element<I, T>::type *)nullptr, p);
+ denc(std::get<I>(s), p);
}
template<typename T, size_t I, size_t J, size_t ...Is>
template<typename T, size_t I, size_t J, size_t ...Is>
static void bound_encode_helper_fb(const T& s, size_t& p, uint64_t f,
_denc::indices<I, J, Is...>) {
- denc(*(typename std::tuple_element<I, T>::type *)nullptr, p);
+ denc(std::get<I>(s), p);
bound_encode_helper_fb(s, p, f, _denc::indices<J, Is...>{});
}
template<typename T, size_t I>
static void bound_encode_helper_fb(const T& s, size_t& p, uint64_t f,
_denc::indices<I>) {
- denc(*(typename std::tuple_element<I, T>::type *)nullptr, p, f);
+ denc(std::get<I>(s), p);
}
template<typename T, size_t I, size_t J, size_t ...Is>
template<typename U = T>
static typename std::enable_if<sizeof(U) && !featured>::type
bound_encode(const boost::optional<T>& v, size_t& p) {
- denc(*(bool *)nullptr, p);
+ p += sizeof(bool);
if (v)
denc(*v, p);
}
template<typename U = T>
static typename std::enable_if<sizeof(U) && featured>::type
bound_encode(const boost::optional<T>& v, size_t& p, uint64_t f) {
- denc(*(bool *)nullptr, p);
+ p += sizeof(bool);
if (v)
denc(*v, p);
}
static constexpr bool bounded = true;
static void bound_encode(const boost::none_t& v, size_t& p) {
- denc(*(bool *)nullptr, p);
+ p += sizeof(bool);
}
static void encode(const boost::none_t& v,