6
6
* LICENSE file in the root directory of this source tree.
7
7
*/
8
8
9
- #pragma once
10
- #include < executorch/runtime/core/error.h>
11
- #include < cstddef>
12
- #include < cstring>
13
- #include < executorch/runtime/core/array_ref.h>
14
- #include < executorch/runtime/core/error.h>
15
- #include < variant>
16
-
17
- namespace executorch {
18
- namespace runtime {
19
-
20
- // Strongly-typed option key template
21
- template <typename T>
22
- struct OptionKey {
23
- const char * key;
24
- constexpr explicit OptionKey (const char * k) : key(k) {}
25
- };
26
-
27
- // Union replaced with std::variant
28
- using OptionValue = std::variant<bool , int , const char *>;
29
-
30
- struct BackendOption {
31
- const char * key; // key is the name of the backend option, like num_threads,
32
- // enable_profiling, etc
33
- OptionValue
34
- value; // value is the value of the backend option, like 4, true, etc
35
- };
36
-
37
- template <size_t MaxCapacity>
38
- class BackendOptions {
39
- public:
40
- // Initialize with zero options
41
- BackendOptions () : size_(0 ) {}
42
-
43
- // Type-safe setters
44
- template <typename T>
45
- void set_option (OptionKey<T> key, T value) {
46
- const char * k = key.key ;
47
- // Update existing if found
48
- for (size_t i = 0 ; i < size_; ++i) {
49
- if (strcmp (options_[i].key , k) == 0 ) {
50
- options_[i].value = value;
51
- return ;
52
- }
53
- }
54
- // Add new option if space available
55
- if (size_ < MaxCapacity) {
56
- options_[size_++] = BackendOption{k, value};
57
- }
58
- }
59
-
60
- // Type-safe getters
61
- template <typename T>
62
- Error get_option (OptionKey<T> key, T& out) const {
63
- const char * k = key.key ;
64
- for (size_t i = 0 ; i < size_; ++i) {
65
- if (strcmp (options_[i].key , k) == 0 ) {
66
- if (auto * val = std::get_if<T>(&options_[i].value )) {
67
- out = *val;
68
- return Error::Ok;
69
- }
70
- return Error::InvalidArgument;
71
- }
72
- }
73
- return Error::NotFound;
74
- }
75
- executorch::runtime::ArrayRef<BackendOption> view () const {
76
- return executorch::runtime::ArrayRef<BackendOption>(options_, size_);
77
- }
78
-
79
- private:
80
- BackendOption options_[MaxCapacity]{}; // Storage for backend options
81
- size_t size_; // Current number of options
82
- };
83
-
84
- // Helper functions for creating typed option keys (unchanged)
85
- constexpr OptionKey<bool > BoolKey (const char * k) {
86
- return OptionKey<bool >(k);
87
- }
88
-
89
- constexpr OptionKey<int > IntKey (const char * k) {
90
- return OptionKey<int >(k);
91
- }
92
-
93
- constexpr OptionKey<const char *> StrKey (const char * k) {
94
- return OptionKey<const char *>(k);
95
- }
96
-
97
- } // namespace runtime
98
- } // namespace executorch
99
-
9
+ #pragma once
10
+ #include < executorch/runtime/core/error.h>
11
+ #include < cstddef>
12
+ #include < cstring>
13
+ #include < variant>
14
+
15
+ namespace executorch {
16
+ namespace runtime {
17
+
18
+ // Strongly-typed option key template
19
+ template <typename T>
20
+ struct OptionKey {
21
+ const char * key;
22
+ constexpr explicit OptionKey (const char * k) : key(k) {}
23
+ };
24
+
25
+ // Union replaced with std::variant
26
+ using OptionValue = std::variant<bool , int , const char *>;
27
+
28
+ struct BackendOption {
29
+ const char * key; // key is the name of the backend option, like num_threads,
30
+ // enable_profiling, etc
31
+ OptionValue
32
+ value; // value is the value of the backend option, like 4, true, etc
33
+ };
34
+
35
+ template <size_t MaxCapacity>
36
+ class BackendOptions {
37
+ public:
38
+ // Initialize with zero options
39
+ BackendOptions () : size_(0 ) {}
40
+
41
+ // Type-safe setters
42
+ template <typename T>
43
+ void set_option (OptionKey<T> key, T value) {
44
+ const char * k = key.key ;
45
+ // Update existing if found
46
+ for (size_t i = 0 ; i < size_; ++i) {
47
+ if (strcmp (options_[i].key , k) == 0 ) {
48
+ options_[i].value = value;
49
+ return ;
50
+ }
51
+ }
52
+ // Add new option if space available
53
+ if (size_ < MaxCapacity) {
54
+ options_[size_++] = BackendOption{k, value};
55
+ }
56
+ }
57
+
58
+ // Type-safe getters
59
+ template <typename T>
60
+ Error get_option (OptionKey<T> key, T& out) const {
61
+ const char * k = key.key ;
62
+ for (size_t i = 0 ; i < size_; ++i) {
63
+ if (strcmp (options_[i].key , k) == 0 ) {
64
+ if (auto * val = std::get_if<T>(&options_[i].value )) {
65
+ out = *val;
66
+ return Error::Ok;
67
+ }
68
+ return Error::InvalidArgument;
69
+ }
70
+ }
71
+ return Error::NotFound;
72
+ }
73
+
74
+ private:
75
+ BackendOption options_[MaxCapacity]{}; // Storage for backend options
76
+ size_t size_; // Current number of options
77
+ };
78
+
79
+ // Helper functions for creating typed option keys (unchanged)
80
+ constexpr OptionKey<bool > BoolKey (const char * k) {
81
+ return OptionKey<bool >(k);
82
+ }
83
+
84
+ constexpr OptionKey<int > IntKey (const char * k) {
85
+ return OptionKey<int >(k);
86
+ }
87
+
88
+ constexpr OptionKey<const char *> StrKey (const char * k) {
89
+ return OptionKey<const char *>(k);
90
+ }
91
+
92
+ } // namespace runtime
93
+ } // namespace executorch
0 commit comments