// Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef PPAPI_CPP_EXTENSIONS_FROM_VAR_CONVERTOR_H_ #define PPAPI_CPP_EXTENSIONS_FROM_VAR_CONVERTOR_H_ #include #include "ppapi/c/pp_var.h" #include "ppapi/cpp/extensions/optional.h" #include "ppapi/cpp/logging.h" #include "ppapi/cpp/var.h" #include "ppapi/cpp/var_array.h" #include "ppapi/cpp/var_array_buffer.h" #include "ppapi/cpp/var_dictionary.h" namespace pp { namespace ext { namespace internal { template class FromVarConverterBase { public: T& value() { return value_; } protected: FromVarConverterBase() : value_() { } explicit FromVarConverterBase(const T& value) : value_(value) { } ~FromVarConverterBase() { } T value_; }; template class FromVarConverter : public FromVarConverterBase { public: FromVarConverter() { } explicit FromVarConverter(const PP_Var& var) { Set(var); } ~FromVarConverter() { } void Set(const PP_Var& var) { bool succeeded = FromVarConverterBase::value_.Populate(var); // Suppress unused variable warnings. static_cast(succeeded); PP_DCHECK(succeeded); } }; template class FromVarConverter > : public FromVarConverterBase > { public: FromVarConverter() { } explicit FromVarConverter(const PP_Var& var) { Set(var); } ~FromVarConverter() { } void Set(const PP_Var& var) { if (var.type == PP_VARTYPE_UNDEFINED) { FromVarConverterBase >::value_.Reset(); } else { FromVarConverter converter(var); FromVarConverterBase >::value_ = converter.value(); } } }; template <> class FromVarConverter : public FromVarConverterBase { public: FromVarConverter() { } explicit FromVarConverter(const PP_Var& var) { Set(var); } ~FromVarConverter() { } void Set(const PP_Var& var) { FromVarConverterBase::value_ = Var(var).AsBool(); } }; template <> class FromVarConverter : public FromVarConverterBase { public: FromVarConverter() { } explicit FromVarConverter(const PP_Var& var) { Set(var); } ~FromVarConverter() { } void Set(const PP_Var& var) { FromVarConverterBase::value_ = Var(var).AsInt(); } }; template <> class FromVarConverter : public FromVarConverterBase { public: FromVarConverter() { } explicit FromVarConverter(const PP_Var& var) { Set(var); } ~FromVarConverter() { } void Set(const PP_Var& var) { FromVarConverterBase::value_ = Var(var).AsDouble(); } }; template <> class FromVarConverter : public FromVarConverterBase { public: FromVarConverter() { } explicit FromVarConverter(const PP_Var& var) { Set(var); } ~FromVarConverter() { } void Set(const PP_Var& var) { FromVarConverterBase::value_ = Var(var).AsString(); } }; template <> class FromVarConverter : public FromVarConverterBase { public: FromVarConverter() { } explicit FromVarConverter(const PP_Var& var) { Set(var); } ~FromVarConverter() { } void Set(const PP_Var& var) { FromVarConverterBase::value_ = Var(var); } }; template <> class FromVarConverter : public FromVarConverterBase { public: FromVarConverter() { } explicit FromVarConverter(const PP_Var& var) { Set(var); } ~FromVarConverter() { } void Set(const PP_Var& var) { FromVarConverterBase::value_ = Var(var); } }; template <> class FromVarConverter : public FromVarConverterBase { public: FromVarConverter() { } explicit FromVarConverter(const PP_Var& var) { Set(var); } ~FromVarConverter() { } void Set(const PP_Var& var) { FromVarConverterBase::value_ = Var(var); } }; template <> class FromVarConverter : public FromVarConverterBase { public: FromVarConverter() { } explicit FromVarConverter(const PP_Var& var) { Set(var); } ~FromVarConverter() { } void Set(const PP_Var& var) { FromVarConverterBase::value_ = Var(var); } }; } // namespace internal } // namespace ext } // namespace pp #endif // PPAPI_CPP_EXTENSIONS_FROM_VAR_CONVERTOR_H_