Skip to content

Commit f10267c

Browse files
committed
Rationalize New* ref-creating methods
1 parent c9ca058 commit f10267c

File tree

8 files changed

+74
-113
lines changed

8 files changed

+74
-113
lines changed

include/jni/array.hpp

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -63,23 +63,6 @@ namespace jni
6363
{
6464
return Local<Array<E>>(env, &NewArray<E>(env, length));
6565
}
66-
67-
template < template < RefDeletionMethod > class Deleter = DefaultRefDeleter >
68-
Global<Array<E>, Deleter> NewGlobalRef(JNIEnv& env) const
69-
{
70-
return Global<Array<E>, Deleter>(env, jni::NewGlobalRef(env, this->get()).release());
71-
}
72-
73-
template < template < RefDeletionMethod > class Deleter = DefaultRefDeleter >
74-
Weak<Array<E>, Deleter> NewWeakGlobalRef(JNIEnv& env) const
75-
{
76-
return Weak<Array<E>, Deleter>(env, jni::NewWeakGlobalRef(env, this->get()).release());
77-
}
78-
79-
Local<Array<E>> NewLocalRef(JNIEnv& env) const
80-
{
81-
return Local<Array<E>>(env, jni::NewLocalRef(env, this->get()).release());
82-
}
8366
};
8467

8568
template < class TheTag >
@@ -125,23 +108,6 @@ namespace jni
125108
{
126109
return Local<Array<Object<TheTag>>>(env, &NewObjectArray(env, length, *Class<TheTag>::Singleton(env), initialElement ? initialElement->get() : nullptr));
127110
}
128-
129-
template < template < RefDeletionMethod > class Deleter = DefaultRefDeleter >
130-
Global<Array<Object<TheTag>>, Deleter> NewGlobalRef(JNIEnv& env) const
131-
{
132-
return Global<Array<Object<TheTag>>, Deleter>(env, jni::NewGlobalRef(env, this->get()).release());
133-
}
134-
135-
template < template < RefDeletionMethod > class Deleter = DefaultRefDeleter >
136-
Weak<Array<Object<TheTag>>, Deleter> NewWeakGlobalRef(JNIEnv& env) const
137-
{
138-
return Weak<Array<Object<TheTag>>, Deleter>(env, jni::NewWeakGlobalRef(env, this->get()).release());
139-
}
140-
141-
Local<Array<Object<TheTag>>> NewLocalRef(JNIEnv& env) const
142-
{
143-
return Local<Array<Object<TheTag>>>(env, jni::NewLocalRef(env, this->get()).release());
144-
}
145111
};
146112

147113
template < class T >

include/jni/class.hpp

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ namespace jni
100100

101101
static const Class& Singleton(JNIEnv& env)
102102
{
103-
static Global<Class, EnvIgnoringDeleter> singleton = Find(env).template NewGlobalRef<EnvIgnoringDeleter>(env);
103+
static Global<Class, EnvIgnoringDeleter> singleton = NewGlobal<EnvIgnoringDeleter>(env, Find(env));
104104
return singleton;
105105
}
106106

@@ -133,22 +133,5 @@ namespace jni
133133
{
134134
return StaticMethod<TagType, T>(env, *this, name);
135135
}
136-
137-
template < template < RefDeletionMethod > class Deleter = DefaultRefDeleter >
138-
Global<Class<TagType>, Deleter> NewGlobalRef(JNIEnv& env) const
139-
{
140-
return Global<Class<TagType>, Deleter>(env, jni::NewGlobalRef(env, this->get()).release());
141-
}
142-
143-
template < template < RefDeletionMethod > class Deleter = DefaultRefDeleter >
144-
Weak<Class<TagType>, Deleter> NewWeakGlobalRef(JNIEnv& env) const
145-
{
146-
return Weak<Class<TagType>, Deleter>(env, jni::NewWeakGlobalRef(env, this->get()).release());
147-
}
148-
149-
Local<Class<TagType>> NewLocalRef(JNIEnv& env) const
150-
{
151-
return Local<Class<TagType>>(env, jni::NewLocalRef(env, this->get()).release());
152-
}
153136
};
154137
}

include/jni/native_method.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,10 @@ namespace jni
109109

