| OLD | NEW |
| (Empty) |
| 1 // static | |
| 2 {{union.name}}Ptr {{union.name}}::New() { | |
| 3 {{union.name}}Ptr rv; | |
| 4 mojo::internal::StructHelper<{{union.name}}>::Initialize(&rv); | |
| 5 return rv; | |
| 6 } | |
| 7 | |
| 8 {{union.name}}::{{union.name}}() { | |
| 9 // TODO(azani): Implement default values here when/if we support them. | |
| 10 tag_ = Tag::__UNKNOWN__; | |
| 11 } | |
| 12 | |
| 13 {{union.name}}::~{{union.name}}() { | |
| 14 DestroyActive(); | |
| 15 } | |
| 16 | |
| 17 {% if union|is_cloneable_kind %} | |
| 18 {{union.name}}Ptr {{union.name}}::Clone() const { | |
| 19 {{union.name}}Ptr rv(New()); | |
| 20 switch (tag_) { | |
| 21 {% for field in union.fields %} | |
| 22 case Tag::{{field.name|upper}}: | |
| 23 {% if field.kind|is_string_kind %} | |
| 24 rv->set_{{field.name}}(*(data_.{{field.name}})); | |
| 25 {% elif field.kind|is_object_kind %} | |
| 26 rv->set_{{field.name}}(data_.{{field.name}}->Clone()); | |
| 27 {%- else %} | |
| 28 rv->set_{{field.name}}(data_.{{field.name}}); | |
| 29 {%- endif %} | |
| 30 break; | |
| 31 {%- endfor %} | |
| 32 case Tag::__UNKNOWN__: | |
| 33 break; | |
| 34 }; | |
| 35 return rv; | |
| 36 } | |
| 37 {%- endif %} | |
| 38 | |
| 39 bool {{union.name}}::Equals(const {{union.name}}& other) const { | |
| 40 if (tag_ != other.which()) { | |
| 41 return false; | |
| 42 } | |
| 43 | |
| 44 switch (tag_) { | |
| 45 {% for field in union.fields %} | |
| 46 case Tag::{{field.name|upper}}: | |
| 47 {% if field.kind|is_object_kind or field.kind|is_any_handle_kind | |
| 48 or field.kind|is_interface_kind %} | |
| 49 return mojo::internal::ValueTraits<{{field.kind|cpp_wrapper_type}}>::Equal
s(*(data_.{{field.name}}), *(other.data_.{{field.name}})); | |
| 50 {%- else %} | |
| 51 return mojo::internal::ValueTraits<{{field.kind|cpp_wrapper_type}}>::Equal
s(data_.{{field.name}}, other.data_.{{field.name}}); | |
| 52 {%- endif %} | |
| 53 {%- endfor %} | |
| 54 case Tag::__UNKNOWN__: | |
| 55 return false; | |
| 56 }; | |
| 57 | |
| 58 return false; | |
| 59 } | |
| 60 | |
| 61 {% for field in union.fields %} | |
| 62 bool {{union.name}}::is_{{field.name}}() const { | |
| 63 return tag_ == Tag::{{field.name|upper}}; | |
| 64 } | |
| 65 | |
| 66 {{field.kind|cpp_union_getter_return_type}} {{union.name}}::get_{{field.name}}()
const { | |
| 67 MOJO_DCHECK(tag_ == Tag::{{field.name|upper}}); | |
| 68 {% if field.kind|is_object_kind or field.kind|is_any_handle_kind | |
| 69 or field.kind|is_interface_kind %} | |
| 70 return *(data_.{{field.name}}); | |
| 71 {%- else %} | |
| 72 return data_.{{field.name}}; | |
| 73 {%- endif %} | |
| 74 } | |
| 75 | |
| 76 void {{union.name}}::set_{{field.name}}({{field.kind|cpp_const_wrapper_type}} {{
field.name}}) { | |
| 77 SwitchActive(Tag::{{field.name|upper}}); | |
| 78 {% if field.kind|is_string_kind %} | |
| 79 *(data_.{{field.name}}) = {{field.name}}; | |
| 80 {% elif field.kind|is_object_kind or field.kind|is_interface_kind %} | |
| 81 *(data_.{{field.name}}) = {{field.name}}.Pass(); | |
| 82 {% elif field.kind|is_any_handle_kind %} | |
| 83 data_.{{field.name}}->reset({{field.name}}.release()); | |
| 84 {%- else %} | |
| 85 data_.{{field.name}} = {{field.name}}; | |
| 86 {%- endif %} | |
| 87 } | |
| 88 {%- endfor %} | |
| 89 | |
| 90 bool {{union.name}}::has_unknown_tag() const { | |
| 91 return tag_ == Tag::__UNKNOWN__; | |
| 92 } | |
| 93 | |
| 94 void {{union.name}}::SwitchActive(Tag new_active) { | |
| 95 if (new_active == tag_) { | |
| 96 return; | |
| 97 } | |
| 98 | |
| 99 DestroyActive(); | |
| 100 SetActive(new_active); | |
| 101 } | |
| 102 | |
| 103 void {{union.name}}::SetActive(Tag new_active) { | |
| 104 switch (new_active) { | |
| 105 {% for field in union.fields %} | |
| 106 case Tag::{{field.name|upper}}: | |
| 107 {% if field.kind|is_object_kind or field.kind|is_any_handle_kind | |
| 108 or field.kind|is_interface_kind %} | |
| 109 data_.{{field.name}} = new {{field.kind|cpp_wrapper_type}}(); | |
| 110 {%- endif %} | |
| 111 break; | |
| 112 {%- endfor %} | |
| 113 case Tag::__UNKNOWN__: | |
| 114 MOJO_DCHECK(false) << "Do not set a union tag to unknown."; | |
| 115 break; | |
| 116 } | |
| 117 | |
| 118 tag_ = new_active; | |
| 119 } | |
| 120 | |
| 121 void {{union.name}}::DestroyActive() { | |
| 122 switch (tag_) { | |
| 123 {% for field in union.fields %} | |
| 124 case Tag::{{field.name|upper}}: | |
| 125 {% if field.kind|is_object_kind or field.kind|is_any_handle_kind | |
| 126 or field.kind|is_interface_kind %} | |
| 127 delete data_.{{field.name}}; | |
| 128 {%- endif %} | |
| 129 break; | |
| 130 {%- endfor %} | |
| 131 default: | |
| 132 break; | |
| 133 } | |
| 134 } | |
| OLD | NEW |