security/sandbox/chromium/base/template_util.h

Wed, 31 Dec 2014 07:16:47 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 07:16:47 +0100
branch
TOR_BUG_9701
changeset 3
141e0f1194b1
permissions
-rw-r--r--

Revert simplistic fix pending revisit of Mozilla integration attempt.

     1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
     2 // Use of this source code is governed by a BSD-style license that can be
     3 // found in the LICENSE file.
     5 #ifndef BASE_TEMPLATE_UTIL_H_
     6 #define BASE_TEMPLATE_UTIL_H_
     8 #include <cstddef>  // For size_t.
    10 #include "build/build_config.h"
    12 namespace base {
    14 // template definitions from tr1
    16 template<class T, T v>
    17 struct integral_constant {
    18   static const T value = v;
    19   typedef T value_type;
    20   typedef integral_constant<T, v> type;
    21 };
    23 template <class T, T v> const T integral_constant<T, v>::value;
    25 typedef integral_constant<bool, true> true_type;
    26 typedef integral_constant<bool, false> false_type;
    28 template <class T> struct is_pointer : false_type {};
    29 template <class T> struct is_pointer<T*> : true_type {};
    31 template <class T, class U> struct is_same : public false_type {};
    32 template <class T> struct is_same<T,T> : true_type {};
    34 template<class> struct is_array : public false_type {};
    35 template<class T, size_t n> struct is_array<T[n]> : public true_type {};
    36 template<class T> struct is_array<T[]> : public true_type {};
    38 template <class T> struct is_non_const_reference : false_type {};
    39 template <class T> struct is_non_const_reference<T&> : true_type {};
    40 template <class T> struct is_non_const_reference<const T&> : false_type {};
    42 template <class T> struct is_void : false_type {};
    43 template <> struct is_void<void> : true_type {};
    45 namespace internal {
    47 // Types YesType and NoType are guaranteed such that sizeof(YesType) <
    48 // sizeof(NoType).
    49 typedef char YesType;
    51 struct NoType {
    52   YesType dummy[2];
    53 };
    55 // This class is an implementation detail for is_convertible, and you
    56 // don't need to know how it works to use is_convertible. For those
    57 // who care: we declare two different functions, one whose argument is
    58 // of type To and one with a variadic argument list. We give them
    59 // return types of different size, so we can use sizeof to trick the
    60 // compiler into telling us which function it would have chosen if we
    61 // had called it with an argument of type From.  See Alexandrescu's
    62 // _Modern C++ Design_ for more details on this sort of trick.
    64 struct ConvertHelper {
    65   template <typename To>
    66   static YesType Test(To);
    68   template <typename To>
    69   static NoType Test(...);
    71   template <typename From>
    72   static From& Create();
    73 };
    75 // Used to determine if a type is a struct/union/class. Inspired by Boost's
    76 // is_class type_trait implementation.
    77 struct IsClassHelper {
    78   template <typename C>
    79   static YesType Test(void(C::*)(void));
    81   template <typename C>
    82   static NoType Test(...);
    83 };
    85 }  // namespace internal
    87 // Inherits from true_type if From is convertible to To, false_type otherwise.
    88 //
    89 // Note that if the type is convertible, this will be a true_type REGARDLESS
    90 // of whether or not the conversion would emit a warning.
    91 template <typename From, typename To>
    92 struct is_convertible
    93     : integral_constant<bool,
    94                         sizeof(internal::ConvertHelper::Test<To>(
    95                                    internal::ConvertHelper::Create<From>())) ==
    96                         sizeof(internal::YesType)> {
    97 };
    99 template <typename T>
   100 struct is_class
   101     : integral_constant<bool,
   102                         sizeof(internal::IsClassHelper::Test<T>(0)) ==
   103                             sizeof(internal::YesType)> {
   104 };
   106 }  // namespace base
   108 #endif  // BASE_TEMPLATE_UTIL_H_

mercurial