110110
auto wrapper = [] (JNIEnv* env, UntaggedType<Subject> subject, UntaggedType<Args>... args)
111111
{
112-
return ReleaseLocal(method(*env, AsLvalue(Tag<std::decay_t<Subject>>(*env, *subject)), AsLvalue(Tag<std::decay_t<Args>>(*env, args))...));
112+
return ReleaseUnique(method(*env, AsLvalue(Tag<std::decay_t<Subject>>(*env, *subject)), AsLvalue(Tag<std::decay_t<Args>>(*env, args))...));
113113
};
114114

115-
return MakeNativeMethod(name, TypeSignature<BaseType<R> (std::decay_t<Args>...)>()(), wrapper);
115+
return MakeNativeMethod(name, TypeSignature<RemoveUniqueType<R> (std::decay_t<Args>...)>()(), wrapper);
116116
}
117117
};
118118

@@ -149,10 +149,10 @@ namespace jni
149149
{
150150
auto wrapper = [] (JNIEnv* env, UntaggedType<Subject> subject, UntaggedType<Args>... args)
151151
{
152-
return ReleaseLocal(method(*env, AsLvalue(Tag<std::decay_t<Subject>>(*env, *subject)), AsLvalue(Tag<std::decay_t<Args>>(*env, args))...));
152+
return ReleaseUnique(method(*env, AsLvalue(Tag<std::decay_t<Subject>>(*env, *subject)), AsLvalue(Tag<std::decay_t<Args>>(*env, args))...));
153153
};
154154

155-
return MakeNativeMethod(name, TypeSignature<BaseType<R> (std::decay_t<Args>...)>()(), wrapper);
155+
return MakeNativeMethod(name, TypeSignature<RemoveUniqueType<R> (std::decay_t<Args>...)>()(), wrapper);
156156
}
157157
};
158158

include/jni/object.hpp

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -139,23 +139,6 @@ namespace jni
139139
{
140140
CallNonvirtualMethod<void>(env, get(), clazz, method, Untag(args)...);
141141
}
142-
143-
template < template < RefDeletionMethod > class Deleter = DefaultRefDeleter >
144-
Global<Object<TagType>, Deleter> NewGlobalRef(JNIEnv& env) const
145-
{
146-
return Global<Object<TagType>, Deleter>(env, reinterpret_cast<typename Object<TagType>::UntaggedType*>(jni::NewGlobalRef(env, get()).release()));
147-
}
148-
149-
template < template < RefDeletionMethod > class Deleter = DefaultRefDeleter >
150-
Weak<Object<TagType>, Deleter> NewWeakGlobalRef(JNIEnv& env) const
151-
{
152-
return Weak<Object<TagType>, Deleter>(env, reinterpret_cast<typename Object<TagType>::UntaggedType*>(jni::NewWeakGlobalRef(env, get()).release()));
153-
}
154-
155-
Local<Object<TagType>> NewLocalRef(JNIEnv& env) const
156-
{
157-
return Local<Object<TagType>>(env, reinterpret_cast<typename Object<TagType>::UntaggedType*>(jni::NewLocalRef(env, get()).release()));
158-
}
159142
};
160143

161144
template < class OutTagType, class T >
@@ -165,6 +148,6 @@ namespace jni
165148
{
166149
ThrowNew(env, FindClass(env, "java/lang/ClassCastException"));
167150
}
168-
return Local<Object<OutTagType>>(env, reinterpret_cast<typename Object<OutTagType>::UntaggedType*>(object.NewLocalRef(env).release()));
151+
return Local<Object<OutTagType>>(env, reinterpret_cast<typename Object<OutTagType>::UntaggedType*>(NewLocal(env, object).release()));
169152
}
170153
}

include/jni/tagging.hpp

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -128,35 +128,4 @@ namespace jni
128128

129129
template < class T >
130130
using UntaggedType = decltype(Untag(std::declval<T>()));
131-
132-
133-
template < class T >
134-
struct BaseTypeTraits
135-
{
136-
using Type = T;
137-
};
138-
139-
template < class T >
140-
struct BaseTypeTraits< Local<T> >
141-
{
142-
using Type = T;
143-
};
144-
145-
template < class T >
146-
using BaseType = typename BaseTypeTraits<T>::Type;
147-
148-
149-
template < class T >
150-
auto ReleaseLocal(T primitive)
151-
-> std::enable_if_t< IsPrimitive<T>::value, T >
152-
{
153-
return primitive;
154-
}
155-
156-
template < class T >
157-
auto ReleaseLocal(Local<T>&& t)
158-
-> std::enable_if_t< !IsPrimitive<T>::value, decltype(t.release()) >
159-
{
160-
return t.release();
161-
}
162131
}

