12
12
// See the License for the specific language governing permissions and
13
13
// limitations under the License.
14
14
15
+ #include < type_traits>
16
+
15
17
#include < mongocxx/model/write.hpp>
16
18
17
19
#include < mongocxx/config/prelude.hpp>
@@ -21,23 +23,56 @@ MONGOCXX_INLINE_NAMESPACE_BEGIN
21
23
namespace model {
22
24
23
25
write::write (insert_one value) : _type(write_type::k_insert_one), _insert_one(std::move(value)) {
26
+ static_assert (std::is_nothrow_move_constructible<insert_one>::value, " Move-construct may throw" );
27
+ static_assert (std::is_nothrow_move_assignable<insert_one>::value, " Move-assign may throw" );
24
28
}
25
29
write::write (delete_one value) : _type(write_type::k_delete_one), _delete_one(std::move(value)) {
30
+ static_assert (std::is_nothrow_move_constructible<delete_one>::value, " Move-construct may throw" );
31
+ static_assert (std::is_nothrow_move_assignable<delete_one>::value, " Move-assign may throw" );
26
32
}
27
33
write::write (delete_many value) : _type(write_type::k_delete_many), _delete_many(std::move(value)) {
34
+ static_assert (std::is_nothrow_move_constructible<delete_many>::value, " Move-construct may throw" );
35
+ static_assert (std::is_nothrow_move_assignable<delete_many>::value, " Move-assign may throw" );
28
36
}
29
37
write::write (update_one value) : _type(write_type::k_update_one), _update_one(std::move(value)) {
38
+ static_assert (std::is_nothrow_move_constructible<update_one>::value, " Move-construct may throw" );
39
+ static_assert (std::is_nothrow_move_assignable<update_one>::value, " Move-assign may throw" );
30
40
}
31
41
write::write (update_many value) : _type(write_type::k_update_many), _update_many(std::move(value)) {
42
+ static_assert (std::is_nothrow_move_constructible<update_many>::value, " Move-construct may throw" );
43
+ static_assert (std::is_nothrow_move_assignable<update_many>::value, " Move-assign may throw" );
32
44
}
33
45
write::write (replace_one value) : _type(write_type::k_replace_one), _replace_one(std::move(value)) {
46
+ static_assert (std::is_nothrow_move_constructible<replace_one>::value, " Move-construct may throw" );
47
+ static_assert (std::is_nothrow_move_assignable<replace_one>::value, " Move-assign may throw" );
34
48
}
35
49
36
- write::write (write&& rhs) noexcept : _type(write_type::k_uninitialized) {
37
- *this = std::move (rhs);
50
+ write::write (write&& rhs) noexcept {
51
+ switch (rhs._type ) {
52
+ case write_type::k_insert_one:
53
+ new (&_insert_one) insert_one (std::move (rhs._insert_one ));
54
+ break ;
55
+ case write_type::k_update_one:
56
+ new (&_update_one) update_one (std::move (rhs._update_one ));
57
+ break ;
58
+ case write_type::k_update_many:
59
+ new (&_update_many) update_many (std::move (rhs._update_many ));
60
+ break ;
61
+ case write_type::k_delete_one:
62
+ new (&_delete_one) delete_one (std::move (rhs._delete_one ));
63
+ break ;
64
+ case write_type::k_delete_many:
65
+ new (&_delete_many) delete_many (std::move (rhs._delete_many ));
66
+ break ;
67
+ case write_type::k_replace_one:
68
+ new (&_replace_one) replace_one (std::move (rhs._replace_one ));
69
+ break ;
70
+ }
71
+
72
+ _type = rhs._type ;
38
73
}
39
74
40
- void write::destroy_member () {
75
+ void write::destroy_member () noexcept {
41
76
switch (_type) {
42
77
case write_type::k_insert_one:
43
78
_insert_one.~insert_one ();
@@ -57,36 +92,34 @@ void write::destroy_member() {
57
92
case write_type::k_replace_one:
58
93
_replace_one.~replace_one ();
59
94
break ;
60
- case write_type::k_uninitialized:
61
- break ;
62
95
}
63
-
64
- _type = write_type::k_uninitialized;
65
96
}
66
97
67
98
write& write::operator =(write&& rhs) noexcept {
99
+ if (this == &rhs) {
100
+ return *this ;
101
+ }
102
+
68
103
destroy_member ();
69
104
70
105
switch (rhs._type ) {
71
106
case write_type::k_insert_one:
72
- _insert_one = std::move (rhs._insert_one );
107
+ new (& _insert_one) insert_one ( std::move (rhs._insert_one ) );
73
108
break ;
74
109
case write_type::k_update_one:
75
- _update_one = std::move (rhs._update_one );
110
+ new (& _update_one) update_one ( std::move (rhs._update_one ) );
76
111
break ;
77
112
case write_type::k_update_many:
78
- _update_many = std::move (rhs._update_many );
113
+ new (& _update_many) update_many ( std::move (rhs._update_many ) );
79
114
break ;
80
115
case write_type::k_delete_one:
81
- _delete_one = std::move (rhs._delete_one );
116
+ new (& _delete_one) delete_one ( std::move (rhs._delete_one ) );
82
117
break ;
83
118
case write_type::k_delete_many:
84
- _delete_many = std::move (rhs._delete_many );
119
+ new (& _delete_many) delete_many ( std::move (rhs._delete_many ) );
85
120
break ;
86
121
case write_type::k_replace_one:
87
- _replace_one = std::move (rhs._replace_one );
88
- break ;
89
- case write_type::k_uninitialized:
122
+ new (&_replace_one) replace_one (std::move (rhs._replace_one ));
90
123
break ;
91
124
}
92
125
0 commit comments