#ifndef PPAPI_CPP_EXTENSIONS_TO_VAR_CONVERTOR_H_
#define PPAPI_CPP_EXTENSIONS_TO_VAR_CONVERTOR_H_
#include <string>
#include "ppapi/c/pp_var.h"
#include "ppapi/cpp/extensions/optional.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 {
class ToVarConverterBase {
 public:
  PP_Var pp_var() const {
    return var_.pp_var();
  }
  const Var& var() const {
    return var_;
  }
 protected:
  ToVarConverterBase() {
  }
  explicit ToVarConverterBase(const PP_Var& var) : var_(var) {
  }
  explicit ToVarConverterBase(const Var& var): var_(var) {
  }
  ~ToVarConverterBase() {
  }
  Var var_;
};
template <class T>
class ToVarConverter : public ToVarConverterBase {
 public:
  explicit ToVarConverter(const T& object)
      : ToVarConverterBase(object.CreateVar()) {
  }
  ~ToVarConverter() {
  }
};
template <class T>
class ToVarConverter<Optional<T> > : public ToVarConverterBase {
 public:
  explicit ToVarConverter(const Optional<T>& object)
      : ToVarConverterBase(
          object.IsSet() ? ToVarConverter<T>(*object).pp_var() :
                           PP_MakeUndefined()) {
  }
  ~ToVarConverter() {
  }
};
template <>
class ToVarConverter<bool> : public ToVarConverterBase {
 public:
  explicit ToVarConverter(bool object) : ToVarConverterBase(Var(object)) {
  }
  ~ToVarConverter() {
  }
};
template <>
class ToVarConverter<int32_t> : public ToVarConverterBase {
 public:
  explicit ToVarConverter(int32_t object) : ToVarConverterBase(Var(object)) {
  }
  ~ToVarConverter() {
  }
};
template <>
class ToVarConverter<double> : public ToVarConverterBase {
 public:
  explicit ToVarConverter(double object) : ToVarConverterBase(Var(object)) {
  }
  ~ToVarConverter() {
  }
};
template <>
class ToVarConverter<std::string> : public ToVarConverterBase {
 public:
  explicit ToVarConverter(const std::string& object)
      : ToVarConverterBase(Var(object)) {
  }
  ~ToVarConverter() {
  }
};
template <>
class ToVarConverter<Var> : public ToVarConverterBase {
 public:
  explicit ToVarConverter(const Var& object) : ToVarConverterBase(object) {
  }
  ~ToVarConverter() {
  }
};
template <>
class ToVarConverter<VarArray> : public ToVarConverterBase {
 public:
  explicit ToVarConverter(const Var& object) : ToVarConverterBase(object) {
  }
  ~ToVarConverter() {
  }
};
template <>
class ToVarConverter<VarDictionary> : public ToVarConverterBase {
 public:
  explicit ToVarConverter(const Var& object) : ToVarConverterBase(object) {
  }
  ~ToVarConverter() {
  }
};
template <>
class ToVarConverter<VarArrayBuffer> : public ToVarConverterBase {
 public:
  explicit ToVarConverter(const Var& object) : ToVarConverterBase(object) {
  }
  ~ToVarConverter() {
  }
};
}  
}  
}  
#endif