⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 typetraits.h

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 H
字号:
 /* * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. * Copyright (C) 2009 Google Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB.  If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */#ifndef TypeTraits_h#define TypeTraits_h#include "Platform.h"namespace WTF {    // The following are provided in this file:    //    //   IsInteger<T>::value    //   IsPod<T>::value, see the definition for a note about its limitations    //   IsConvertibleToInteger<T>::value    //    //   IsSameType<T, U>::value    //    //   RemovePointer<T>::Type    //   RemoveConst<T>::Type    //   RemoveVolatile<T>::Type    //   RemoveConstVolatile<T>::Type    //    //   COMPILE_ASSERT's in TypeTraits.cpp illustrate their usage and what they do.    template<typename T> struct IsInteger           { static const bool value = false; };    template<> struct IsInteger<bool>               { static const bool value = true; };    template<> struct IsInteger<char>               { static const bool value = true; };    template<> struct IsInteger<signed char>        { static const bool value = true; };    template<> struct IsInteger<unsigned char>      { static const bool value = true; };    template<> struct IsInteger<short>              { static const bool value = true; };    template<> struct IsInteger<unsigned short>     { static const bool value = true; };    template<> struct IsInteger<int>                { static const bool value = true; };    template<> struct IsInteger<unsigned int>       { static const bool value = true; };    template<> struct IsInteger<long>               { static const bool value = true; };    template<> struct IsInteger<unsigned long>      { static const bool value = true; };    template<> struct IsInteger<long long>          { static const bool value = true; };    template<> struct IsInteger<unsigned long long> { static const bool value = true; };#if !COMPILER(MSVC) || defined(_NATIVE_WCHAR_T_DEFINED)    template<> struct IsInteger<wchar_t>            { static const bool value = true; };#endif    // IsPod is misnamed as it doesn't cover all plain old data (pod) types.    // Specifically, it doesn't allow for enums or for structs.    template <typename T> struct IsPod           { static const bool value = IsInteger<T>::value; };    template <> struct IsPod<float>              { static const bool value = true; };    template <> struct IsPod<double>             { static const bool value = true; };    template <> struct IsPod<long double>        { static const bool value = true; };    template <typename P> struct IsPod<P*>       { static const bool value = true; };    template<typename T> class IsConvertibleToInteger {        // Avoid "possible loss of data" warning when using Microsoft's C++ compiler        // by not converting int's to doubles.        template<bool performCheck, typename U> class IsConvertibleToDouble;        template<typename U> class IsConvertibleToDouble<false, U> {        public:            static const bool value = false;        };        template<typename U> class IsConvertibleToDouble<true, U> {            typedef char YesType;            struct NoType {                char padding[8];            };            static YesType floatCheck(long double);            static NoType floatCheck(...);            static T& t;        public:            static const bool value = sizeof(floatCheck(t)) == sizeof(YesType);        };    public:        static const bool value = IsInteger<T>::value || IsConvertibleToDouble<!IsInteger<T>::value, T>::value;    };    template <typename T, typename U> struct IsSameType {        static const bool value = false;    };    template <typename T> struct IsSameType<T, T> {        static const bool value = true;    };    template <typename T> struct RemoveConst {        typedef T Type;    };    template <typename T> struct RemoveConst<const T> {        typedef T Type;    };    template <typename T> struct RemoveVolatile {        typedef T Type;    };    template <typename T> struct RemoveVolatile<volatile T> {        typedef T Type;    };    template <typename T> struct RemoveConstVolatile {        typedef typename RemoveVolatile<typename RemoveConst<T>::Type>::Type Type;    };    template <typename T> struct RemovePointer {        typedef T Type;    };    template <typename T> struct RemovePointer<T*> {        typedef T Type;    };} // namespace WTF#endif // TypeTraits_h

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -