OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #ifndef WEBRTC_COMMON_H_ | 11 #ifndef WEBRTC_COMMON_H_ |
12 #define WEBRTC_COMMON_H_ | 12 #define WEBRTC_COMMON_H_ |
13 | 13 |
14 #include <map> | 14 #include <map> |
15 | 15 |
16 #include "webrtc/base/basictypes.h" | 16 #include "webrtc/base/basictypes.h" |
17 | 17 |
18 namespace webrtc { | 18 namespace webrtc { |
19 | 19 |
| 20 // Only add new values to the end of the enumeration and never remove (only |
| 21 // deprecate) to maintain binary compatibility. |
| 22 enum class ConfigOptionID { |
| 23 kMyExperimentForTest, |
| 24 kAlgo1CostFunctionForTest, |
| 25 kTemporalLayersFactory, |
| 26 kNetEqCapacityConfig, |
| 27 kNetEqFastAccelerate, |
| 28 kVoicePacing, |
| 29 kExtendedFilter, |
| 30 kDelayAgnostic, |
| 31 kExperimentalAgc, |
| 32 kExperimentalNs, |
| 33 kBeamforming, |
| 34 kIntelligibility |
| 35 }; |
| 36 |
20 // Class Config is designed to ease passing a set of options across webrtc code. | 37 // Class Config is designed to ease passing a set of options across webrtc code. |
21 // Options are identified by typename in order to avoid incorrect casts. | 38 // Options are identified by typename in order to avoid incorrect casts. |
22 // | 39 // |
23 // Usage: | 40 // Usage: |
24 // * declaring an option: | 41 // * declaring an option: |
25 // struct Algo1_CostFunction { | 42 // struct Algo1_CostFunction { |
26 // virtual float cost(int x) const { return x; } | 43 // virtual float cost(int x) const { return x; } |
27 // virtual ~Algo1_CostFunction() {} | 44 // virtual ~Algo1_CostFunction() {} |
28 // }; | 45 // }; |
29 // | 46 // |
(...skipping 24 matching lines...) Expand all Loading... |
54 ~Config() { | 71 ~Config() { |
55 // Note: this method is inline so webrtc public API depends only | 72 // Note: this method is inline so webrtc public API depends only |
56 // on the headers. | 73 // on the headers. |
57 for (OptionMap::iterator it = options_.begin(); | 74 for (OptionMap::iterator it = options_.begin(); |
58 it != options_.end(); ++it) { | 75 it != options_.end(); ++it) { |
59 delete it->second; | 76 delete it->second; |
60 } | 77 } |
61 } | 78 } |
62 | 79 |
63 private: | 80 private: |
64 typedef void* OptionIdentifier; | |
65 | |
66 struct BaseOption { | 81 struct BaseOption { |
67 virtual ~BaseOption() {} | 82 virtual ~BaseOption() {} |
68 }; | 83 }; |
69 | 84 |
70 template<typename T> | 85 template<typename T> |
71 struct Option : BaseOption { | 86 struct Option : BaseOption { |
72 explicit Option(T* v): value(v) {} | 87 explicit Option(T* v): value(v) {} |
73 ~Option() { | 88 ~Option() { |
74 delete value; | 89 delete value; |
75 } | 90 } |
76 T* value; | 91 T* value; |
77 }; | 92 }; |
78 | 93 |
79 // Own implementation of rtti-subset to avoid depending on rtti and its costs. | |
80 template<typename T> | 94 template<typename T> |
81 static OptionIdentifier identifier() { | 95 static ConfigOptionID identifier() { |
82 static char id_placeholder; | 96 return T::identifier; |
83 return &id_placeholder; | |
84 } | 97 } |
85 | 98 |
86 // Used to instantiate a default constructed object that doesn't needs to be | 99 // Used to instantiate a default constructed object that doesn't needs to be |
87 // owned. This allows Get<T> to be implemented without requiring explicitly | 100 // owned. This allows Get<T> to be implemented without requiring explicitly |
88 // locks. | 101 // locks. |
89 template<typename T> | 102 template<typename T> |
90 static const T& default_value() { | 103 static const T& default_value() { |
91 RTC_DEFINE_STATIC_LOCAL(const T, def, ()); | 104 RTC_DEFINE_STATIC_LOCAL(const T, def, ()); |
92 return def; | 105 return def; |
93 } | 106 } |
94 | 107 |
95 typedef std::map<OptionIdentifier, BaseOption*> OptionMap; | 108 typedef std::map<ConfigOptionID, BaseOption*> OptionMap; |
96 OptionMap options_; | 109 OptionMap options_; |
97 | 110 |
98 // RTC_DISALLOW_COPY_AND_ASSIGN | 111 // RTC_DISALLOW_COPY_AND_ASSIGN |
99 Config(const Config&); | 112 Config(const Config&); |
100 void operator=(const Config&); | 113 void operator=(const Config&); |
101 }; | 114 }; |
102 | 115 |
103 template<typename T> | 116 template<typename T> |
104 const T& Config::Get() const { | 117 const T& Config::Get() const { |
105 OptionMap::const_iterator it = options_.find(identifier<T>()); | 118 OptionMap::const_iterator it = options_.find(identifier<T>()); |
106 if (it != options_.end()) { | 119 if (it != options_.end()) { |
107 const T* t = static_cast<Option<T>*>(it->second)->value; | 120 const T* t = static_cast<Option<T>*>(it->second)->value; |
108 if (t) { | 121 if (t) { |
109 return *t; | 122 return *t; |
110 } | 123 } |
111 } | 124 } |
112 return default_value<T>(); | 125 return default_value<T>(); |
113 } | 126 } |
114 | 127 |
115 template<typename T> | 128 template<typename T> |
116 void Config::Set(T* value) { | 129 void Config::Set(T* value) { |
117 BaseOption*& it = options_[identifier<T>()]; | 130 BaseOption*& it = options_[identifier<T>()]; |
118 delete it; | 131 delete it; |
119 it = new Option<T>(value); | 132 it = new Option<T>(value); |
120 } | 133 } |
121 | 134 |
122 } // namespace webrtc | 135 } // namespace webrtc |
123 | 136 |
124 #endif // WEBRTC_COMMON_H_ | 137 #endif // WEBRTC_COMMON_H_ |
OLD | NEW |