| class {{union.name}}DataView { |
| public: |
| using Tag = internal::{{union.name}}_Data::{{union.name}}_Tag; |
| |
| {{union.name}}DataView() {} |
| |
| {{union.name}}DataView( |
| internal::{{union.name}}_Data* data, |
| mojo::internal::SerializationContext* context) |
| {%- if union|requires_context_for_data_view %} |
| : data_(data), context_(context) {} |
| {%- else %} |
| : data_(data) {} |
| {%- endif %} |
| |
| bool is_null() const { |
| // For inlined unions, |data_| is always non-null. In that case we need to |
| // check |data_->is_null()|. |
| return !data_ || data_->is_null(); |
| } |
| |
| Tag tag() const { return data_->tag; } |
| |
| {%- for field in union.fields %} |
| {%- set kind = field.kind %} |
| {%- set name = field.name %} |
| bool is_{{name}}() const { return data_->tag == Tag::{{name|upper}}; } |
| |
| {%- if kind|is_object_kind %} |
| inline void Get{{name|under_to_camel}}DataView( |
| {{kind|cpp_data_view_type}}* output); |
| |
| template <typename UserType> |
| WARN_UNUSED_RESULT bool Read{{name|under_to_camel}}(UserType* output) { |
| DCHECK(is_{{name}}()); |
| return mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>( |
| data_->data.f_{{name}}.Get(), output, context_); |
| } |
| |
| {%- elif kind|is_enum_kind %} |
| template <typename UserType> |
| WARN_UNUSED_RESULT bool Read{{name|under_to_camel}}(UserType* output) const { |
| DCHECK(is_{{name}}()); |
| return mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>( |
| data_->data.f_{{name}}, output); |
| } |
| |
| {{kind|cpp_data_view_type}} {{name}}() const { |
| DCHECK(is_{{name}}()); |
| return static_cast<{{kind|cpp_data_view_type}}>( |
| data_->data.f_{{name}}); |
| } |
| |
| {%- elif kind|is_any_handle_kind %} |
| {{kind|cpp_data_view_type}} Take{{name|under_to_camel}}() { |
| DCHECK(is_{{name}}()); |
| {{kind|cpp_data_view_type}} result; |
| bool ret = |
| mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>( |
| &data_->data.f_{{name}}, &result, context_); |
| DCHECK(ret); |
| return result; |
| } |
| |
| {%- elif kind|is_any_interface_kind %} |
| template <typename UserType> |
| UserType Take{{name|under_to_camel}}() { |
| DCHECK(is_{{name}}()); |
| UserType result; |
| bool ret = |
| mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>( |
| &data_->data.f_{{name}}, &result, context_); |
| DCHECK(ret); |
| return result; |
| } |
| |
| {%- else %} |
| {{kind|cpp_data_view_type}} {{name}}() const { |
| DCHECK(is_{{name}}()); |
| return data_->data.f_{{name}}; |
| } |
| |
| {%- endif %} |
| {%- endfor %} |
| |
| private: |
| internal::{{union.name}}_Data* data_ = nullptr; |
| {%- if union|requires_context_for_data_view %} |
| mojo::internal::SerializationContext* context_ = nullptr; |
| {%- endif %} |
| }; |
| |