summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ppapi/cpp/dev/audio_input_dev.h5
-rw-r--r--ppapi/cpp/output_traits.h8
2 files changed, 8 insertions, 5 deletions
diff --git a/ppapi/cpp/dev/audio_input_dev.h b/ppapi/cpp/dev/audio_input_dev.h
index 2b2b6bb..1c80f4d 100644
--- a/ppapi/cpp/dev/audio_input_dev.h
+++ b/ppapi/cpp/dev/audio_input_dev.h
@@ -59,11 +59,6 @@ class AudioInput_Dev : public Resource {
/// struct.
const AudioConfig& config() const { return config_; }
- // TODO(yzshen, brettw): If we forward declare DeviceRef_Dev (as opposed to
- // including its .h file), it still compiles. However, it is not recognized as
- // a derived class of Resource and does the wrong thing!
- // This is due to the limitation of IsBaseOf in ppapi/cpp/output_traits.h. We
- // need to figure out a way to overcome this problem.
int32_t EnumerateDevices(
const CompletionCallbackWithOutput<std::vector<DeviceRef_Dev> >&
callback);
diff --git a/ppapi/cpp/output_traits.h b/ppapi/cpp/output_traits.h
index 963f296..5b45aa47e 100644
--- a/ppapi/cpp/output_traits.h
+++ b/ppapi/cpp/output_traits.h
@@ -35,9 +35,17 @@ template<typename A> struct IsSame<A, A> {
static bool const value = true;
};
template<typename Base, typename Derived> struct IsBaseOf {
+ private:
+ // This class doesn't work correctly with forward declarations.
+ // Because sizeof cannot be applied to incomplete types, this line prevents us
+ // from passing in forward declarations.
+ typedef char (*EnsureTypesAreComplete)[sizeof(Base) + sizeof(Derived)];
+
static Derived* CreateDerived();
static char (&Check(Base*))[1];
static char (&Check(...))[2];
+
+ public:
static bool const value = sizeof Check(CreateDerived()) == 1 &&
!IsSame<Base const, void const>::value;
};