Skip to content

Commit 8975580

Browse files
committed
Create big five of ArenaRef.
1 parent 3acc2af commit 8975580

File tree

3 files changed

+141
-9
lines changed

3 files changed

+141
-9
lines changed

firestore/integration_test_internal/src/android/arena_ref_android_test.cc

+85-3
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,92 @@ TEST_F(ArenaRefTestAndroid, ConstructFromEnvAndObject) {
3939
Local<String> string = env.NewStringUtf("hello world");
4040

4141
ArenaRef arena_ref(env, string);
42+
EXPECT_TRUE(arena_ref.get(env).Equals(env, string));
43+
}
44+
45+
TEST_F(ArenaRefTestAndroid, CopyConstructor) {
46+
Env env;
47+
48+
ArenaRef arena_ref1;
49+
ArenaRef arena_ref2(arena_ref1);
50+
EXPECT_EQ(arena_ref2.get(env).get(), nullptr);
51+
52+
Local<String> string = env.NewStringUtf("hello world");
53+
54+
ArenaRef arena_ref3(env, string);
55+
ArenaRef arena_ref4(arena_ref3);
56+
ArenaRef arena_ref5 = arena_ref3;
57+
58+
EXPECT_TRUE(arena_ref3.get(env).Equals(env, string));
59+
EXPECT_TRUE(arena_ref4.get(env).Equals(env, string));
60+
EXPECT_TRUE(arena_ref5.get(env).Equals(env, string));
61+
}
62+
63+
TEST_F(ArenaRefTestAndroid, CopyAssignmentOp) {
64+
Env env;
65+
66+
ArenaRef arena_ref1, arena_ref2;
67+
arena_ref2 = arena_ref1;
68+
EXPECT_EQ(arena_ref1.get(env).get(), nullptr);
69+
EXPECT_EQ(arena_ref2.get(env).get(), nullptr);
70+
71+
Local<String> string1 = env.NewStringUtf("hello world");
72+
Local<String> string2 = env.NewStringUtf("hello earth");
73+
74+
ArenaRef arena_ref3(env, string1);
75+
ArenaRef arena_ref4(env, string2);
76+
arena_ref4 = arena_ref3;
77+
arena_ref3 = arena_ref3;
78+
79+
EXPECT_TRUE(arena_ref3.get(env).Equals(env, string1));
80+
EXPECT_TRUE(arena_ref4.get(env).Equals(env, string1));
81+
82+
arena_ref3 = arena_ref1;
83+
EXPECT_EQ(arena_ref3.get(env).get(), nullptr);
84+
EXPECT_TRUE(arena_ref4.get(env).Equals(env, string1));
85+
}
86+
87+
TEST_F(ArenaRefTestAndroid, MoveConstructor) {
88+
Env env;
89+
90+
ArenaRef arena_ref1;
91+
ArenaRef arena_ref2(std::move(arena_ref1));
92+
EXPECT_EQ(arena_ref1.get(env).get(), nullptr);
93+
EXPECT_EQ(arena_ref2.get(env).get(), nullptr);
94+
95+
Local<String> string = env.NewStringUtf("hello world");
96+
97+
ArenaRef arena_ref3(env, string);
98+
ArenaRef arena_ref4(std::move(arena_ref3));
99+
EXPECT_EQ(arena_ref3.get(env).get(), nullptr);
100+
EXPECT_TRUE(arena_ref4.get(env).Equals(env, string));
101+
102+
ArenaRef arena_ref5 = std::move(arena_ref4);
103+
EXPECT_TRUE(arena_ref5.get(env).Equals(env, string));
104+
}
105+
106+
TEST_F(ArenaRefTestAndroid, MoveAssignmentOp) {
107+
Env env;
108+
109+
ArenaRef arena_ref1, arena_ref2;
110+
arena_ref2 = std::move(arena_ref1);
111+
EXPECT_EQ(arena_ref1.get(env).get(), nullptr);
112+
EXPECT_EQ(arena_ref2.get(env).get(), nullptr);
113+
114+
Local<String> string1 = env.NewStringUtf("hello world");
115+
Local<String> string2 = env.NewStringUtf("hello earth");
116+
117+
ArenaRef arena_ref3(env, string1);
118+
arena_ref3 = std::move(arena_ref3);
119+
EXPECT_TRUE(arena_ref3.get(env).Equals(env, string1));
120+
121+
ArenaRef arena_ref4(env, string2);
122+
arena_ref4 = std::move(arena_ref3);
123+
EXPECT_EQ(arena_ref3.get(env).get(), nullptr);
124+
EXPECT_TRUE(arena_ref4.get(env).Equals(env, string1));
42125

43-
Local<String> stringRef2 = string;
44-
string.clear();
45-
EXPECT_TRUE(arena_ref.get(env).Equals(env, stringRef2));
126+
arena_ref4 = std::move(arena_ref1);
127+
EXPECT_EQ(arena_ref4.get(env).get(), nullptr);
46128
}
47129

