| Index: talk/session/media/typewrapping.h.pump
|
| diff --git a/talk/session/media/typewrapping.h.pump b/talk/session/media/typewrapping.h.pump
|
| deleted file mode 100644
|
| index 2cbb20f1d0d9903193311ceb693abfdbd174c10d..0000000000000000000000000000000000000000
|
| --- a/talk/session/media/typewrapping.h.pump
|
| +++ /dev/null
|
| @@ -1,297 +0,0 @@
|
| -// To generate typewrapping.h from typewrapping.h.pump, execute:
|
| -// /home/build/google3/third_party/gtest/scripts/pump.py typewrapping.h.pump
|
| -
|
| -// Copyright 2009 Google Inc.
|
| -// Author: tschmelcher@google.com (Tristan Schmelcher)
|
| -//
|
| -// A template meta-programming framework for customizable rule-based
|
| -// type-checking of type wrappers and wrapper functions.
|
| -//
|
| -// This framework is useful in a scenario where there are a set of types that
|
| -// you choose to "wrap" by implementing new preferred types such that the new
|
| -// and the old can be converted back and forth in some way, but you already have
|
| -// a library of functions that expect the original types. Example:
|
| -//
|
| -// Type A wraps X
|
| -// Type B wraps Y
|
| -// Type C wraps Z
|
| -//
|
| -// And function X Foo(Y, Z) exists.
|
| -//
|
| -// Since A, B, and C are preferred, you choose to implement a wrapper function
|
| -// with this interface:
|
| -//
|
| -// A Foo2(B, C)
|
| -//
|
| -// However, this can lead to subtle discrepancies, because if the interface to
|
| -// Foo ever changes then Foo2 may become out-of-sync. e.g., Foo might have
|
| -// originally returned void, but later is changed to return an error code. If
|
| -// the programmer forgets to change Foo2, the code will probably still work, but
|
| -// with an implicit cast to void inserted by the compiler, potentially leading
|
| -// to run-time errors or errors in usage.
|
| -//
|
| -// The purpose of this library is to prevent these discrepancies from occurring.
|
| -// You use it as follows:
|
| -//
|
| -// First, declare a new wrapping ruleset:
|
| -//
|
| -// DECLARE_WRAPPING_RULESET(ruleset_name)
|
| -//
|
| -// Then declare rules on what types wrap which other types and how to convert
|
| -// them:
|
| -//
|
| -// DECLARE_WRAPPER(ruleset_name, A, X, variable_name, wrapping_code,
|
| -// unwrapping_code)
|
| -//
|
| -// Where wrapping_code and unwrapping_code are expressions giving the code to
|
| -// use to wrap and unwrap a variable with the name "variable_name". There are
|
| -// also some helper macros to declare common wrapping schemes.
|
| -//
|
| -// Then implement your wrapped functions like this:
|
| -//
|
| -// A Foo_Wrapped(B b, C c) {
|
| -// return WRAP_CALL2(ruleset_name, A, Foo, B, b, C, c);
|
| -// }
|
| -//
|
| -// WRAP_CALL2 will unwrap b and c (if B and C are wrapped types) and call Foo,
|
| -// then wrap the result to type A if different from the return type. More
|
| -// importantly, if the types in Foo's interface do not _exactly_ match the
|
| -// unwrapped forms of A, B, and C (after typedef-equivalence), then you will get
|
| -// a compile-time error for a static_cast from the real function type to the
|
| -// expected one (except on Mac where this check is infeasible), and with no icky
|
| -// template instantiation errors either!
|
| -//
|
| -// There are also macros to wrap/unwrap individual values according to whichever
|
| -// rule applies to their types:
|
| -//
|
| -// WRAP(ruleset_name, A, X, value) // Compile-time error if no associated rule.
|
| -//
|
| -// UNWRAP(ruleset_name, A, value) // Infers X. If A is not a wrapper, no change.
|
| -//
|
| -// UNWRAP_TYPE(ruleset_name, A) // Evaluates to X.
|
| -//
|
| -//
|
| -// Essentially, the library works by "storing" the DECLARE_WRAPPER calls in
|
| -// template specializations. When the wrapper or unwrapper is invoked, the
|
| -// normal C++ template system essentially "looks up" the rule for the given
|
| -// type(s).
|
| -//
|
| -// All of the auto-generated code can be inlined to produce zero impact on
|
| -// run-time performance and code size (though some compilers may require
|
| -// gentle encouragement in order for them to do so).
|
| -
|
| -#ifndef TALK_SESSION_PHONE_TYPEWRAPPING_H_
|
| -#define TALK_SESSION_PHONE_TYPEWRAPPING_H_
|
| -
|
| -#include "webrtc/base/common.h"
|
| -
|
| -#ifdef OSX
|
| -// XCode's GCC doesn't respect typedef-equivalence when casting function pointer
|
| -// types, so we can't enforce that the wrapped function signatures strictly
|
| -// match the expected types. Instead we have to forego the nice user-friendly
|
| -// static_cast check (because it will spuriously fail) and make the Call()
|
| -// function into a member template below.
|
| -#define CAST_FUNCTION_(function, ...) \
|
| - function
|
| -#else
|
| -#define CAST_FUNCTION_(function, ...) \
|
| - static_cast<__VA_ARGS__>(function)
|
| -#endif
|
| -
|
| -// Internal helper macros.
|
| -#define SMART_WRAPPER_(wrapper, toType, fromType, from) \
|
| - (wrapper<toType, fromType>::Wrap(from))
|
| -
|
| -#define SMART_UNWRAPPER_(unwrapper, fromType, from) \
|
| - (unwrapper<fromType>::Unwrap(from))
|
| -
|
| -#define SMART_UNWRAPPER_TYPE_(unwrapper, fromType) \
|
| - typename unwrapper<fromType>::ToType
|
| -
|
| -$var n = 27
|
| -$range i 0..n
|
| -
|
| -$for i [[
|
| -$range j 1..i
|
| -
|
| -// The code that follows wraps calls to $i-argument functions, unwrapping the
|
| -// arguments and wrapping the return value as needed.
|
| -
|
| -// The usual case.
|
| -template<
|
| - template <typename ToType, typename FromType> class Wrapper,
|
| - template <typename FromType> class Unwrapper,
|
| - typename ReturnType$for j [[,
|
| - typename ArgType$j]]>
|
| -class SmartFunctionWrapper$i {
|
| - public:
|
| - typedef SMART_UNWRAPPER_TYPE_(Unwrapper, ReturnType) OriginalReturnType;
|
| -
|
| -$for j [[
|
| - typedef SMART_UNWRAPPER_TYPE_(Unwrapper, ArgType$j) OriginalArgType$j;
|
| -
|
| -]]
|
| - typedef OriginalReturnType (*OriginalFunctionType)($for j , [[
|
| -
|
| - OriginalArgType$j]]);
|
| -
|
| -#ifdef OSX
|
| - template <typename F>
|
| - static FORCE_INLINE ReturnType Call(F function
|
| -#else
|
| - static FORCE_INLINE ReturnType Call(OriginalFunctionType function
|
| -#endif
|
| - $for j [[,
|
| - ArgType$j v$j]]) {
|
| - return SMART_WRAPPER_(Wrapper, ReturnType, OriginalReturnType,
|
| - (*function)($for j , [[
|
| -
|
| - SMART_UNWRAPPER_(Unwrapper, ArgType$j, v$j)]]));
|
| - }
|
| -};
|
| -
|
| -// Special case for functions that return void. (SMART_WRAPPER_ involves
|
| -// passing the unwrapped value in a function call, which is not a legal thing to
|
| -// do with void, so we need a special case here that doesn't call
|
| -// SMART_WRAPPER_()).
|
| -template<
|
| - template <typename ToType, typename FromType> class Wrapper,
|
| - template <typename FromType> class Unwrapper$for j [[,
|
| - typename ArgType$j]]>
|
| -class SmartFunctionWrapper$i<
|
| - Wrapper,
|
| - Unwrapper,
|
| - void$for j [[,
|
| - ArgType$j]]> {
|
| - public:
|
| - typedef void OriginalReturnType;
|
| -
|
| -$for j [[
|
| - typedef SMART_UNWRAPPER_TYPE_(Unwrapper, ArgType$j) OriginalArgType$j;
|
| -
|
| -]]
|
| - typedef OriginalReturnType (*OriginalFunctionType)($for j , [[
|
| -
|
| - OriginalArgType$j]]);
|
| -
|
| -#ifdef OSX
|
| - template <typename F>
|
| - static FORCE_INLINE void Call(F function
|
| -#else
|
| - static FORCE_INLINE void Call(OriginalFunctionType function
|
| -#endif
|
| - $for j [[,
|
| - ArgType$j v$j]]) {
|
| - (*function)($for j , [[
|
| -
|
| - SMART_UNWRAPPER_(Unwrapper, ArgType$j, v$j)]]);
|
| - }
|
| -};
|
| -
|
| -
|
| -]]
|
| -// Programmer interface follows. Only macros below here should be used outside
|
| -// this file.
|
| -
|
| -#define DECLARE_WRAPPING_RULESET(ruleSet) \
|
| - namespace ruleSet { \
|
| -\
|
| - /* SmartWrapper is for wrapping values. */ \
|
| - template<typename ToType, typename FromType> \
|
| - class SmartWrapper; \
|
| -\
|
| - /* Special case where the types are the same. */ \
|
| - template<typename T1> \
|
| - class SmartWrapper<T1, T1> { \
|
| - public: \
|
| - static FORCE_INLINE T1 Wrap(T1 from) { \
|
| - return from; \
|
| - } \
|
| - }; \
|
| -\
|
| - /* Class for unwrapping (i.e., going to the original value). This is done
|
| - function-style rather than predicate-style. The default rule is to leave
|
| - the type unchanged. */ \
|
| - template<typename FromType> \
|
| - class SmartUnwrapper { \
|
| - public: \
|
| - typedef FromType ToType; \
|
| - static FORCE_INLINE ToType Unwrap(FromType from) { \
|
| - return from; \
|
| - } \
|
| - }; \
|
| -\
|
| - }
|
| -
|
| -// Declares a wrapping rule.
|
| -#define DECLARE_WRAPPER(ruleSet, wrappedType, unwrappedType, var, wrapCode, unwrapCode) \
|
| - namespace ruleSet { \
|
| -\
|
| - template<> \
|
| - class SmartWrapper<wrappedType, unwrappedType> { \
|
| - public: \
|
| - static FORCE_INLINE wrappedType Wrap(unwrappedType var) { \
|
| - return wrapCode; \
|
| - } \
|
| - }; \
|
| -\
|
| - template<> \
|
| - class SmartUnwrapper<wrappedType> { \
|
| - public: \
|
| - typedef unwrappedType ToType; \
|
| - static FORCE_INLINE unwrappedType Unwrap(wrappedType var) { \
|
| - return unwrapCode; \
|
| - } \
|
| - }; \
|
| -\
|
| - }
|
| -
|
| -// Helper macro for declaring a wrapper that wraps/unwraps with reinterpret_cast<>.
|
| -#define DECLARE_WRAPPER_BY_REINTERPRET_CAST(ruleSet, wrappedType, unwrappedType) \
|
| - DECLARE_WRAPPER(ruleSet, wrappedType, unwrappedType, FROM, reinterpret_cast<wrappedType>(FROM), reinterpret_cast<unwrappedType>(FROM))
|
| -
|
| -// Helper macro for declaring a wrapper that wraps/unwraps implicitly.
|
| -#define DECLARE_WRAPPER_BY_IMPLICIT_CAST(ruleSet, wrappedType, unwrappedType) \
|
| - DECLARE_WRAPPER(ruleSet, wrappedType, unwrappedType, FROM, FROM, FROM)
|
| -
|
| -// Helper macro for declaring that the pointer types for one type wrap the pointer types for another type.
|
| -#define DECLARE_POINTER_WRAPPER(ruleSet, wrappedType, unwrappedType) \
|
| - DECLARE_WRAPPER_BY_REINTERPRET_CAST(ruleSet, wrappedType*, unwrappedType*) \
|
| - DECLARE_WRAPPER_BY_REINTERPRET_CAST(ruleSet, const wrappedType*, const unwrappedType*) \
|
| - DECLARE_WRAPPER_BY_REINTERPRET_CAST(ruleSet, wrappedType* const, unwrappedType* const) \
|
| - DECLARE_WRAPPER_BY_REINTERPRET_CAST(ruleSet, const wrappedType* const, const unwrappedType* const) \
|
| -
|
| -// Macro to wrap a single value.
|
| -#define WRAP(ruleSet, toType, fromType, from) \
|
| - SMART_WRAPPER_(ruleSet::SmartWrapper, toType, fromType, from)
|
| -
|
| -// Macro to unwrap a single value.
|
| -#define UNWRAP(ruleSet, fromType, from) \
|
| - SMART_UNWRAPPER_(ruleSet::SmartUnwrapper, fromType, from)
|
| -
|
| -// Macro to get the unwrapped form of a type.
|
| -#define UNWRAP_TYPE(ruleSet, fromType) \
|
| - SMART_UNWRAPPER_TYPE_(ruleSet::SmartUnwrapper, from)
|
| -
|
| -// Macros to wrap function calls.
|
| -
|
| -$for i [[
|
| -$range j 1..i
|
| -#define WRAP_CALL$i(ruleSet, toType, function$for j [[, argType$j, arg$j]]) \
|
| - (SmartFunctionWrapper$i< \
|
| - ruleSet::SmartWrapper, \
|
| - ruleSet::SmartUnwrapper, \
|
| - toType$for j [[, \
|
| - argType$j]]>::Call( \
|
| - CAST_FUNCTION_( \
|
| - &function, \
|
| - SmartFunctionWrapper$i< \
|
| - ruleSet::SmartWrapper, \
|
| - ruleSet::SmartUnwrapper, \
|
| - toType$for j [[, \
|
| - argType$j]]>::OriginalFunctionType)$for j [[, \
|
| - arg$j]]))
|
| -
|
| -]]
|
| -
|
| -#endif // TALK_SESSION_PHONE_TYPEWRAPPINGHELPERS_H_
|
|
|