mirror of
https://github.com/zeek/zeek.git
synced 2025-10-12 03:28:19 +00:00
ZValElement: Implement move assignment operator
This commit is contained in:
parent
d06e329de2
commit
907c1a3ee9
2 changed files with 37 additions and 0 deletions
13
src/Val.cc
13
src/Val.cc
|
@ -4238,6 +4238,19 @@ TEST_CASE("assignment") {
|
||||||
CHECK(v2->RefCnt() == 3);
|
CHECK(v2->RefCnt() == 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("move assignment") {
|
||||||
|
auto t = zeek::id::find_type<zeek::RecordType>("conn_id_ctx");
|
||||||
|
auto v1 = zeek::make_intrusive<zeek::RecordVal>(t);
|
||||||
|
auto v2 = zeek::make_intrusive<zeek::RecordVal>(t);
|
||||||
|
|
||||||
|
zeek::ZValElement element1 = zeek::ZValElement(v1, t);
|
||||||
|
CHECK(v1->RefCnt() == 2); // v1 and element1
|
||||||
|
element1 = zeek::ZValElement(v2, t); // Should use move assignment.
|
||||||
|
|
||||||
|
CHECK(v1->RefCnt() == 1); // Only v1 holds the ref.
|
||||||
|
CHECK(v2->RefCnt() == 2); // v1 and element1 adopted ref from temporary.
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE("copy constructor") {
|
TEST_CASE("copy constructor") {
|
||||||
auto t = zeek::id::find_type<zeek::RecordType>("conn_id_ctx");
|
auto t = zeek::id::find_type<zeek::RecordType>("conn_id_ctx");
|
||||||
auto v = zeek::make_intrusive<zeek::RecordVal>(t);
|
auto v = zeek::make_intrusive<zeek::RecordVal>(t);
|
||||||
|
|
24
src/Val.h
24
src/Val.h
|
@ -1198,6 +1198,30 @@ public:
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Move assignment operator.
|
||||||
|
*
|
||||||
|
* Adopts the reference if \a o holds a managed ZVal.
|
||||||
|
*/
|
||||||
|
ZValElement& operator=(ZValElement&& o) noexcept {
|
||||||
|
if ( this == &o )
|
||||||
|
return *this;
|
||||||
|
|
||||||
|
if ( is_set && is_managed )
|
||||||
|
Unref(zval.ManagedVal());
|
||||||
|
|
||||||
|
is_set = o.is_set;
|
||||||
|
is_managed = o.is_managed;
|
||||||
|
tag = o.tag;
|
||||||
|
zval = o.zval; // Adopts the reference.
|
||||||
|
|
||||||
|
// Keep is_managed and tag members valid.
|
||||||
|
o.is_set = false;
|
||||||
|
o.zval = ZVal();
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Assign a ZVal to ZValElement.
|
* Assign a ZVal to ZValElement.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue