@@ -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 //
0 commit comments