diff options
Diffstat (limited to 'mojo/public/cpp/bindings/lib/callback_internal.h')
-rw-r--r-- | mojo/public/cpp/bindings/lib/callback_internal.h | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/mojo/public/cpp/bindings/lib/callback_internal.h b/mojo/public/cpp/bindings/lib/callback_internal.h new file mode 100644 index 0000000..9df5b40a7 --- /dev/null +++ b/mojo/public/cpp/bindings/lib/callback_internal.h @@ -0,0 +1,53 @@ +// Copyright 2014 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 MOJO_PUBLIC_CPP_BINDINGS_LIB_CALLBACK_INTERNAL_H_ +#define MOJO_PUBLIC_CPP_BINDINGS_LIB_CALLBACK_INTERNAL_H_ + +#include "mojo/public/cpp/bindings/lib/template_util.h" + +namespace mojo { +class String; + +namespace internal { + +template <typename T> +struct Callback_ParamTraits { + typedef T ForwardType; +}; + +template <> +struct Callback_ParamTraits<String> { + typedef const String& ForwardType; +}; + +template <typename T, typename... Args> +struct HasCompatibleCallOperator { + // This template's second parameter is the signature of the operator() + // overload we want to try to detect: + // void operator()(Args...) const; + template <typename U, + void (U::*)( + typename internal::Callback_ParamTraits<Args>::ForwardType...) + const> + struct TestType {}; + + // This matches type U if it has a call operator with the + // expected signature. + template <typename U> + static YesType Test(TestType<U, &U::operator()>*); + + // This matches anything else. + template <typename U> + static NoType Test(...); + + // HasCompatibleCallOperator<T, Args...>::value will be true if T has a + // compatible call operator. + enum { value = (sizeof(Test<T>(nullptr)) == sizeof(YesType)) }; +}; + +} // namespace internal +} // namespace mojo + +#endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_CALLBACK_INTERNAL_H_ |