include/jni/unique.hpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,47 @@ namespace jni
123123
using Input = Unique< T, NullDeleter >;
124124

125125

126+
template < class T >
127+
struct RemoveUnique
128+
{
129+
using Type = T;
130+
};
131+
132+
template < class T, class D >
133+
struct RemoveUnique< Unique<T, D> >
134+
{
135+
using Type = T;
136+
};
137+
138+
template < class T >
139+
using RemoveUniqueType = typename RemoveUnique<T>::Type;
140+
141+
142+
template < class T >
143+
auto ReleaseUnique(T primitive)
144+
{
145+
return primitive;
146+
}
147+
148+
template < class T, class D >
149+
auto ReleaseUnique(Unique<T, D>&& t)
150+
{
151+
return t.release();
152+
}
153+
154+
155+
template < template < RefDeletionMethod > class Deleter, class T >
156+
auto NewGlobal(JNIEnv& env, const T& t)
157+
{
158+
return Global<RemoveUniqueType<T>, Deleter>(env, reinterpret_cast<typename T::UntaggedType*>(jni::NewGlobalRef(env, t.get()).release()));
159+
}
160+
161+
template < class T >
162+
auto NewGlobal(JNIEnv& env, const T& t)
163+
{
164+
return NewGlobal<DefaultRefDeleter>(env, t);
165+
}
166+
126167
// Attempt to promote a weak reference to a strong one. Returns an empty result
127168
// if the weak reference has expired.
128169
//
@@ -144,6 +185,25 @@ namespace jni
144185
}
145186

146187

188+
template < template < RefDeletionMethod > class Deleter, class T >
189+
auto NewWeak(JNIEnv& env, const T& t)
190+
{
191+
return Weak<RemoveUniqueType<T>, Deleter>(env, reinterpret_cast<typename T::UntaggedType*>(jni::NewWeakGlobalRef(env, t.get()).release()));
192+
}
193+
194+
template < class T >
195+
auto NewWeak(JNIEnv& env, const T& t)
196+
{
197+
return NewWeak<DefaultRefDeleter>(env, t);
198+
}
199+
200+
201+
template < class T >
202+
auto NewLocal(JNIEnv& env, const T& t)
203+
{
204+
return Local<RemoveUniqueType<T>>(env, reinterpret_cast<typename T::UntaggedType*>(jni::NewLocalRef(env, t.get()).release()));
205+
}
206+
147207
// Attempt to promote a weak reference to a strong one. Returns an empty result
148208
// if the weak reference has expired.
149209
//

include/jni/weak_reference.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ namespace jni
2222
{
2323
static auto& klass = Class<WeakReferenceTag>::Singleton(env);
2424
static auto constructor = klass.GetConstructor<Object<>>(env);
25-
reference = klass.New(env, constructor, referent).template NewGlobalRef<Deleter>(env);
25+
reference = NewGlobal<Deleter>(env, klass.New(env, constructor, referent));
2626
}
2727

2828
Local<T> get(JNIEnv& env)

test/high_level.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -116,21 +116,21 @@ int main()
116116
{
117117
};
118118

119-
testClass.NewGlobalRef(env);
119+
jni::NewGlobal(env, testClass);
120120
assert(calledNewGlobalRef);
121121

122122

123123
/// Object
124124

125125
jni::Local<jni::Object<Test>> object { env, objectValue.Ptr() };
126-
object.NewGlobalRef(env);
127-
object.NewWeakGlobalRef(env);
128-
object.NewLocalRef(env);
126+
jni::NewGlobal(env, object);
127+
jni::NewWeak(env, object);
128+
jni::NewLocal(env, object);
129129

130130
jni::Local<jni::String> string { env, stringValue.Ptr() };
131-
string.NewGlobalRef(env);
132-
string.NewWeakGlobalRef(env);
133-
string.NewLocalRef(env);
131+
jni::NewGlobal(env, string);
132+
jni::NewWeak(env, string);
133+
jni::NewLocal(env, string);
134134

135135
jni::Local<jni::Object<Base>> base { jni::Local<jni::Object<Derived>>() };
136136
base = jni::Local<jni::Object<Derived>>();

0 commit comments

Comments
 (0)