Value::Value(int protocol_version, const SharedRefPtr<const DataType>& data_type, char* data, int32_t size) : protocol_version_(protocol_version) , data_type_(data_type) { if (size > 0 && data_type->is_collection()) { data_ = decode_size(protocol_version, data, count_); if (protocol_version_ >= 3) { size_ = size - sizeof(int32_t); } else { size_ = size - sizeof(uint16_t); } } else { if (data_type->is_tuple()) { SharedRefPtr<const SubTypesDataType> sub_types(data_type); count_ = sub_types->types().size(); } else if (data_type->is_user_type()) { SharedRefPtr<const UserType> user_type(data_type); count_ = user_type->fields().size(); } else { count_ = 0; } data_ = data; size_ = size; } }