blob: 32883f2d8869360310c099530830e8523cb0f55b [file] [log] [blame]
gavinp@chromium.org1da28fc2012-06-20 03:34:08 +09001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
ajwong@chromium.orge2cca632011-02-15 10:27:38 +09002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/template_util.h"
gavinp@chromium.org1da28fc2012-06-20 03:34:08 +09006
7#include "base/basictypes.h"
ajwong@chromium.orge2cca632011-02-15 10:27:38 +09008#include "testing/gtest/include/gtest/gtest.h"
9
10namespace base {
11namespace {
12
13struct AStruct {};
14class AClass {};
15enum AnEnum {};
16
17class Parent {};
18class Child : public Parent {};
19
gavinp@chromium.org1da28fc2012-06-20 03:34:08 +090020// is_pointer<Type>
avi486c61f2015-11-24 23:26:24 +090021static_assert(!is_pointer<int>::value, "IsPointer");
22static_assert(!is_pointer<int&>::value, "IsPointer");
23static_assert(is_pointer<int*>::value, "IsPointer");
24static_assert(is_pointer<const int*>::value, "IsPointer");
ajwong@chromium.orge2cca632011-02-15 10:27:38 +090025
gavinp@chromium.org1da28fc2012-06-20 03:34:08 +090026// is_array<Type>
avi486c61f2015-11-24 23:26:24 +090027static_assert(!is_array<int>::value, "IsArray");
28static_assert(!is_array<int*>::value, "IsArray");
29static_assert(!is_array<int (*)[3]>::value, "IsArray");
30static_assert(is_array<int[]>::value, "IsArray");
31static_assert(is_array<const int[]>::value, "IsArray");
32static_assert(is_array<int[3]>::value, "IsArray");
ajwong@chromium.orge2cca632011-02-15 10:27:38 +090033
gavinp@chromium.org1da28fc2012-06-20 03:34:08 +090034// is_non_const_reference<Type>
avi486c61f2015-11-24 23:26:24 +090035static_assert(!is_non_const_reference<int>::value, "IsNonConstReference");
36static_assert(!is_non_const_reference<const int&>::value,
37 "IsNonConstReference");
38static_assert(is_non_const_reference<int&>::value, "IsNonConstReference");
ajwong@chromium.orge2cca632011-02-15 10:27:38 +090039
gavinp@chromium.org1da28fc2012-06-20 03:34:08 +090040// is_convertible<From, To>
ajwong@chromium.orgd5f61112011-02-17 07:37:58 +090041
gavinp@chromium.org1da28fc2012-06-20 03:34:08 +090042// Extra parens needed to make preprocessor macro parsing happy. Otherwise,
43// it sees the equivalent of:
44//
45// (is_convertible < Child), (Parent > ::value)
46//
47// Silly C++.
avi486c61f2015-11-24 23:26:24 +090048static_assert((is_convertible<Child, Parent>::value), "IsConvertible");
49static_assert(!(is_convertible<Parent, Child>::value), "IsConvertible");
50static_assert(!(is_convertible<Parent, AStruct>::value), "IsConvertible");
51static_assert((is_convertible<int, double>::value), "IsConvertible");
52static_assert((is_convertible<int*, void*>::value), "IsConvertible");
53static_assert(!(is_convertible<void*, int*>::value), "IsConvertible");
ajwong@chromium.orgc9c79af2011-11-22 04:23:44 +090054
gavinp@chromium.org1da28fc2012-06-20 03:34:08 +090055// Array types are an easy corner case. Make sure to test that
56// it does indeed compile.
avi486c61f2015-11-24 23:26:24 +090057static_assert(!(is_convertible<int[10], double>::value), "IsConvertible");
58static_assert(!(is_convertible<double, int[10]>::value), "IsConvertible");
59static_assert((is_convertible<int[10], int*>::value), "IsConvertible");
ajwong@chromium.orge2cca632011-02-15 10:27:38 +090060
gavinp@chromium.org1da28fc2012-06-20 03:34:08 +090061// is_same<Type1, Type2>
avi486c61f2015-11-24 23:26:24 +090062static_assert(!(is_same<Child, Parent>::value), "IsSame");
63static_assert(!(is_same<Parent, Child>::value), "IsSame");
64static_assert((is_same<Parent, Parent>::value), "IsSame");
65static_assert((is_same<int*, int*>::value), "IsSame");
66static_assert((is_same<int, int>::value), "IsSame");
67static_assert((is_same<void, void>::value), "IsSame");
68static_assert(!(is_same<int, double>::value), "IsSame");
ajwong@chromium.orgec1750a2011-06-27 01:22:50 +090069
gavinp@chromium.org1da28fc2012-06-20 03:34:08 +090070// is_class<Type>
avi486c61f2015-11-24 23:26:24 +090071static_assert(is_class<AStruct>::value, "IsClass");
72static_assert(is_class<AClass>::value, "IsClass");
73static_assert(!is_class<AnEnum>::value, "IsClass");
74static_assert(!is_class<int>::value, "IsClass");
75static_assert(!is_class<char*>::value, "IsClass");
76static_assert(!is_class<int&>::value, "IsClass");
77static_assert(!is_class<char[3]>::value, "IsClass");
ajwong@chromium.orge2cca632011-02-15 10:27:38 +090078
avi486c61f2015-11-24 23:26:24 +090079static_assert(!is_member_function_pointer<int>::value,
80 "IsMemberFunctionPointer");
81static_assert(!is_member_function_pointer<int*>::value,
82 "IsMemberFunctionPointer");
83static_assert(!is_member_function_pointer<void*>::value,
84 "IsMemberFunctionPointer");
85static_assert(!is_member_function_pointer<AStruct>::value,
86 "IsMemberFunctionPointer");
87static_assert(!is_member_function_pointer<AStruct*>::value,
88 "IsMemberFunctionPointer");
89static_assert(!is_member_function_pointer<void (*)()>::value,
90 "IsMemberFunctionPointer");
91static_assert(!is_member_function_pointer<int (*)(int)>::value,
92 "IsMemberFunctionPointer");
93static_assert(!is_member_function_pointer<int (*)(int, int)>::value,
94 "IsMemberFunctionPointer");
aa@chromium.orgd05701e2013-12-06 15:55:25 +090095
avi486c61f2015-11-24 23:26:24 +090096static_assert(is_member_function_pointer<void (AStruct::*)()>::value,
97 "IsMemberFunctionPointer");
98static_assert(is_member_function_pointer<void (AStruct::*)(int)>::value,
99 "IsMemberFunctionPointer");
100static_assert(is_member_function_pointer<int (AStruct::*)(int)>::value,
101 "IsMemberFunctionPointer");
102static_assert(is_member_function_pointer<int (AStruct::*)(int) const>::value,
103 "IsMemberFunctionPointer");
104static_assert(is_member_function_pointer<int (AStruct::*)(int, int)>::value,
105 "IsMemberFunctionPointer");
aa@chromium.orgd05701e2013-12-06 15:55:25 +0900106
ajwong@chromium.orge2cca632011-02-15 10:27:38 +0900107} // namespace
108} // namespace base