1 // Copyright © 2021-present 650 Industries, Inc. (aka Expo)
2 
3 #pragma once
4 
5 #include "CppType.h"
6 #include "FrontendConverter.h"
7 #include "ExpectedType.h"
8 
9 #include <fbjni/fbjni.h>
10 
11 #include <memory>
12 #include <unordered_map>
13 
14 namespace jni = facebook::jni;
15 
16 namespace expo {
17 /**
18  * Singleton registry used to store all basic converters.
19  */
20 class FrontendConverterProvider {
21 public:
22   /**
23    * Gets a singleton instance.
24    */
25   static std::shared_ptr<FrontendConverterProvider> instance();
26 
27   /**
28    * Creates converters.
29    */
30   void createConverters();
31 
32   /**
33    * Obtains a converter for an expected type.
34    */
35   std::shared_ptr<FrontendConverter> obtainConverter(
36     jni::local_ref<jni::JavaClass<ExpectedType>::javaobject> expectedType
37   );
38 private:
39   FrontendConverterProvider() = default;
40 
41   std::shared_ptr<FrontendConverter> obtainConverterForSingleType(
42     jni::local_ref<jni::JavaClass<SingleType>::javaobject> expectedType
43   );
44 
45   std::unordered_map<CppType, std::shared_ptr<FrontendConverter>> simpleConverters;
46 };
47 } // namespace expo
48