OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef PPAPI_CPP_OUTPUT_TRAITS_H_ | 5 #ifndef PPAPI_CPP_OUTPUT_TRAITS_H_ |
6 #define PPAPI_CPP_OUTPUT_TRAITS_H_ | 6 #define PPAPI_CPP_OUTPUT_TRAITS_H_ |
7 | 7 |
8 #include "ppapi/c/pp_resource.h" | 8 #include "ppapi/c/pp_resource.h" |
9 #include "ppapi/cpp/array_output.h" | 9 #include "ppapi/cpp/array_output.h" |
10 | 10 |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 // Array output parameters ----------------------------------------------------- | 142 // Array output parameters ----------------------------------------------------- |
143 | 143 |
144 // Output traits for vectors of all "plain old data" (POD) types. It is | 144 // Output traits for vectors of all "plain old data" (POD) types. It is |
145 // implemented to pass a pointer to the browser as an output parameter. | 145 // implemented to pass a pointer to the browser as an output parameter. |
146 // | 146 // |
147 // This is used as a base class for the general vector CallbackOutputTraits | 147 // This is used as a base class for the general vector CallbackOutputTraits |
148 // below in the case where T is not a resource. | 148 // below in the case where T is not a resource. |
149 template<typename T> | 149 template<typename T> |
150 struct GenericVectorCallbackOutputTraits { | 150 struct GenericVectorCallbackOutputTraits { |
151 // All arrays are output via a PP_ArrayOutput type. | 151 // All arrays are output via a PP_ArrayOutput type. |
152 typedef PP_ArrayOutput* APIArgType; | 152 typedef PP_ArrayOutput APIArgType; |
153 | 153 |
154 // We store the array as this adapter which combines the PP_ArrayOutput | 154 // We store the array as this adapter which combines the PP_ArrayOutput |
155 // structure with the underlying std::vector that it will write into. | 155 // structure with the underlying std::vector that it will write into. |
156 typedef ArrayOutputAdapterWithStorage<T> StorageType; | 156 typedef ArrayOutputAdapterWithStorage<T> StorageType; |
157 | 157 |
158 // Retrieves the PP_ArrayOutput interface for our vector object that the | 158 // Retrieves the PP_ArrayOutput interface for our vector object that the |
159 // browser will use to write into our code. | 159 // browser will use to write into our code. |
160 static inline APIArgType StorageToAPIArg(StorageType& t) { | 160 static inline APIArgType StorageToAPIArg(StorageType& t) { |
161 return t.pp_array_output(); | 161 return t.pp_array_output(); |
162 } | 162 } |
163 | 163 |
164 // Retrieves the underlying vector that can be passed to the plugin. | 164 // Retrieves the underlying vector that can be passed to the plugin. |
165 static inline std::vector<T>& StorageToPluginArg(StorageType& t) { | 165 static inline std::vector<T>& StorageToPluginArg(StorageType& t) { |
166 return t.output(); | 166 return t.output(); |
167 } | 167 } |
168 }; | 168 }; |
169 | 169 |
170 // Output traits for all vectors of resource types. It is implemented to pass | 170 // Output traits for all vectors of resource types. It is implemented to pass |
171 // a PP_Resource* as an output parameter to the browser, and convert to the | 171 // a PP_Resource* as an output parameter to the browser, and convert to the |
172 // given resource object type T when passing to the plugin. | 172 // given resource object type T when passing to the plugin. |
173 // | 173 // |
174 // Note that this class is parameterized by the resource object, for example | 174 // Note that this class is parameterized by the resource object, for example |
175 // ResourceVectorCallbackOutputTraits<pp::FileRef>. This is used as a base | 175 // ResourceVectorCallbackOutputTraits<pp::FileRef>. This is used as a base |
176 // class for CallbackOutputTraits below for the case where T is a derived | 176 // class for CallbackOutputTraits below for the case where T is a derived |
177 // class of pp::Resource. | 177 // class of pp::Resource. |
178 template<typename T> | 178 template<typename T> |
179 struct ResourceVectorCallbackOutputTraits { | 179 struct ResourceVectorCallbackOutputTraits { |
180 typedef PP_ArrayOutput* APIArgType; | 180 typedef PP_ArrayOutput APIArgType; |
181 typedef ResourceArrayOutputAdapterWithStorage<T> StorageType; | 181 typedef ResourceArrayOutputAdapterWithStorage<T> StorageType; |
182 | 182 |
183 static inline APIArgType StorageToAPIArg(StorageType& t) { | 183 static inline APIArgType StorageToAPIArg(StorageType& t) { |
184 return t.pp_array_output(); | 184 return t.pp_array_output(); |
185 } | 185 } |
186 static inline std::vector<T>& StorageToPluginArg(StorageType& t) { | 186 static inline std::vector<T>& StorageToPluginArg(StorageType& t) { |
187 return t.output(); | 187 return t.output(); |
188 } | 188 } |
189 }; | 189 }; |
190 | 190 |
191 // Specialization of CallbackOutputTraits for vectors. This struct covers both | 191 // Specialization of CallbackOutputTraits for vectors. This struct covers both |
192 // arrays of resources and arrays of POD (ints, structs, etc.) by inheriting | 192 // arrays of resources and arrays of POD (ints, structs, etc.) by inheriting |
193 // from the appropriate base class depending on whether the given type derives | 193 // from the appropriate base class depending on whether the given type derives |
194 // from pp::Resource. This trick allows us to do this once rather than writing | 194 // from pp::Resource. This trick allows us to do this once rather than writing |
195 // specilalizations for every resource object type. | 195 // specilalizations for every resource object type. |
196 template<typename T> | 196 template<typename T> |
197 struct CallbackOutputTraits< std::vector<T> > | 197 struct CallbackOutputTraits< std::vector<T> > |
198 : public InheritIf<GenericVectorCallbackOutputTraits<T>, | 198 : public InheritIf<GenericVectorCallbackOutputTraits<T>, |
199 !IsBaseOf<Resource, T>::value>, | 199 !IsBaseOf<Resource, T>::value>, |
200 public InheritIf<ResourceVectorCallbackOutputTraits<T>, | 200 public InheritIf<ResourceVectorCallbackOutputTraits<T>, |
201 IsBaseOf<Resource, T>::value> { | 201 IsBaseOf<Resource, T>::value> { |
202 }; | 202 }; |
203 | 203 |
204 // A specialization of CallbackOutputTraits to provide the callback system | 204 // A specialization of CallbackOutputTraits to provide the callback system |
205 // the information on how to handle vectors of pp::Var. Vectors of resources | 205 // the information on how to handle vectors of pp::Var. Vectors of resources |
206 // and plain data are handled separately. See the above definition for more. | 206 // and plain data are handled separately. See the above definition for more. |
207 template<> | 207 template<> |
208 struct CallbackOutputTraits< std::vector<pp::Var> > { | 208 struct CallbackOutputTraits< std::vector<pp::Var> > { |
209 // All arrays are output via a PP_ArrayOutput type. | 209 // All arrays are output via a PP_ArrayOutput type. |
210 typedef PP_ArrayOutput* APIArgType; | 210 typedef PP_ArrayOutput APIArgType; |
211 | 211 |
212 // We store the array as this adapter which combines the PP_ArrayOutput | 212 // We store the array as this adapter which combines the PP_ArrayOutput |
213 // structure with the underlying std::vector that it will write into. | 213 // structure with the underlying std::vector that it will write into. |
214 typedef VarArrayOutputAdapterWithStorage StorageType; | 214 typedef VarArrayOutputAdapterWithStorage StorageType; |
215 | 215 |
216 // Retrieves the PP_ArrayOutput interface for our vector object that the | 216 // Retrieves the PP_ArrayOutput interface for our vector object that the |
217 // browser will use to write into our code. | 217 // browser will use to write into our code. |
218 static inline APIArgType StorageToAPIArg(StorageType& t) { | 218 static inline APIArgType StorageToAPIArg(StorageType& t) { |
219 return t.pp_array_output(); | 219 return t.pp_array_output(); |
220 } | 220 } |
221 | 221 |
222 // Retrieves the underlying vector that can be passed to the plugin. | 222 // Retrieves the underlying vector that can be passed to the plugin. |
223 static inline std::vector<pp::Var>& StorageToPluginArg(StorageType& t) { | 223 static inline std::vector<pp::Var>& StorageToPluginArg(StorageType& t) { |
224 return t.output(); | 224 return t.output(); |
225 } | 225 } |
226 }; | 226 }; |
227 | 227 |
228 } // namespace internal | 228 } // namespace internal |
229 } // namespace pp | 229 } // namespace pp |
230 | 230 |
231 #endif // PPAPI_CPP_OUTPUT_TRAITS_H_ | 231 #endif // PPAPI_CPP_OUTPUT_TRAITS_H_ |
OLD | NEW |