OLD | NEW |
---|---|
1 // static | 1 {%- set default_field = union.fields.0 %} |
2 {{union.name}}Ptr {{union.name}}::New() { | 2 {{union.name}}::{{union.name}}() : tag_(Tag::{{default_field.name|upper}}) { |
3 return {{union.name}}Ptr(base::in_place); | 3 {%- if default_field.kind|is_string_kind or default_field.kind|is_object_kind or |
yzshen1
2017/04/09 23:32:31
nit: is_object_kind includes is_string_kind, so it
Sam McNally
2017/04/10 00:31:31
Done.
| |
4 } | 4 default_field.kind|is_any_handle_or_interface_kind %} |
5 | 5 data_.{{default_field.name}} = new {{default_field.kind|cpp_wrapper_type}}; |
6 {{union.name}}::{{union.name}}() { | 6 {%- else %} |
7 // TODO(azani): Implement default values here when/if we support them. | 7 data_.{{default_field.name}} = {{default_field.kind|cpp_wrapper_type}}(); |
8 // TODO(azani): Set to UNKNOWN when unknown is implemented. | 8 {%- endif %} |
9 SetActive(static_cast<Tag>(0)); | |
10 } | 9 } |
11 | 10 |
12 {{union.name}}::~{{union.name}}() { | 11 {{union.name}}::~{{union.name}}() { |
13 DestroyActive(); | 12 DestroyActive(); |
14 } | 13 } |
15 | 14 |
16 {% for field in union.fields %} | 15 {% for field in union.fields %} |
17 void {{union.name}}::set_{{field.name}}({{field.kind|cpp_wrapper_param_type}} {{ field.name}}) { | 16 void {{union.name}}::set_{{field.name}}( |
18 SwitchActive(Tag::{{field.name|upper}}); | 17 {{field.kind|cpp_wrapper_param_type}} {{field.name}}) { |
19 {% if field.kind|is_string_kind %} | 18 {%- if field.kind|is_string_kind or field.kind|is_object_kind or |
20 *(data_.{{field.name}}) = {{field.name}}; | |
21 {% elif field.kind|is_object_kind or | |
22 field.kind|is_any_handle_or_interface_kind %} | 19 field.kind|is_any_handle_or_interface_kind %} |
23 *(data_.{{field.name}}) = std::move({{field.name}}); | 20 if (tag_ == Tag::{{field.name|upper}}) { |
21 *(data_.{{field.name}}) = std::move({{field.name}}); | |
22 } else { | |
23 DestroyActive(); | |
24 tag_ = Tag::{{field.name|upper}}; | |
25 data_.{{field.name}} = new {{field.kind|cpp_wrapper_type}}( | |
26 std::move({{field.name}})); | |
27 } | |
24 {%- else %} | 28 {%- else %} |
29 if (tag_ != Tag::{{field.name|upper}}) { | |
30 DestroyActive(); | |
31 tag_ = Tag::{{field.name|upper}}; | |
32 } | |
25 data_.{{field.name}} = {{field.name}}; | 33 data_.{{field.name}} = {{field.name}}; |
26 {%- endif %} | 34 {%- endif %} |
27 } | 35 } |
28 {%- endfor %} | 36 {%- endfor %} |
29 | 37 |
30 void {{union.name}}::SwitchActive(Tag new_active) { | |
31 if (new_active == tag_) { | |
32 return; | |
33 } | |
34 | |
35 DestroyActive(); | |
36 SetActive(new_active); | |
37 } | |
38 | |
39 void {{union.name}}::SetActive(Tag new_active) { | |
40 switch (new_active) { | |
41 {% for field in union.fields %} | |
42 case Tag::{{field.name|upper}}: | |
43 {% if field.kind|is_object_kind or | |
44 field.kind|is_any_handle_or_interface_kind %} | |
45 data_.{{field.name}} = new {{field.kind|cpp_wrapper_type}}(); | |
46 {%- endif %} | |
47 break; | |
48 {%- endfor %} | |
49 } | |
50 | |
51 tag_ = new_active; | |
52 } | |
53 | |
54 void {{union.name}}::DestroyActive() { | 38 void {{union.name}}::DestroyActive() { |
55 switch (tag_) { | 39 switch (tag_) { |
56 {% for field in union.fields %} | 40 {% for field in union.fields %} |
57 case Tag::{{field.name|upper}}: | 41 case Tag::{{field.name|upper}}: |
58 {% if field.kind|is_object_kind or | 42 {% if field.kind|is_object_kind or |
59 field.kind|is_any_handle_or_interface_kind %} | 43 field.kind|is_any_handle_or_interface_kind %} |
60 delete data_.{{field.name}}; | 44 delete data_.{{field.name}}; |
61 {%- endif %} | 45 {%- endif %} |
62 break; | 46 break; |
63 {%- endfor %} | 47 {%- endfor %} |
(...skipping 10 matching lines...) Expand all Loading... | |
74 return mojo::internal::WTFHash(seed, data_.{{field.name}}); | 58 return mojo::internal::WTFHash(seed, data_.{{field.name}}); |
75 {%- else %} | 59 {%- else %} |
76 return mojo::internal::Hash(seed, data_.{{field.name}}); | 60 return mojo::internal::Hash(seed, data_.{{field.name}}); |
77 {%- endif %} | 61 {%- endif %} |
78 {%- endfor %} | 62 {%- endfor %} |
79 default: | 63 default: |
80 NOTREACHED(); | 64 NOTREACHED(); |
81 return seed; | 65 return seed; |
82 } | 66 } |
83 } | 67 } |
84 | |
85 {%- endif %} | 68 {%- endif %} |
OLD | NEW |