7
7
8
8
namespace jni
9
9
{
10
- template < class E , class Enable = void >
10
+ template < class E , class Enable >
11
11
class Array ;
12
12
13
13
template < class E >
14
- class Array < E, std::enable_if_t <IsPrimitive<E>::value> >
14
+ class Array < E, std::enable_if_t <IsPrimitive<E>::value> > : public Object< ArrayTag<E> >
15
15
{
16
16
public:
17
+ using SuperType = Object< ArrayTag<E> >;
18
+ using UntaggedType = typename SuperType::UntaggedType;
17
19
using ElementType = E;
18
- using UntaggedType = jarray<E>;
19
-
20
- private:
21
- UntaggedType* array = nullptr ;
22
20
23
21
protected:
24
22
explicit Array (std::nullptr_t = nullptr )
25
23
{}
26
24
27
- explicit Array (UntaggedType* a)
28
- : array(a)
29
- {}
30
-
31
- Array (const Array& a)
32
- : array(a.array)
25
+ explicit Array (UntaggedType* p)
26
+ : SuperType(p)
33
27
{}
34
28
35
- ~Array () = default ;
36
-
29
+ Array (const Array&) = delete ;
37
30
Array& operator =(const Array&) = delete ;
38
- void reset (UntaggedType* a) { array = a; }
39
31
40
32
public:
41
- explicit operator bool () const { return array; }
42
-
43
- UntaggedType& operator *() const { return *array; }
44
- UntaggedType* Get () const { return array; }
45
-
46
- friend bool operator ==( const Array& a, const Array& b ) { return a.Get () == b.Get (); }
47
- friend bool operator !=( const Array& a, const Array& b ) { return !( a == b ); }
48
-
49
33
jsize Length (JNIEnv& env) const
50
34
{
51
- return GetArrayLength (env, SafeDereference (env, array ));
35
+ return GetArrayLength (env, SafeDereference (env, this -> get () ));
52
36
}
53
37
54
38
ElementType Get (JNIEnv& env, jsize index) const
55
39
{
56
40
ElementType e;
57
- GetArrayRegion (env, SafeDereference (env, array ), index, 1 , &e);
41
+ GetArrayRegion (env, SafeDereference (env, this -> get () ), index, 1 , &e);
58
42
return e;
59
43
}
60
44
61
45
void Set (JNIEnv& env, jsize index, const ElementType& value)
62
46
{
63
- SetArrayRegion (env, SafeDereference (env, array ), index, 1 , &value);
47
+ SetArrayRegion (env, SafeDereference (env, this -> get () ), index, 1 , &value);
64
48
}
65
49
66
50
template < class Array >
67
51
void GetRegion (JNIEnv& env, jsize start, Array& buf) const
68
52
{
69
- GetArrayRegion (env, SafeDereference (env, array ), start, buf);
53
+ GetArrayRegion (env, SafeDereference (env, this -> get () ), start, buf);
70
54
}
71
55
72
56
template < class Array >
73
57
void SetRegion (JNIEnv& env, jsize start, const Array& buf)
74
58
{
75
- SetArrayRegion (env, SafeDereference (env, array ), start, buf);
59
+ SetArrayRegion (env, SafeDereference (env, this -> get () ), start, buf);
76
60
}
77
61
78
62
static Local<Array<E>> New (JNIEnv& env, jsize length)
@@ -83,103 +67,87 @@ namespace jni
83
67
template < template < RefDeletionMethod > class Deleter = DefaultRefDeleter >
84
68
Global<Array<E>, Deleter> NewGlobalRef (JNIEnv& env) const
85
69
{
86
- return Global<Array<E>, Deleter>(env, jni::NewGlobalRef (env, array ).release ());
70
+ return Global<Array<E>, Deleter>(env, jni::NewGlobalRef (env, this -> get () ).release ());
87
71
}
88
72
89
73
template < template < RefDeletionMethod > class Deleter = DefaultRefDeleter >
90
74
Weak<Array<E>, Deleter> NewWeakGlobalRef (JNIEnv& env) const
91
75
{
92
- return Weak<Array<E>, Deleter>(env, jni::NewWeakGlobalRef (env, array ).release ());
76
+ return Weak<Array<E>, Deleter>(env, jni::NewWeakGlobalRef (env, this -> get () ).release ());
93
77
}
94
78
95
79
Local<Array<E>> NewLocalRef (JNIEnv& env) const
96
80
{
97
- return Local<Array<E>>(env, jni::NewLocalRef (env, array ).release ());
81
+ return Local<Array<E>>(env, jni::NewLocalRef (env, this -> get () ).release ());
98
82
}
99
83
};
100
84
101
85
template < class TheTag >
102
- class Array < Object<TheTag> >
86
+ class Array < Object<TheTag> > : public Object< ArrayTag<Object<TheTag>> >
103
87
{
104
88
public:
89
+ using SuperType = Object< ArrayTag<Object<TheTag>> >;
90
+ using UntaggedType = typename SuperType::UntaggedType;
105
91
using TagType = TheTag;
106
92
using ElementType = Object<TagType>;
107
- using UntaggedType = jarray<jobject>;
108
93
using UntaggedElementType = typename ElementType::UntaggedType;
109
94
110
- private:
111
- UntaggedType* array = nullptr ;
112
-
113
95
protected:
114
96
explicit Array (std::nullptr_t = nullptr )
115
97
{}
116
98
117
- explicit Array (UntaggedType* a)
118
- : array(a)
119
- {}
120
-
121
- Array (const Array& a)
122
- : array(a.array)
99
+ explicit Array (UntaggedType* p)
100
+ : SuperType(p)
123
101
{}
124
102
125
- ~Array () = default ;
126
-
103
+ Array (const Array&) = delete ;
127
104
Array& operator =(const Array&) = delete ;
128
- void reset (UntaggedType* a) { array = a; }
129
105
130
106
public:
131
- explicit operator bool () const { return array; }
132
-
133
- UntaggedType& operator *() const { return *array; }
134
- UntaggedType* Get () const { return array; }
135
-
136
- friend bool operator ==( const Array& a, const Array& b ) { return a.Get () == b.Get (); }
137
- friend bool operator !=( const Array& a, const Array& b ) { return !( a == b ); }
138
-
139
107
jsize Length (JNIEnv& env) const
140
108
{
141
- return GetArrayLength (env, SafeDereference (env, array ));
109
+ return GetArrayLength (env, SafeDereference (env, this -> get () ));
142
110
}
143
111
144
112
Local<ElementType> Get (JNIEnv& env, jsize index) const
145
113
{
146
114
return Local<ElementType>(env,
147
115
reinterpret_cast <UntaggedElementType*>(
148
- GetObjectArrayElement (env, SafeDereference (env, array ), index)));
116
+ GetObjectArrayElement (env, SafeDereference (env, this -> get () ), index)));
149
117
}
150
118
151
119
void Set (JNIEnv& env, jsize index, const ElementType& value)
152
120
{
153
- SetObjectArrayElement (env, SafeDereference (env, array ), index, Untag (value));
121
+ SetObjectArrayElement (env, SafeDereference (env, this -> get () ), index, Untag (value));
154
122
}
155
123
156
124
static Local<Array<Object<TheTag>>> New (JNIEnv& env, jsize length, const Object<TheTag>* initialElement = nullptr )
157
125
{
158
- return Local<Array<Object<TheTag>>>(env, &NewObjectArray (env, length, Class<TheTag>::Singleton (env), initialElement ? initialElement->Get () : nullptr ));
126
+ return Local<Array<Object<TheTag>>>(env, &NewObjectArray (env, length, * Class<TheTag>::Singleton (env), initialElement ? initialElement->get () : nullptr ));
159
127
}
160
128
161
129
template < template < RefDeletionMethod > class Deleter = DefaultRefDeleter >
162
130
Global<Array<Object<TheTag>>, Deleter> NewGlobalRef (JNIEnv& env) const
163
131
{
164
- return Global<Array<Object<TheTag>>, Deleter>(env, jni::NewGlobalRef (env, array ).release ());
132
+ return Global<Array<Object<TheTag>>, Deleter>(env, jni::NewGlobalRef (env, this -> get () ).release ());
165
133
}
166
134
167
135
template < template < RefDeletionMethod > class Deleter = DefaultRefDeleter >
168
136
Weak<Array<Object<TheTag>>, Deleter> NewWeakGlobalRef (JNIEnv& env) const
169
137
{
170
- return Weak<Array<Object<TheTag>>, Deleter>(env, jni::NewWeakGlobalRef (env, array ).release ());
138
+ return Weak<Array<Object<TheTag>>, Deleter>(env, jni::NewWeakGlobalRef (env, this -> get () ).release ());
171
139
}
172
140
173
141
Local<Array<Object<TheTag>>> NewLocalRef (JNIEnv& env) const
174
142
{
175
- return Local<Array<Object<TheTag>>>(env, jni::NewLocalRef (env, array ).release ());
143
+ return Local<Array<Object<TheTag>>>(env, jni::NewLocalRef (env, this -> get () ).release ());
176
144
}
177
145
};
178
146
179
147
template < class T >
180
148
std::vector<T> MakeAnything (ThingToMake<std::vector<T>>, JNIEnv& env, const Array<T>& array)
181
149
{
182
- NullCheck (env, array.Get ());
150
+ NullCheck (env, array.get ());
183
151
std::vector<T> result (GetArrayLength (env, *array));
184
152
GetArrayRegion (env, *array, 0 , result);
185
153
return result;
@@ -196,7 +164,7 @@ namespace jni
196
164
inline
197
165
std::string MakeAnything (ThingToMake<std::string>, JNIEnv& env, const Array<jbyte>& array)
198
166
{
199
- NullCheck (env, array.Get ());
167
+ NullCheck (env, array.get ());
200
168
std::string result;
201
169
result.resize (GetArrayLength (env, *array));
202
170
GetArrayRegion (env, *array, 0 , result.size (), reinterpret_cast <jbyte*>(&result[0 ]));
0 commit comments