48130
} // namespace

firestore/src/jni/arena_ref.cc

+47-2
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,57 @@ int64_t GetNextArenaRefKey() {
3434
return next_key.fetch_add(1);
3535
}
3636

37-
}
37+
} // namespace
3838

39-
ArenaRef::ArenaRef(Env& env, const Object& object) : key_(GetNextArenaRefKey()) {
39+
ArenaRef::ArenaRef(Env& env, const Object& object)
40+
: key_(GetNextArenaRefKey()) {
4041
gArenaRefHashMap->Put(env, key_object(env), object);
4142
}
4243

44+
ArenaRef::ArenaRef(const ArenaRef& other) : key_(GetNextArenaRefKey()) {
45+
if (other.key_ != 0) {
46+
Env env;
47+
Local<Object> object = other.get(env);
48+
gArenaRefHashMap->Put(env, key_object(env), object);
49+
}
50+
}
51+
52+
ArenaRef::ArenaRef(ArenaRef&& other) {
53+
key_ = other.key_;
54+
other.key_ = 0;
55+
}
56+
57+
ArenaRef& ArenaRef::operator=(const ArenaRef& other) {
58+
Env env;
59+
60+
if (key_ != other.key_) {
61+
if (key_ != 0) {
62+
gArenaRefHashMap->Remove(env, key_object(env));
63+
}
64+
65+
if (other.key_ != 0) {
66+
key_ = GetNextArenaRefKey();
67+
Local<Object> object = other.get(env);
68+
gArenaRefHashMap->Put(env, key_object(env), object);
69+
}
70+
}
71+
return *this;
72+
}
73+
74+
ArenaRef& ArenaRef::operator=(ArenaRef&& other) {
75+
Env env;
76+
77+
if (key_ != other.key_) {
78+
if (key_ != 0) {
79+
gArenaRefHashMap->Remove(env, key_object(env));
80+
}
81+
82+
key_ = other.key_;
83+
other.key_ = 0;
84+
}
85+
return *this;
86+
}
87+
4388
ArenaRef::~ArenaRef() {
4489
if (key_ != 0) {
4590
Env env;

firestore/src/jni/arena_ref.h

+9-4
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,18 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
#include <cstdlib>
16+
17+
#ifndef FIREBASE_FIRESTORE_SRC_JNI_ARENA_REF_H_
18+
#define FIREBASE_FIRESTORE_SRC_JNI_ARENA_REF_H_
1719

1820
#include <jni.h>
1921

22+
#include <cstdlib>
23+
2024
#include "firestore/src/jni/env.h"
2125
#include "firestore/src/jni/object.h"
2226
#include "firestore/src/jni/ownership.h"
2327

24-
#ifndef FIREBASE_FIRESTORE_SRC_JNI_ARENA_REF_H_
25-
#define FIREBASE_FIRESTORE_SRC_JNI_ARENA_REF_H_
26-
2728
namespace firebase {
2829
namespace firestore {
2930
namespace jni {
@@ -32,6 +33,10 @@ class ArenaRef {
3233
public:
3334
ArenaRef() = default;
3435
ArenaRef(Env&, const Object&);
36+
ArenaRef(const ArenaRef& other);
37+
ArenaRef(ArenaRef&& other);
38+
ArenaRef& operator=(const ArenaRef& other);
39+
ArenaRef& operator=(ArenaRef&& other);
3540
~ArenaRef();
3641

3742
static void Initialize(Env&);

0 commit comments

Comments
 (0)