1 #pragma once
2 
3 #include <fbjni/fbjni.h>
4 
5 namespace jni = facebook::jni;
6 
7 namespace expo::java {
8 
9 template<typename E = jobject>
10 struct Iterable : public jni::JavaClass<Iterable<E>> {
11   constexpr static auto kJavaDescriptor = "Ljava/lang/Iterable;";
12 };
13 
14 template<typename E = jobject>
15 struct Collection : public jni::JavaClass<Collection<E>, Iterable<E>> {
16   constexpr static auto kJavaDescriptor = "Ljava/util/Collection;";
17 
addCollection18   bool add(jni::alias_ref<E> element) {
19     static auto addMethod = Collection<E>::javaClassStatic()->
20       template getMethod<jboolean(jni::alias_ref<jni::JObject>)>("add");
21     return addMethod(this->self(), element);
22   }
23 };
24 
25 template<typename E = jobject>
26 struct List : public jni::JavaClass<List<E>, Collection<E>> {
27   constexpr static auto kJavaDescriptor = "Ljava/util/List;";
28 };
29 
30 template<typename E = jobject>
31 struct ArrayList : public jni::JavaClass<ArrayList<E>, List<E>> {
32   constexpr static auto kJavaDescriptor = "Ljava/util/ArrayList;";
33 
createArrayList34   static jni::local_ref<typename ArrayList<E>::javaobject> create(size_t size) {
35     return ArrayList<E>::newInstance((int) size);
36   }
37 };
38 
39 template<typename K = jobject, typename V = jobject>
40 struct Map : public jni::JavaClass<Map<K, V>> {
41   constexpr static auto kJavaDescriptor = "Ljava/util/Map;";
42 
putMap43   jni::local_ref<V> put(jni::alias_ref<K> key, jni::alias_ref<V> value) {
44     static auto putMethod = Map<K, V>::javaClassStatic()->
45       template getMethod<jni::local_ref<V>(jni::alias_ref<K>, jni::alias_ref<V>)>("put");
46     return putMethod(this->self(), key, value);
47   }
48 };
49 
50 template<typename K = jobject, typename V = jobject>
51 struct HashMap : public jni::JavaClass<HashMap<K, V>, Map<K, V>> {
52   constexpr static auto kJavaDescriptor = "Ljava/util/HashMap;";
53 };
54 
55 template<typename K = jobject, typename V = jobject>
56 struct LinkedHashMap : public jni::JavaClass<LinkedHashMap<K, V>, HashMap<K, V>> {
57   constexpr static auto kJavaDescriptor = "Ljava/util/LinkedHashMap;";
58 
createLinkedHashMap59   static jni::local_ref<typename LinkedHashMap<K, V>::javaobject> create(size_t size) {
60     return LinkedHashMap<K, V>::newInstance((int) size);
61   }
62 };
63 } // namespace expo::java
64