lime
Lime is a C++ library implementing Open Whisper System Signal protocol
class.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <jni/functions.hpp>
4#include <jni/tagging.hpp>
6#include <jni/object.hpp>
7
8namespace jni
9 {
10 template < class TheTag, class... > class Constructor;
11 template < class TheTag, class > class Field;
12 template < class TheTag, class > class StaticField;
13 template < class TheTag, class > class Method;
14 template < class TheTag, class > class StaticMethod;
15
16 template < class TheTag >
17 class Class : public Object<ClassTag>
18 {
19 public:
20 using TagType = TheTag;
23
24 protected:
25 explicit Class(std::nullptr_t = nullptr)
26 {}
27
28 explicit Class(UntaggedType* p)
29 : SuperType(p)
30 {}
31
32 Class(const Class&) = delete;
33 Class& operator=(const Class&) = delete;
34
35 public:
36 template < class... ExpectedArgs, class... ActualArgs >
37 auto New(JNIEnv& env, const Constructor<TagType, ExpectedArgs...>& method, const ActualArgs&... args) const
38 -> std::enable_if_t< Conjunction<std::is_convertible<const ActualArgs&, const ExpectedArgs&>...>::value, Local<Object<TagType>> >
39 {
40 return Local<Object<TagType>>(env, &NewObject(env, *this->get(), method, Untag(args)...));
41 }
42
43 template < class T >
44 auto Get(JNIEnv& env, const StaticField<TagType, T>& field) const
45 -> std::enable_if_t< IsPrimitive<T>::value, T >
46 {
47 return jni::GetStaticField<T>(env, *this->get(), field);
48 }
49
50 template < class T >
51 auto Get(JNIEnv& env, const StaticField<TagType, T>& field) const
52 -> std::enable_if_t< !IsPrimitive<T>::value, Local<T> >
53 {
54 return Local<T>(env, reinterpret_cast<typename T::UntaggedType*>(jni::GetStaticField<jobject*>(env, *this->get(), field)));
55 }
56
57 template < class T >
58 auto Set(JNIEnv& env, const StaticField<TagType, T>& field, T value) const
59 -> std::enable_if_t< IsPrimitive<T>::value >
60 {
61 SetStaticField<T>(env, *this->get(), field, value);
62 }
63
64 template < class Expected, class Actual >
65 auto Set(JNIEnv& env, const StaticField<TagType, Expected>& field, const Actual& value) const
66 -> std::enable_if_t< !IsPrimitive<Expected>::value
67 && std::is_convertible<const Actual&, const Expected&>::value >
68 {
69 SetStaticField<jobject*>(env, *this->get(), field, value.get());
70 }
71
72 template < class R, class... ExpectedArgs, class... ActualArgs >
73 auto Call(JNIEnv& env, const StaticMethod<TagType, R (ExpectedArgs...)>& method, const ActualArgs&... args) const
74 -> std::enable_if_t< IsPrimitive<R>::value
76 {
77 return CallStaticMethod<R>(env, *this->get(), method, Untag(args)...);
78 }
79
80 template < class R, class... ExpectedArgs, class... ActualArgs >
81 auto Call(JNIEnv& env, const StaticMethod<TagType, R (ExpectedArgs...)>& method, const ActualArgs&... args) const
82 -> std::enable_if_t< !IsPrimitive<R>::value
83 && !std::is_void<R>::value
85 {
86 return Local<R>(env, reinterpret_cast<typename R::UntaggedType*>(CallStaticMethod<jobject*>(env, *this->get(), method, Untag(args)...)));
87 }
88
89 template < class... ExpectedArgs, class... ActualArgs >
90 auto Call(JNIEnv& env, const StaticMethod<TagType, void (ExpectedArgs...)>& method, const ActualArgs&... args) const
91 -> std::enable_if_t< Conjunction<std::is_convertible<const ActualArgs&, const ExpectedArgs&>...>::value >
92 {
93 CallStaticMethod<void>(env, *this->get(), method, Untag(args)...);
94 }
95
96 static Local<Class> Find(JNIEnv& env)
97 {
98 return Local<Class>(env, &FindClass(env, TagType::Name()));
99 }
100
101 static const Class& Singleton(JNIEnv& env)
102 {
103 static Global<Class, EnvIgnoringDeleter> singleton = NewGlobal<EnvIgnoringDeleter>(env, Find(env));
104 return singleton;
105 }
106
107 template < class... Args >
108 Constructor<TagType, Args...> GetConstructor(JNIEnv& env) const
109 {
110 return Constructor<TagType, Args...>(env, *this);
111 }
112
113 template < class T >
114 Field<TagType, T> GetField(JNIEnv& env, const char* name) const
115 {
116 return Field<TagType, T>(env, *this, name);
117 }
118
119 template < class T >
120 StaticField<TagType, T> GetStaticField(JNIEnv& env, const char* name) const
121 {
122 return StaticField<TagType, T>(env, *this, name);
123 }
124
125 template < class T >
126 Method<TagType, T> GetMethod(JNIEnv& env, const char* name) const
127 {
128 return Method<TagType, T>(env, *this, name);
129 }
130
131 template < class T >
132 StaticMethod<TagType, T> GetStaticMethod(JNIEnv& env, const char* name) const
133 {
134 return StaticMethod<TagType, T>(env, *this, name);
135 }
136 };
137 }
Definition: class.hpp:18
auto Set(JNIEnv &env, const StaticField< TagType, T > &field, T value) const -> std::enable_if_t< IsPrimitive< T >::value >
Definition: class.hpp:58
StaticField< TagType, T > GetStaticField(JNIEnv &env, const char *name) const
Definition: class.hpp:120
Class(UntaggedType *p)
Definition: class.hpp:28
auto Get(JNIEnv &env, const StaticField< TagType, T > &field) const -> std::enable_if_t< !IsPrimitive< T >::value, Local< T > >
Definition: class.hpp:51
Method< TagType, T > GetMethod(JNIEnv &env, const char *name) const
Definition: class.hpp:126
Class(const Class &)=delete
auto Call(JNIEnv &env, const StaticMethod< TagType, void(ExpectedArgs...)> &method, const ActualArgs &... args) const -> std::enable_if_t< Conjunction< std::is_convertible< const ActualArgs &, const ExpectedArgs & >... >::value >
Definition: class.hpp:90
static Local< Class > Find(JNIEnv &env)
Definition: class.hpp:96
auto Call(JNIEnv &env, const StaticMethod< TagType, R(ExpectedArgs...)> &method, const ActualArgs &... args) const -> std::enable_if_t< IsPrimitive< R >::value &&Conjunction< std::is_convertible< const ActualArgs &, const ExpectedArgs & >... >::value, R >
Definition: class.hpp:73
Constructor< TagType, Args... > GetConstructor(JNIEnv &env) const
Definition: class.hpp:108
auto Set(JNIEnv &env, const StaticField< TagType, Expected > &field, const Actual &value) const -> std::enable_if_t< !IsPrimitive< Expected >::value &&std::is_convertible< const Actual &, const Expected & >::value >
Definition: class.hpp:65
Field< TagType, T > GetField(JNIEnv &env, const char *name) const
Definition: class.hpp:114
auto Get(JNIEnv &env, const StaticField< TagType, T > &field) const -> std::enable_if_t< IsPrimitive< T >::value, T >
Definition: class.hpp:44
Class(std::nullptr_t=nullptr)
Definition: class.hpp:25
StaticMethod< TagType, T > GetStaticMethod(JNIEnv &env, const char *name) const
Definition: class.hpp:132
Class & operator=(const Class &)=delete
TheTag TagType
Definition: class.hpp:20
static const Class & Singleton(JNIEnv &env)
Definition: class.hpp:101
auto Call(JNIEnv &env, const StaticMethod< TagType, R(ExpectedArgs...)> &method, const ActualArgs &... args) const -> std::enable_if_t< !IsPrimitive< R >::value &&!std::is_void< R >::value &&Conjunction< std::is_convertible< const ActualArgs &, const ExpectedArgs & >... >::value, Local< R > >
Definition: class.hpp:81
auto New(JNIEnv &env, const Constructor< TagType, ExpectedArgs... > &method, const ActualArgs &... args) const -> std::enable_if_t< Conjunction< std::is_convertible< const ActualArgs &, const ExpectedArgs & >... >::value, Local< Object< TagType > > >
Definition: class.hpp:37
Definition: constructor.hpp:9
Definition: field.hpp:13
Definition: class.hpp:13
Definition: object.hpp:45
UntaggedType * get() const
Definition: object.hpp:63
Definition: static_field.hpp:13
Definition: class.hpp:14
Definition: unique.hpp:39
Definition: advanced_ownership.hpp:6
jobject & NewObject(JNIEnv &env, jclass &clazz, jmethodID &method, Args &&... args)
Definition: functions.hpp:241
decltype(Untag(std::declval< T >())) UntaggedType
Definition: tagging.hpp:130
jclass & FindClass(JNIEnv &env, const char *name)
Definition: functions.hpp:34
auto Untag(T primitive) -> std::enable_if_t< IsPrimitive< T >::value, T >
Definition: tagging.hpp:116
Definition: traits.hpp:28
Definition: types.hpp:38