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 |