// 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_TEMPLATE_UTIL_H_ #define MOJO_PUBLIC_CPP_BINDINGS_LIB_TEMPLATE_UTIL_H_ namespace mojo { namespace internal { template struct IntegralConstant { static const T value = v; }; template const T IntegralConstant::value; typedef IntegralConstant TrueType; typedef IntegralConstant FalseType; template struct IsConst : FalseType {}; template struct IsConst : TrueType {}; template struct EnableIf {}; template struct EnableIf { typedef T type; }; // Types YesType and NoType are guaranteed such that sizeof(YesType) < // sizeof(NoType). typedef char YesType; struct NoType { YesType dummy[2]; }; // A helper template to determine if given type is non-const move-only-type, // i.e. if a value of the given type should be passed via .Pass() in a // destructive way. template struct IsMoveOnlyType { template static YesType Test(const typename U::MoveOnlyTypeForCPP03*); template static NoType Test(...); static const bool value = sizeof(Test(0)) == sizeof(YesType) && !IsConst::value; }; template typename EnableIf::value, T>::type& Forward(T& t) { return t; } template typename EnableIf::value, T>::type Forward(T& t) { return t.Pass(); } // This goop is a trick used to implement a template that can be used to // determine if a given class is the base class of another given class. template struct IsSame { static bool const value = false; }; template struct IsSame { static bool const value = true; }; template 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::value; }; } // namespace internal } // namespace mojo #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_TEMPLATE_UTIL_H_