| Index: third_party/protobuf/src/google/protobuf/stubs/type_traits_unittest.cc
|
| ===================================================================
|
| --- third_party/protobuf/src/google/protobuf/stubs/type_traits_unittest.cc (revision 0)
|
| +++ third_party/protobuf/src/google/protobuf/stubs/type_traits_unittest.cc (revision 0)
|
| @@ -0,0 +1,647 @@
|
| +// Copyright (c) 2006, Google Inc.
|
| +// All rights reserved.
|
| +//
|
| +// Redistribution and use in source and binary forms, with or without
|
| +// modification, are permitted provided that the following conditions are
|
| +// met:
|
| +//
|
| +// * Redistributions of source code must retain the above copyright
|
| +// notice, this list of conditions and the following disclaimer.
|
| +// * Redistributions in binary form must reproduce the above
|
| +// copyright notice, this list of conditions and the following disclaimer
|
| +// in the documentation and/or other materials provided with the
|
| +// distribution.
|
| +// * Neither the name of Google Inc. nor the names of its
|
| +// contributors may be used to endorse or promote products derived from
|
| +// this software without specific prior written permission.
|
| +//
|
| +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| +
|
| +// ----
|
| +// Author: Matt Austern
|
| +
|
| +#include <google/protobuf/stubs/type_traits.h>
|
| +
|
| +#include <stdlib.h> // for exit()
|
| +#include <stdio.h>
|
| +#include <string>
|
| +#include <vector>
|
| +
|
| +#include <google/protobuf/testing/googletest.h>
|
| +#include <gtest/gtest.h>
|
| +
|
| +typedef int int32;
|
| +typedef long int64;
|
| +
|
| +using std::string;
|
| +using std::vector;
|
| +using std::pair;
|
| +
|
| +using google::protobuf::internal::add_reference;
|
| +using google::protobuf::internal::has_trivial_assign;
|
| +using google::protobuf::internal::has_trivial_constructor;
|
| +using google::protobuf::internal::has_trivial_copy;
|
| +using google::protobuf::internal::has_trivial_destructor;
|
| +#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3)
|
| +using google::protobuf::internal::is_convertible;
|
| +using google::protobuf::internal::is_enum;
|
| +#endif
|
| +using google::protobuf::internal::is_floating_point;
|
| +using google::protobuf::internal::is_integral;
|
| +using google::protobuf::internal::is_pointer;
|
| +using google::protobuf::internal::is_pod;
|
| +using google::protobuf::internal::is_reference;
|
| +using google::protobuf::internal::is_same;
|
| +using google::protobuf::internal::remove_const;
|
| +using google::protobuf::internal::remove_cv;
|
| +using google::protobuf::internal::remove_pointer;
|
| +using google::protobuf::internal::remove_reference;
|
| +using google::protobuf::internal::remove_volatile;
|
| +
|
| +
|
| +// This assertion produces errors like "error: invalid use of
|
| +// incomplete type 'struct <unnamed>::AssertTypesEq<const int, int>'"
|
| +// when it fails.
|
| +template<typename T, typename U> struct AssertTypesEq;
|
| +template<typename T> struct AssertTypesEq<T, T> {};
|
| +#define COMPILE_ASSERT_TYPES_EQ(T, U) static_cast<void>(AssertTypesEq<T, U>())
|
| +
|
| +// A user-defined POD type.
|
| +struct A {
|
| + int n_;
|
| +};
|
| +
|
| +// A user-defined non-POD type with a trivial copy constructor.
|
| +class B {
|
| + public:
|
| + explicit B(int n) : n_(n) { }
|
| + private:
|
| + int n_;
|
| +};
|
| +
|
| +// Another user-defined non-POD type with a trivial copy constructor.
|
| +// We will explicitly declare C to have a trivial copy constructor
|
| +// by specializing has_trivial_copy.
|
| +class C {
|
| + public:
|
| + explicit C(int n) : n_(n) { }
|
| + private:
|
| + int n_;
|
| +};
|
| +
|
| +namespace google {
|
| +namespace protobuf {
|
| +namespace internal {
|
| +template<> struct has_trivial_copy<C> : true_type { };
|
| +} // namespace internal
|
| +} // namespace protobuf
|
| +} // namespace google
|
| +
|
| +// Another user-defined non-POD type with a trivial assignment operator.
|
| +// We will explicitly declare C to have a trivial assignment operator
|
| +// by specializing has_trivial_assign.
|
| +class D {
|
| + public:
|
| + explicit D(int n) : n_(n) { }
|
| + private:
|
| + int n_;
|
| +};
|
| +
|
| +namespace google {
|
| +namespace protobuf {
|
| +namespace internal {
|
| +template<> struct has_trivial_assign<D> : true_type { };
|
| +} // namespace internal
|
| +} // namespace protobuf
|
| +} // namespace google
|
| +
|
| +// Another user-defined non-POD type with a trivial constructor.
|
| +// We will explicitly declare E to have a trivial constructor
|
| +// by specializing has_trivial_constructor.
|
| +class E {
|
| + public:
|
| + int n_;
|
| +};
|
| +
|
| +namespace google {
|
| +namespace protobuf {
|
| +namespace internal {
|
| +template<> struct has_trivial_constructor<E> : true_type { };
|
| +} // namespace internal
|
| +} // namespace protobuf
|
| +} // namespace google
|
| +
|
| +// Another user-defined non-POD type with a trivial destructor.
|
| +// We will explicitly declare E to have a trivial destructor
|
| +// by specializing has_trivial_destructor.
|
| +class F {
|
| + public:
|
| + explicit F(int n) : n_(n) { }
|
| + private:
|
| + int n_;
|
| +};
|
| +
|
| +namespace google {
|
| +namespace protobuf {
|
| +namespace internal {
|
| +template<> struct has_trivial_destructor<F> : true_type { };
|
| +} // namespace internal
|
| +} // namespace protobuf
|
| +} // namespace google
|
| +
|
| +enum G {};
|
| +
|
| +union H {};
|
| +
|
| +class I {
|
| + public:
|
| + operator int() const;
|
| +};
|
| +
|
| +class J {
|
| + private:
|
| + operator int() const;
|
| +};
|
| +
|
| +namespace google {
|
| +namespace protobuf {
|
| +namespace {
|
| +
|
| +// A base class and a derived class that inherits from it, used for
|
| +// testing conversion type traits.
|
| +class Base {
|
| + public:
|
| + virtual ~Base() { }
|
| +};
|
| +
|
| +class Derived : public Base {
|
| +};
|
| +
|
| +TEST(TypeTraitsTest, TestIsInteger) {
|
| + // Verify that is_integral is true for all integer types.
|
| + EXPECT_TRUE(is_integral<bool>::value);
|
| + EXPECT_TRUE(is_integral<char>::value);
|
| + EXPECT_TRUE(is_integral<unsigned char>::value);
|
| + EXPECT_TRUE(is_integral<signed char>::value);
|
| + EXPECT_TRUE(is_integral<wchar_t>::value);
|
| + EXPECT_TRUE(is_integral<int>::value);
|
| + EXPECT_TRUE(is_integral<unsigned int>::value);
|
| + EXPECT_TRUE(is_integral<short>::value);
|
| + EXPECT_TRUE(is_integral<unsigned short>::value);
|
| + EXPECT_TRUE(is_integral<long>::value);
|
| + EXPECT_TRUE(is_integral<unsigned long>::value);
|
| +
|
| + // Verify that is_integral is false for a few non-integer types.
|
| + EXPECT_FALSE(is_integral<void>::value);
|
| + EXPECT_FALSE(is_integral<float>::value);
|
| + EXPECT_FALSE(is_integral<string>::value);
|
| + EXPECT_FALSE(is_integral<int*>::value);
|
| + EXPECT_FALSE(is_integral<A>::value);
|
| + EXPECT_FALSE((is_integral<pair<int, int> >::value));
|
| +
|
| + // Verify that cv-qualified integral types are still integral, and
|
| + // cv-qualified non-integral types are still non-integral.
|
| + EXPECT_TRUE(is_integral<const char>::value);
|
| + EXPECT_TRUE(is_integral<volatile bool>::value);
|
| + EXPECT_TRUE(is_integral<const volatile unsigned int>::value);
|
| + EXPECT_FALSE(is_integral<const float>::value);
|
| + EXPECT_FALSE(is_integral<int* volatile>::value);
|
| + EXPECT_FALSE(is_integral<const volatile string>::value);
|
| +}
|
| +
|
| +TEST(TypeTraitsTest, TestIsFloating) {
|
| + // Verify that is_floating_point is true for all floating-point types.
|
| + EXPECT_TRUE(is_floating_point<float>::value);
|
| + EXPECT_TRUE(is_floating_point<double>::value);
|
| + EXPECT_TRUE(is_floating_point<long double>::value);
|
| +
|
| + // Verify that is_floating_point is false for a few non-float types.
|
| + EXPECT_FALSE(is_floating_point<void>::value);
|
| + EXPECT_FALSE(is_floating_point<long>::value);
|
| + EXPECT_FALSE(is_floating_point<string>::value);
|
| + EXPECT_FALSE(is_floating_point<float*>::value);
|
| + EXPECT_FALSE(is_floating_point<A>::value);
|
| + EXPECT_FALSE((is_floating_point<pair<int, int> >::value));
|
| +
|
| + // Verify that cv-qualified floating point types are still floating, and
|
| + // cv-qualified non-floating types are still non-floating.
|
| + EXPECT_TRUE(is_floating_point<const float>::value);
|
| + EXPECT_TRUE(is_floating_point<volatile double>::value);
|
| + EXPECT_TRUE(is_floating_point<const volatile long double>::value);
|
| + EXPECT_FALSE(is_floating_point<const int>::value);
|
| + EXPECT_FALSE(is_floating_point<volatile string>::value);
|
| + EXPECT_FALSE(is_floating_point<const volatile char>::value);
|
| +}
|
| +
|
| +TEST(TypeTraitsTest, TestIsPointer) {
|
| + // Verify that is_pointer is true for some pointer types.
|
| + EXPECT_TRUE(is_pointer<int*>::value);
|
| + EXPECT_TRUE(is_pointer<void*>::value);
|
| + EXPECT_TRUE(is_pointer<string*>::value);
|
| + EXPECT_TRUE(is_pointer<const void*>::value);
|
| + EXPECT_TRUE(is_pointer<volatile float* const*>::value);
|
| +
|
| + // Verify that is_pointer is false for some non-pointer types.
|
| + EXPECT_FALSE(is_pointer<void>::value);
|
| + EXPECT_FALSE(is_pointer<float&>::value);
|
| + EXPECT_FALSE(is_pointer<long>::value);
|
| + EXPECT_FALSE(is_pointer<vector<int*> >::value);
|
| + EXPECT_FALSE(is_pointer<int[5]>::value);
|
| +
|
| + // A function pointer is a pointer, but a function type, or a function
|
| + // reference type, is not.
|
| + EXPECT_TRUE(is_pointer<int (*)(int x)>::value);
|
| + EXPECT_FALSE(is_pointer<void(char x)>::value);
|
| + EXPECT_FALSE(is_pointer<double (&)(string x)>::value);
|
| +
|
| + // Verify that is_pointer<T> is true for some cv-qualified pointer types,
|
| + // and false for some cv-qualified non-pointer types.
|
| + EXPECT_TRUE(is_pointer<int* const>::value);
|
| + EXPECT_TRUE(is_pointer<const void* volatile>::value);
|
| + EXPECT_TRUE(is_pointer<char** const volatile>::value);
|
| + EXPECT_FALSE(is_pointer<const int>::value);
|
| + EXPECT_FALSE(is_pointer<volatile vector<int*> >::value);
|
| + EXPECT_FALSE(is_pointer<const volatile double>::value);
|
| +}
|
| +
|
| +TEST(TypeTraitsTest, TestIsEnum) {
|
| +// is_enum isn't supported on MSVC or gcc 3.x
|
| +#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3)
|
| + // Verify that is_enum is true for enum types.
|
| + EXPECT_TRUE(is_enum<G>::value);
|
| + EXPECT_TRUE(is_enum<const G>::value);
|
| + EXPECT_TRUE(is_enum<volatile G>::value);
|
| + EXPECT_TRUE(is_enum<const volatile G>::value);
|
| +
|
| + // Verify that is_enum is false for a few non-enum types.
|
| + EXPECT_FALSE(is_enum<void>::value);
|
| + EXPECT_FALSE(is_enum<G&>::value);
|
| + EXPECT_FALSE(is_enum<G[1]>::value);
|
| + EXPECT_FALSE(is_enum<const G[1]>::value);
|
| + EXPECT_FALSE(is_enum<G[]>::value);
|
| + EXPECT_FALSE(is_enum<int>::value);
|
| + EXPECT_FALSE(is_enum<float>::value);
|
| + EXPECT_FALSE(is_enum<A>::value);
|
| + EXPECT_FALSE(is_enum<A*>::value);
|
| + EXPECT_FALSE(is_enum<const A>::value);
|
| + EXPECT_FALSE(is_enum<H>::value);
|
| + EXPECT_FALSE(is_enum<I>::value);
|
| + EXPECT_FALSE(is_enum<J>::value);
|
| + EXPECT_FALSE(is_enum<void()>::value);
|
| + EXPECT_FALSE(is_enum<void(*)()>::value);
|
| + EXPECT_FALSE(is_enum<int A::*>::value);
|
| + EXPECT_FALSE(is_enum<void (A::*)()>::value);
|
| +#endif
|
| +}
|
| +
|
| +TEST(TypeTraitsTest, TestIsReference) {
|
| + // Verifies that is_reference is true for all reference types.
|
| + typedef float& RefFloat;
|
| + EXPECT_TRUE(is_reference<float&>::value);
|
| + EXPECT_TRUE(is_reference<const int&>::value);
|
| + EXPECT_TRUE(is_reference<const int*&>::value);
|
| + EXPECT_TRUE(is_reference<int (&)(bool)>::value);
|
| + EXPECT_TRUE(is_reference<RefFloat>::value);
|
| + EXPECT_TRUE(is_reference<const RefFloat>::value);
|
| + EXPECT_TRUE(is_reference<volatile RefFloat>::value);
|
| + EXPECT_TRUE(is_reference<const volatile RefFloat>::value);
|
| +
|
| +
|
| + // Verifies that is_reference is false for all non-reference types.
|
| + EXPECT_FALSE(is_reference<float>::value);
|
| + EXPECT_FALSE(is_reference<const float>::value);
|
| + EXPECT_FALSE(is_reference<volatile float>::value);
|
| + EXPECT_FALSE(is_reference<const volatile float>::value);
|
| + EXPECT_FALSE(is_reference<const int*>::value);
|
| + EXPECT_FALSE(is_reference<int()>::value);
|
| + EXPECT_FALSE(is_reference<void(*)(const char&)>::value);
|
| +}
|
| +
|
| +TEST(TypeTraitsTest, TestAddReference) {
|
| + COMPILE_ASSERT_TYPES_EQ(int&, add_reference<int>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(const int&, add_reference<const int>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(volatile int&,
|
| + add_reference<volatile int>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(const volatile int&,
|
| + add_reference<const volatile int>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(int&, add_reference<int&>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(const int&, add_reference<const int&>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(volatile int&,
|
| + add_reference<volatile int&>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(const volatile int&,
|
| + add_reference<const volatile int&>::type);
|
| +}
|
| +
|
| +TEST(TypeTraitsTest, TestIsPod) {
|
| + // Verify that arithmetic types and pointers are marked as PODs.
|
| + EXPECT_TRUE(is_pod<bool>::value);
|
| + EXPECT_TRUE(is_pod<char>::value);
|
| + EXPECT_TRUE(is_pod<unsigned char>::value);
|
| + EXPECT_TRUE(is_pod<signed char>::value);
|
| + EXPECT_TRUE(is_pod<wchar_t>::value);
|
| + EXPECT_TRUE(is_pod<int>::value);
|
| + EXPECT_TRUE(is_pod<unsigned int>::value);
|
| + EXPECT_TRUE(is_pod<short>::value);
|
| + EXPECT_TRUE(is_pod<unsigned short>::value);
|
| + EXPECT_TRUE(is_pod<long>::value);
|
| + EXPECT_TRUE(is_pod<unsigned long>::value);
|
| + EXPECT_TRUE(is_pod<float>::value);
|
| + EXPECT_TRUE(is_pod<double>::value);
|
| + EXPECT_TRUE(is_pod<long double>::value);
|
| + EXPECT_TRUE(is_pod<string*>::value);
|
| + EXPECT_TRUE(is_pod<A*>::value);
|
| + EXPECT_TRUE(is_pod<const B*>::value);
|
| + EXPECT_TRUE(is_pod<C**>::value);
|
| + EXPECT_TRUE(is_pod<const int>::value);
|
| + EXPECT_TRUE(is_pod<char* volatile>::value);
|
| + EXPECT_TRUE(is_pod<const volatile double>::value);
|
| +#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3)
|
| + EXPECT_TRUE(is_pod<G>::value);
|
| + EXPECT_TRUE(is_pod<const G>::value);
|
| + EXPECT_TRUE(is_pod<volatile G>::value);
|
| + EXPECT_TRUE(is_pod<const volatile G>::value);
|
| +#endif
|
| +
|
| + // Verify that some non-POD types are not marked as PODs.
|
| + EXPECT_FALSE(is_pod<void>::value);
|
| + EXPECT_FALSE(is_pod<string>::value);
|
| + EXPECT_FALSE((is_pod<pair<int, int> >::value));
|
| + EXPECT_FALSE(is_pod<A>::value);
|
| + EXPECT_FALSE(is_pod<B>::value);
|
| + EXPECT_FALSE(is_pod<C>::value);
|
| + EXPECT_FALSE(is_pod<const string>::value);
|
| + EXPECT_FALSE(is_pod<volatile A>::value);
|
| + EXPECT_FALSE(is_pod<const volatile B>::value);
|
| +}
|
| +
|
| +TEST(TypeTraitsTest, TestHasTrivialConstructor) {
|
| + // Verify that arithmetic types and pointers have trivial constructors.
|
| + EXPECT_TRUE(has_trivial_constructor<bool>::value);
|
| + EXPECT_TRUE(has_trivial_constructor<char>::value);
|
| + EXPECT_TRUE(has_trivial_constructor<unsigned char>::value);
|
| + EXPECT_TRUE(has_trivial_constructor<signed char>::value);
|
| + EXPECT_TRUE(has_trivial_constructor<wchar_t>::value);
|
| + EXPECT_TRUE(has_trivial_constructor<int>::value);
|
| + EXPECT_TRUE(has_trivial_constructor<unsigned int>::value);
|
| + EXPECT_TRUE(has_trivial_constructor<short>::value);
|
| + EXPECT_TRUE(has_trivial_constructor<unsigned short>::value);
|
| + EXPECT_TRUE(has_trivial_constructor<long>::value);
|
| + EXPECT_TRUE(has_trivial_constructor<unsigned long>::value);
|
| + EXPECT_TRUE(has_trivial_constructor<float>::value);
|
| + EXPECT_TRUE(has_trivial_constructor<double>::value);
|
| + EXPECT_TRUE(has_trivial_constructor<long double>::value);
|
| + EXPECT_TRUE(has_trivial_constructor<string*>::value);
|
| + EXPECT_TRUE(has_trivial_constructor<A*>::value);
|
| + EXPECT_TRUE(has_trivial_constructor<const B*>::value);
|
| + EXPECT_TRUE(has_trivial_constructor<C**>::value);
|
| +
|
| + // Verify that pairs and arrays of such types have trivial
|
| + // constructors.
|
| + typedef int int10[10];
|
| + EXPECT_TRUE((has_trivial_constructor<pair<int, char*> >::value));
|
| + EXPECT_TRUE(has_trivial_constructor<int10>::value);
|
| +
|
| + // Verify that pairs of types without trivial constructors
|
| + // are not marked as trivial.
|
| + EXPECT_FALSE((has_trivial_constructor<pair<int, string> >::value));
|
| + EXPECT_FALSE((has_trivial_constructor<pair<string, int> >::value));
|
| +
|
| + // Verify that types without trivial constructors are
|
| + // correctly marked as such.
|
| + EXPECT_FALSE(has_trivial_constructor<string>::value);
|
| + EXPECT_FALSE(has_trivial_constructor<vector<int> >::value);
|
| +
|
| + // Verify that E, which we have declared to have a trivial
|
| + // constructor, is correctly marked as such.
|
| + EXPECT_TRUE(has_trivial_constructor<E>::value);
|
| +}
|
| +
|
| +TEST(TypeTraitsTest, TestHasTrivialCopy) {
|
| + // Verify that arithmetic types and pointers have trivial copy
|
| + // constructors.
|
| + EXPECT_TRUE(has_trivial_copy<bool>::value);
|
| + EXPECT_TRUE(has_trivial_copy<char>::value);
|
| + EXPECT_TRUE(has_trivial_copy<unsigned char>::value);
|
| + EXPECT_TRUE(has_trivial_copy<signed char>::value);
|
| + EXPECT_TRUE(has_trivial_copy<wchar_t>::value);
|
| + EXPECT_TRUE(has_trivial_copy<int>::value);
|
| + EXPECT_TRUE(has_trivial_copy<unsigned int>::value);
|
| + EXPECT_TRUE(has_trivial_copy<short>::value);
|
| + EXPECT_TRUE(has_trivial_copy<unsigned short>::value);
|
| + EXPECT_TRUE(has_trivial_copy<long>::value);
|
| + EXPECT_TRUE(has_trivial_copy<unsigned long>::value);
|
| + EXPECT_TRUE(has_trivial_copy<float>::value);
|
| + EXPECT_TRUE(has_trivial_copy<double>::value);
|
| + EXPECT_TRUE(has_trivial_copy<long double>::value);
|
| + EXPECT_TRUE(has_trivial_copy<string*>::value);
|
| + EXPECT_TRUE(has_trivial_copy<A*>::value);
|
| + EXPECT_TRUE(has_trivial_copy<const B*>::value);
|
| + EXPECT_TRUE(has_trivial_copy<C**>::value);
|
| +
|
| + // Verify that pairs and arrays of such types have trivial
|
| + // copy constructors.
|
| + typedef int int10[10];
|
| + EXPECT_TRUE((has_trivial_copy<pair<int, char*> >::value));
|
| + EXPECT_TRUE(has_trivial_copy<int10>::value);
|
| +
|
| + // Verify that pairs of types without trivial copy constructors
|
| + // are not marked as trivial.
|
| + EXPECT_FALSE((has_trivial_copy<pair<int, string> >::value));
|
| + EXPECT_FALSE((has_trivial_copy<pair<string, int> >::value));
|
| +
|
| + // Verify that types without trivial copy constructors are
|
| + // correctly marked as such.
|
| + EXPECT_FALSE(has_trivial_copy<string>::value);
|
| + EXPECT_FALSE(has_trivial_copy<vector<int> >::value);
|
| +
|
| + // Verify that C, which we have declared to have a trivial
|
| + // copy constructor, is correctly marked as such.
|
| + EXPECT_TRUE(has_trivial_copy<C>::value);
|
| +}
|
| +
|
| +TEST(TypeTraitsTest, TestHasTrivialAssign) {
|
| + // Verify that arithmetic types and pointers have trivial assignment
|
| + // operators.
|
| + EXPECT_TRUE(has_trivial_assign<bool>::value);
|
| + EXPECT_TRUE(has_trivial_assign<char>::value);
|
| + EXPECT_TRUE(has_trivial_assign<unsigned char>::value);
|
| + EXPECT_TRUE(has_trivial_assign<signed char>::value);
|
| + EXPECT_TRUE(has_trivial_assign<wchar_t>::value);
|
| + EXPECT_TRUE(has_trivial_assign<int>::value);
|
| + EXPECT_TRUE(has_trivial_assign<unsigned int>::value);
|
| + EXPECT_TRUE(has_trivial_assign<short>::value);
|
| + EXPECT_TRUE(has_trivial_assign<unsigned short>::value);
|
| + EXPECT_TRUE(has_trivial_assign<long>::value);
|
| + EXPECT_TRUE(has_trivial_assign<unsigned long>::value);
|
| + EXPECT_TRUE(has_trivial_assign<float>::value);
|
| + EXPECT_TRUE(has_trivial_assign<double>::value);
|
| + EXPECT_TRUE(has_trivial_assign<long double>::value);
|
| + EXPECT_TRUE(has_trivial_assign<string*>::value);
|
| + EXPECT_TRUE(has_trivial_assign<A*>::value);
|
| + EXPECT_TRUE(has_trivial_assign<const B*>::value);
|
| + EXPECT_TRUE(has_trivial_assign<C**>::value);
|
| +
|
| + // Verify that pairs and arrays of such types have trivial
|
| + // assignment operators.
|
| + typedef int int10[10];
|
| + EXPECT_TRUE((has_trivial_assign<pair<int, char*> >::value));
|
| + EXPECT_TRUE(has_trivial_assign<int10>::value);
|
| +
|
| + // Verify that pairs of types without trivial assignment operators
|
| + // are not marked as trivial.
|
| + EXPECT_FALSE((has_trivial_assign<pair<int, string> >::value));
|
| + EXPECT_FALSE((has_trivial_assign<pair<string, int> >::value));
|
| +
|
| + // Verify that types without trivial assignment operators are
|
| + // correctly marked as such.
|
| + EXPECT_FALSE(has_trivial_assign<string>::value);
|
| + EXPECT_FALSE(has_trivial_assign<vector<int> >::value);
|
| +
|
| + // Verify that D, which we have declared to have a trivial
|
| + // assignment operator, is correctly marked as such.
|
| + EXPECT_TRUE(has_trivial_assign<D>::value);
|
| +}
|
| +
|
| +TEST(TypeTraitsTest, TestHasTrivialDestructor) {
|
| + // Verify that arithmetic types and pointers have trivial destructors.
|
| + EXPECT_TRUE(has_trivial_destructor<bool>::value);
|
| + EXPECT_TRUE(has_trivial_destructor<char>::value);
|
| + EXPECT_TRUE(has_trivial_destructor<unsigned char>::value);
|
| + EXPECT_TRUE(has_trivial_destructor<signed char>::value);
|
| + EXPECT_TRUE(has_trivial_destructor<wchar_t>::value);
|
| + EXPECT_TRUE(has_trivial_destructor<int>::value);
|
| + EXPECT_TRUE(has_trivial_destructor<unsigned int>::value);
|
| + EXPECT_TRUE(has_trivial_destructor<short>::value);
|
| + EXPECT_TRUE(has_trivial_destructor<unsigned short>::value);
|
| + EXPECT_TRUE(has_trivial_destructor<long>::value);
|
| + EXPECT_TRUE(has_trivial_destructor<unsigned long>::value);
|
| + EXPECT_TRUE(has_trivial_destructor<float>::value);
|
| + EXPECT_TRUE(has_trivial_destructor<double>::value);
|
| + EXPECT_TRUE(has_trivial_destructor<long double>::value);
|
| + EXPECT_TRUE(has_trivial_destructor<string*>::value);
|
| + EXPECT_TRUE(has_trivial_destructor<A*>::value);
|
| + EXPECT_TRUE(has_trivial_destructor<const B*>::value);
|
| + EXPECT_TRUE(has_trivial_destructor<C**>::value);
|
| +
|
| + // Verify that pairs and arrays of such types have trivial
|
| + // destructors.
|
| + typedef int int10[10];
|
| + EXPECT_TRUE((has_trivial_destructor<pair<int, char*> >::value));
|
| + EXPECT_TRUE(has_trivial_destructor<int10>::value);
|
| +
|
| + // Verify that pairs of types without trivial destructors
|
| + // are not marked as trivial.
|
| + EXPECT_FALSE((has_trivial_destructor<pair<int, string> >::value));
|
| + EXPECT_FALSE((has_trivial_destructor<pair<string, int> >::value));
|
| +
|
| + // Verify that types without trivial destructors are
|
| + // correctly marked as such.
|
| + EXPECT_FALSE(has_trivial_destructor<string>::value);
|
| + EXPECT_FALSE(has_trivial_destructor<vector<int> >::value);
|
| +
|
| + // Verify that F, which we have declared to have a trivial
|
| + // destructor, is correctly marked as such.
|
| + EXPECT_TRUE(has_trivial_destructor<F>::value);
|
| +}
|
| +
|
| +// Tests remove_pointer.
|
| +TEST(TypeTraitsTest, TestRemovePointer) {
|
| + COMPILE_ASSERT_TYPES_EQ(int, remove_pointer<int>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(int, remove_pointer<int*>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(const int, remove_pointer<const int*>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(int, remove_pointer<int* const>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(int, remove_pointer<int* volatile>::type);
|
| +}
|
| +
|
| +TEST(TypeTraitsTest, TestRemoveConst) {
|
| + COMPILE_ASSERT_TYPES_EQ(int, remove_const<int>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(int, remove_const<const int>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(int *, remove_const<int * const>::type);
|
| + // TR1 examples.
|
| + COMPILE_ASSERT_TYPES_EQ(const int *, remove_const<const int *>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(volatile int,
|
| + remove_const<const volatile int>::type);
|
| +}
|
| +
|
| +TEST(TypeTraitsTest, TestRemoveVolatile) {
|
| + COMPILE_ASSERT_TYPES_EQ(int, remove_volatile<int>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(int, remove_volatile<volatile int>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(int *, remove_volatile<int * volatile>::type);
|
| + // TR1 examples.
|
| + COMPILE_ASSERT_TYPES_EQ(volatile int *,
|
| + remove_volatile<volatile int *>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(const int,
|
| + remove_volatile<const volatile int>::type);
|
| +}
|
| +
|
| +TEST(TypeTraitsTest, TestRemoveCV) {
|
| + COMPILE_ASSERT_TYPES_EQ(int, remove_cv<int>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(int, remove_cv<volatile int>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(int, remove_cv<const int>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(int *, remove_cv<int * const volatile>::type);
|
| + // TR1 examples.
|
| + COMPILE_ASSERT_TYPES_EQ(const volatile int *,
|
| + remove_cv<const volatile int *>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(int,
|
| + remove_cv<const volatile int>::type);
|
| +}
|
| +
|
| +TEST(TypeTraitsTest, TestRemoveReference) {
|
| + COMPILE_ASSERT_TYPES_EQ(int, remove_reference<int>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(int, remove_reference<int&>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(const int, remove_reference<const int&>::type);
|
| + COMPILE_ASSERT_TYPES_EQ(int*, remove_reference<int * &>::type);
|
| +}
|
| +
|
| +TEST(TypeTraitsTest, TestIsSame) {
|
| + EXPECT_TRUE((is_same<int32, int32>::value));
|
| + EXPECT_FALSE((is_same<int32, int64>::value));
|
| + EXPECT_FALSE((is_same<int64, int32>::value));
|
| + EXPECT_FALSE((is_same<int, const int>::value));
|
| +
|
| + EXPECT_TRUE((is_same<void, void>::value));
|
| + EXPECT_FALSE((is_same<void, int>::value));
|
| + EXPECT_FALSE((is_same<int, void>::value));
|
| +
|
| + EXPECT_TRUE((is_same<int*, int*>::value));
|
| + EXPECT_TRUE((is_same<void*, void*>::value));
|
| + EXPECT_FALSE((is_same<int*, void*>::value));
|
| + EXPECT_FALSE((is_same<void*, int*>::value));
|
| + EXPECT_FALSE((is_same<void*, const void*>::value));
|
| + EXPECT_FALSE((is_same<void*, void* const>::value));
|
| +
|
| + EXPECT_TRUE((is_same<Base*, Base*>::value));
|
| + EXPECT_TRUE((is_same<Derived*, Derived*>::value));
|
| + EXPECT_FALSE((is_same<Base*, Derived*>::value));
|
| + EXPECT_FALSE((is_same<Derived*, Base*>::value));
|
| +}
|
| +
|
| +TEST(TypeTraitsTest, TestConvertible) {
|
| +#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3)
|
| + EXPECT_TRUE((is_convertible<int, int>::value));
|
| + EXPECT_TRUE((is_convertible<int, long>::value));
|
| + EXPECT_TRUE((is_convertible<long, int>::value));
|
| +
|
| + EXPECT_TRUE((is_convertible<int*, void*>::value));
|
| + EXPECT_FALSE((is_convertible<void*, int*>::value));
|
| +
|
| + EXPECT_TRUE((is_convertible<Derived*, Base*>::value));
|
| + EXPECT_FALSE((is_convertible<Base*, Derived*>::value));
|
| + EXPECT_TRUE((is_convertible<Derived*, const Base*>::value));
|
| + EXPECT_FALSE((is_convertible<const Derived*, Base*>::value));
|
| +#endif
|
| +}
|
| +
|
| +} // anonymous namespace
|
| +} // namespace protobuf
|
| +} // namespace google
|
|
|
| Property changes on: third_party/protobuf/src/google/protobuf/stubs/type_traits_unittest.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|