1a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Copyright (c) 2006, Google Inc. 2a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// All rights reserved. 3a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// 4a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Redistribution and use in source and binary forms, with or without 5a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// modification, are permitted provided that the following conditions are 6a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// met: 7a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// 8a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// * Redistributions of source code must retain the above copyright 9a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// notice, this list of conditions and the following disclaimer. 10a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// * Redistributions in binary form must reproduce the above 11a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// copyright notice, this list of conditions and the following disclaimer 12a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// in the documentation and/or other materials provided with the 13a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// distribution. 14a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// * Neither the name of Google Inc. nor the names of its 15a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// contributors may be used to endorse or promote products derived from 16a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// this software without specific prior written permission. 17a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// 18a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 30a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// ---- 31a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Author: Matt Austern 32a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 33a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/stubs/type_traits.h> 34a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 35a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <stdlib.h> // for exit() 36a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <stdio.h> 37a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <string> 38a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <vector> 39a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 40a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/testing/googletest.h> 41a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <gtest/gtest.h> 42a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 43a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsontypedef int int32; 44b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// IBM AIX typedefs `int64` in `sys/inttypes.h`, included transitively above. 45b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#ifndef _AIX 46a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsontypedef long int64; 47b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#endif 48a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 49a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonusing std::string; 50a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonusing std::vector; 51a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonusing std::pair; 52a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 53a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 54a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// This assertion produces errors like "error: invalid use of 55a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// incomplete type 'struct <unnamed>::AssertTypesEq<const int, int>'" 56a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// when it fails. 57a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsontemplate<typename T, typename U> struct AssertTypesEq; 58a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsontemplate<typename T> struct AssertTypesEq<T, T> {}; 59a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#define COMPILE_ASSERT_TYPES_EQ(T, U) static_cast<void>(AssertTypesEq<T, U>()) 60a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 61a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// A user-defined POD type. 62a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonstruct A { 63a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int n_; 64a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}; 65a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 66a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// A user-defined non-POD type with a trivial copy constructor. 67a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass B { 68a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public: 69a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson explicit B(int n) : n_(n) { } 70a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private: 71a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int n_; 72a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}; 73a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 74a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Another user-defined non-POD type with a trivial copy constructor. 75a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// We will explicitly declare C to have a trivial copy constructor 76a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// by specializing has_trivial_copy. 77a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass C { 78a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public: 79a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson explicit C(int n) : n_(n) { } 80a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private: 81a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int n_; 82a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}; 83a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 84a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace google { 85a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace protobuf { 86a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace internal { 87a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsontemplate<> struct has_trivial_copy<C> : true_type { }; 88a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} // namespace internal 89a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} // namespace protobuf 90a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} // namespace google 91a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 92a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Another user-defined non-POD type with a trivial assignment operator. 93a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// We will explicitly declare C to have a trivial assignment operator 94a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// by specializing has_trivial_assign. 95a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass D { 96a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public: 97a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson explicit D(int n) : n_(n) { } 98a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private: 99a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int n_; 100a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}; 101a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 102a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace google { 103a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace protobuf { 104a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace internal { 105a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsontemplate<> struct has_trivial_assign<D> : true_type { }; 106a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} // namespace internal 107a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} // namespace protobuf 108a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} // namespace google 109a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 110a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Another user-defined non-POD type with a trivial constructor. 111a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// We will explicitly declare E to have a trivial constructor 112a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// by specializing has_trivial_constructor. 113a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass E { 114a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public: 115a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int n_; 116a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}; 117a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 118a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace google { 119a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace protobuf { 120a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace internal { 121a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsontemplate<> struct has_trivial_constructor<E> : true_type { }; 122a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} // namespace internal 123a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} // namespace protobuf 124a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} // namespace google 125a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 126a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Another user-defined non-POD type with a trivial destructor. 127a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// We will explicitly declare E to have a trivial destructor 128a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// by specializing has_trivial_destructor. 129a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass F { 130a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public: 131a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson explicit F(int n) : n_(n) { } 132a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private: 133a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int n_; 134a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}; 135a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 136a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace google { 137a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace protobuf { 138a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace internal { 139a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsontemplate<> struct has_trivial_destructor<F> : true_type { }; 140a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} // namespace internal 141a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} // namespace protobuf 142a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} // namespace google 143a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 144a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonenum G {}; 145a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 146a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonunion H {}; 147a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 148a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass I { 149a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public: 150a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson operator int() const; 151a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}; 152a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 153a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass J { 154a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private: 155a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson operator int() const; 156a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}; 157a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 158a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace google { 159a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace protobuf { 160a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace internal { 161a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace { 162a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 163a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// A base class and a derived class that inherits from it, used for 164a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// testing conversion type traits. 165a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass Base { 166a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public: 167a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson virtual ~Base() { } 168a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}; 169a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 170a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass Derived : public Base { 171a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}; 172a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 173a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestIsInteger) { 174a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that is_integral is true for all integer types. 175a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_integral<bool>::value); 176a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_integral<char>::value); 177a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_integral<unsigned char>::value); 178a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_integral<signed char>::value); 179a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_integral<wchar_t>::value); 180a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_integral<int>::value); 181a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_integral<unsigned int>::value); 182a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_integral<short>::value); 183a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_integral<unsigned short>::value); 184a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_integral<long>::value); 185a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_integral<unsigned long>::value); 186a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 187a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that is_integral is false for a few non-integer types. 188a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_integral<void>::value); 189a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_integral<float>::value); 190a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_integral<string>::value); 191a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_integral<int*>::value); 192a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_integral<A>::value); 193a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((is_integral<pair<int, int> >::value)); 194a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 195a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that cv-qualified integral types are still integral, and 196a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // cv-qualified non-integral types are still non-integral. 197a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_integral<const char>::value); 198a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_integral<volatile bool>::value); 199a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_integral<const volatile unsigned int>::value); 200a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_integral<const float>::value); 201a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_integral<int* volatile>::value); 202a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_integral<const volatile string>::value); 203a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 204a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 205a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestIsFloating) { 206a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that is_floating_point is true for all floating-point types. 207a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_floating_point<float>::value); 208a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_floating_point<double>::value); 209a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_floating_point<long double>::value); 210a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 211a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that is_floating_point is false for a few non-float types. 212a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_floating_point<void>::value); 213a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_floating_point<long>::value); 214a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_floating_point<string>::value); 215a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_floating_point<float*>::value); 216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_floating_point<A>::value); 217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((is_floating_point<pair<int, int> >::value)); 218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 219a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that cv-qualified floating point types are still floating, and 220a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // cv-qualified non-floating types are still non-floating. 221a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_floating_point<const float>::value); 222a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_floating_point<volatile double>::value); 223a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_floating_point<const volatile long double>::value); 224a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_floating_point<const int>::value); 225a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_floating_point<volatile string>::value); 226a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_floating_point<const volatile char>::value); 227a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 228a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 229a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestIsPointer) { 230a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that is_pointer is true for some pointer types. 231a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pointer<int*>::value); 232a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pointer<void*>::value); 233a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pointer<string*>::value); 234a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pointer<const void*>::value); 235a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pointer<volatile float* const*>::value); 236a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 237a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that is_pointer is false for some non-pointer types. 238a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_pointer<void>::value); 239a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_pointer<float&>::value); 240a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_pointer<long>::value); 241a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_pointer<vector<int*> >::value); 242a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_pointer<int[5]>::value); 243a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 244a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // A function pointer is a pointer, but a function type, or a function 245a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // reference type, is not. 246a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pointer<int (*)(int x)>::value); 247a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_pointer<void(char x)>::value); 248a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_pointer<double (&)(string x)>::value); 249a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 250a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that is_pointer<T> is true for some cv-qualified pointer types, 251a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // and false for some cv-qualified non-pointer types. 252a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pointer<int* const>::value); 253a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pointer<const void* volatile>::value); 254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pointer<char** const volatile>::value); 255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_pointer<const int>::value); 256a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_pointer<volatile vector<int*> >::value); 257a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_pointer<const volatile double>::value); 258a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 259a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 260a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestIsEnum) { 261a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// is_enum isn't supported on MSVC or gcc 3.x 262a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3) 263a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that is_enum is true for enum types. 264a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_enum<G>::value); 265a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_enum<const G>::value); 266a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_enum<volatile G>::value); 267a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_enum<const volatile G>::value); 268a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 269a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that is_enum is false for a few non-enum types. 270a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_enum<void>::value); 271a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_enum<G&>::value); 272a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_enum<G[1]>::value); 273a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_enum<const G[1]>::value); 274a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_enum<G[]>::value); 275a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_enum<int>::value); 276a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_enum<float>::value); 277a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_enum<A>::value); 278a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_enum<A*>::value); 279a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_enum<const A>::value); 280a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_enum<H>::value); 281a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_enum<I>::value); 282a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_enum<J>::value); 283a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_enum<void()>::value); 284a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_enum<void(*)()>::value); 285a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_enum<int A::*>::value); 286a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_enum<void (A::*)()>::value); 287a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#endif 288a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 289a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 290a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestIsReference) { 291a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verifies that is_reference is true for all reference types. 292a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson typedef float& RefFloat; 293a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_reference<float&>::value); 294a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_reference<const int&>::value); 295a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_reference<const int*&>::value); 296a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_reference<int (&)(bool)>::value); 297a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_reference<RefFloat>::value); 298a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_reference<const RefFloat>::value); 299a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_reference<volatile RefFloat>::value); 300a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_reference<const volatile RefFloat>::value); 301a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 302a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 303a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verifies that is_reference is false for all non-reference types. 304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_reference<float>::value); 305a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_reference<const float>::value); 306a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_reference<volatile float>::value); 307a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_reference<const volatile float>::value); 308a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_reference<const int*>::value); 309a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_reference<int()>::value); 310a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_reference<void(*)(const char&)>::value); 311a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 312a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 313a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestAddReference) { 314a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(int&, add_reference<int>::type); 315a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(const int&, add_reference<const int>::type); 316a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(volatile int&, 317a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson add_reference<volatile int>::type); 318a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(const volatile int&, 319a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson add_reference<const volatile int>::type); 320a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(int&, add_reference<int&>::type); 321a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(const int&, add_reference<const int&>::type); 322a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(volatile int&, 323a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson add_reference<volatile int&>::type); 324a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(const volatile int&, 325a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson add_reference<const volatile int&>::type); 326a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 327a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 328a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestIsPod) { 329a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that arithmetic types and pointers are marked as PODs. 330a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<bool>::value); 331a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<char>::value); 332a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<unsigned char>::value); 333a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<signed char>::value); 334a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<wchar_t>::value); 335a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<int>::value); 336a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<unsigned int>::value); 337a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<short>::value); 338a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<unsigned short>::value); 339a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<long>::value); 340a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<unsigned long>::value); 341a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<float>::value); 342a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<double>::value); 343a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<long double>::value); 344a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<string*>::value); 345a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<A*>::value); 346a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<const B*>::value); 347a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<C**>::value); 348a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<const int>::value); 349a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<char* volatile>::value); 350a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<const volatile double>::value); 351a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3) 352a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<G>::value); 353a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<const G>::value); 354a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<volatile G>::value); 355a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(is_pod<const volatile G>::value); 356a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#endif 357a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 358a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that some non-POD types are not marked as PODs. 359a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_pod<void>::value); 360a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_pod<string>::value); 361a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((is_pod<pair<int, int> >::value)); 362a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_pod<A>::value); 363a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_pod<B>::value); 364a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_pod<C>::value); 365a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_pod<const string>::value); 366a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_pod<volatile A>::value); 367a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(is_pod<const volatile B>::value); 368a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 369a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 370a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestHasTrivialConstructor) { 371a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that arithmetic types and pointers have trivial constructors. 372a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_constructor<bool>::value); 373a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_constructor<char>::value); 374a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_constructor<unsigned char>::value); 375a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_constructor<signed char>::value); 376a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_constructor<wchar_t>::value); 377a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_constructor<int>::value); 378a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_constructor<unsigned int>::value); 379a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_constructor<short>::value); 380a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_constructor<unsigned short>::value); 381a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_constructor<long>::value); 382a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_constructor<unsigned long>::value); 383a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_constructor<float>::value); 384a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_constructor<double>::value); 385a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_constructor<long double>::value); 386a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_constructor<string*>::value); 387a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_constructor<A*>::value); 388a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_constructor<const B*>::value); 389a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_constructor<C**>::value); 390a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 391a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that pairs and arrays of such types have trivial 392a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // constructors. 393a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson typedef int int10[10]; 394a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE((has_trivial_constructor<pair<int, char*> >::value)); 395a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_constructor<int10>::value); 396a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 397a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that pairs of types without trivial constructors 398a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // are not marked as trivial. 399a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((has_trivial_constructor<pair<int, string> >::value)); 400a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((has_trivial_constructor<pair<string, int> >::value)); 401a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 402a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that types without trivial constructors are 403a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // correctly marked as such. 404a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(has_trivial_constructor<string>::value); 405a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(has_trivial_constructor<vector<int> >::value); 406a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 407a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that E, which we have declared to have a trivial 408a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // constructor, is correctly marked as such. 409a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_constructor<E>::value); 410a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 411a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 412a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestHasTrivialCopy) { 413a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that arithmetic types and pointers have trivial copy 414a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // constructors. 415a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_copy<bool>::value); 416a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_copy<char>::value); 417a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_copy<unsigned char>::value); 418a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_copy<signed char>::value); 419a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_copy<wchar_t>::value); 420a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_copy<int>::value); 421a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_copy<unsigned int>::value); 422a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_copy<short>::value); 423a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_copy<unsigned short>::value); 424a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_copy<long>::value); 425a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_copy<unsigned long>::value); 426a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_copy<float>::value); 427a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_copy<double>::value); 428a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_copy<long double>::value); 429a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_copy<string*>::value); 430a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_copy<A*>::value); 431a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_copy<const B*>::value); 432a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_copy<C**>::value); 433a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 434a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that pairs and arrays of such types have trivial 435a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // copy constructors. 436a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson typedef int int10[10]; 437a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE((has_trivial_copy<pair<int, char*> >::value)); 438a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_copy<int10>::value); 439a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 440a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that pairs of types without trivial copy constructors 441a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // are not marked as trivial. 442a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((has_trivial_copy<pair<int, string> >::value)); 443a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((has_trivial_copy<pair<string, int> >::value)); 444a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 445a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that types without trivial copy constructors are 446a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // correctly marked as such. 447a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(has_trivial_copy<string>::value); 448a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(has_trivial_copy<vector<int> >::value); 449a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 450a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that C, which we have declared to have a trivial 451a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // copy constructor, is correctly marked as such. 452a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_copy<C>::value); 453a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 454a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 455a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestHasTrivialAssign) { 456a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that arithmetic types and pointers have trivial assignment 457a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // operators. 458a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_assign<bool>::value); 459a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_assign<char>::value); 460a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_assign<unsigned char>::value); 461a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_assign<signed char>::value); 462a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_assign<wchar_t>::value); 463a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_assign<int>::value); 464a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_assign<unsigned int>::value); 465a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_assign<short>::value); 466a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_assign<unsigned short>::value); 467a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_assign<long>::value); 468a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_assign<unsigned long>::value); 469a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_assign<float>::value); 470a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_assign<double>::value); 471a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_assign<long double>::value); 472a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_assign<string*>::value); 473a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_assign<A*>::value); 474a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_assign<const B*>::value); 475a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_assign<C**>::value); 476a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 477a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that pairs and arrays of such types have trivial 478a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // assignment operators. 479a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson typedef int int10[10]; 480a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE((has_trivial_assign<pair<int, char*> >::value)); 481a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_assign<int10>::value); 482a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 483a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that pairs of types without trivial assignment operators 484a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // are not marked as trivial. 485a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((has_trivial_assign<pair<int, string> >::value)); 486a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((has_trivial_assign<pair<string, int> >::value)); 487a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 488a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that types without trivial assignment operators are 489a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // correctly marked as such. 490a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(has_trivial_assign<string>::value); 491a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(has_trivial_assign<vector<int> >::value); 492a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 493a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that D, which we have declared to have a trivial 494a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // assignment operator, is correctly marked as such. 495a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_assign<D>::value); 496a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 497a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 498a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestHasTrivialDestructor) { 499a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that arithmetic types and pointers have trivial destructors. 500a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_destructor<bool>::value); 501a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_destructor<char>::value); 502a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_destructor<unsigned char>::value); 503a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_destructor<signed char>::value); 504a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_destructor<wchar_t>::value); 505a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_destructor<int>::value); 506a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_destructor<unsigned int>::value); 507a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_destructor<short>::value); 508a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_destructor<unsigned short>::value); 509a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_destructor<long>::value); 510a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_destructor<unsigned long>::value); 511a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_destructor<float>::value); 512a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_destructor<double>::value); 513a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_destructor<long double>::value); 514a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_destructor<string*>::value); 515a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_destructor<A*>::value); 516a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_destructor<const B*>::value); 517a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_destructor<C**>::value); 518a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 519a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that pairs and arrays of such types have trivial 520a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // destructors. 521a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson typedef int int10[10]; 522a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE((has_trivial_destructor<pair<int, char*> >::value)); 523a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_destructor<int10>::value); 524a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 525a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that pairs of types without trivial destructors 526a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // are not marked as trivial. 527a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((has_trivial_destructor<pair<int, string> >::value)); 528a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((has_trivial_destructor<pair<string, int> >::value)); 529a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 530a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that types without trivial destructors are 531a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // correctly marked as such. 532a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(has_trivial_destructor<string>::value); 533a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(has_trivial_destructor<vector<int> >::value); 534a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 535a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Verify that F, which we have declared to have a trivial 536a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // destructor, is correctly marked as such. 537a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(has_trivial_destructor<F>::value); 538a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 539a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 540a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Tests remove_pointer. 541a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestRemovePointer) { 542a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(int, remove_pointer<int>::type); 543a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(int, remove_pointer<int*>::type); 544a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(const int, remove_pointer<const int*>::type); 545a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(int, remove_pointer<int* const>::type); 546a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(int, remove_pointer<int* volatile>::type); 547a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 548a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 549a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestRemoveConst) { 550a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(int, remove_const<int>::type); 551a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(int, remove_const<const int>::type); 552a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(int *, remove_const<int * const>::type); 553a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // TR1 examples. 554a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(const int *, remove_const<const int *>::type); 555a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(volatile int, 556a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson remove_const<const volatile int>::type); 557a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 558a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 559a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestRemoveVolatile) { 560a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(int, remove_volatile<int>::type); 561a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(int, remove_volatile<volatile int>::type); 562a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(int *, remove_volatile<int * volatile>::type); 563a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // TR1 examples. 564a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(volatile int *, 565a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson remove_volatile<volatile int *>::type); 566a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(const int, 567a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson remove_volatile<const volatile int>::type); 568a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 569a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 570a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestRemoveCV) { 571a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(int, remove_cv<int>::type); 572a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(int, remove_cv<volatile int>::type); 573a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(int, remove_cv<const int>::type); 574a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(int *, remove_cv<int * const volatile>::type); 575a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // TR1 examples. 576a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(const volatile int *, 577a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson remove_cv<const volatile int *>::type); 578a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(int, 579a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson remove_cv<const volatile int>::type); 580a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 581a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 582a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestRemoveReference) { 583a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(int, remove_reference<int>::type); 584a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(int, remove_reference<int&>::type); 585a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(const int, remove_reference<const int&>::type); 586a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson COMPILE_ASSERT_TYPES_EQ(int*, remove_reference<int * &>::type); 587a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 588a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 589a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestIsSame) { 590a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE((is_same<int32, int32>::value)); 591a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((is_same<int32, int64>::value)); 592a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((is_same<int64, int32>::value)); 593a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((is_same<int, const int>::value)); 594a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 595a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE((is_same<void, void>::value)); 596a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((is_same<void, int>::value)); 597a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((is_same<int, void>::value)); 598a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 599a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE((is_same<int*, int*>::value)); 600a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE((is_same<void*, void*>::value)); 601a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((is_same<int*, void*>::value)); 602a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((is_same<void*, int*>::value)); 603a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((is_same<void*, const void*>::value)); 604a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((is_same<void*, void* const>::value)); 605a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 606a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE((is_same<Base*, Base*>::value)); 607a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE((is_same<Derived*, Derived*>::value)); 608a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((is_same<Base*, Derived*>::value)); 609a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((is_same<Derived*, Base*>::value)); 610a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 611a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 612a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestConvertible) { 613b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#if !(defined(__GNUC__) && __GNUC__ <= 3) 614a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE((is_convertible<int, int>::value)); 615a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE((is_convertible<int, long>::value)); 616a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE((is_convertible<long, int>::value)); 617a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 618a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE((is_convertible<int*, void*>::value)); 619a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((is_convertible<void*, int*>::value)); 620a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 621a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE((is_convertible<Derived*, Base*>::value)); 622a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((is_convertible<Base*, Derived*>::value)); 623a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE((is_convertible<Derived*, const Base*>::value)); 624a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE((is_convertible<const Derived*, Base*>::value)); 625a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#endif 626a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 627a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 628a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} // anonymous namespace 629a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} // namespace internal 630a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} // namespace protobuf 631a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} // namespace google 632