template_util_unittest.cc revision 674f0eb973b8ebf08f9abcb45b2271dc510aa2cf
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/template_util.h"
6
7#include <gtest/gtest.h>
8
9
10namespace base {
11namespace {
12
13struct AStruct {};
14class AClass {};
15enum AnEnum {};
16
17class Parent {};
18class Child : public Parent {};
19
20using std::is_pointer;
21using std::is_array;
22using std::is_convertible;
23using std::is_same;
24using std::is_class;
25using std::is_member_function_pointer;
26
27// is_pointer<Type>
28static_assert(!is_pointer<int>::value, "IsPointer");
29static_assert(!is_pointer<int&>::value, "IsPointer");
30static_assert(is_pointer<int*>::value, "IsPointer");
31static_assert(is_pointer<const int*>::value, "IsPointer");
32
33// is_array<Type>
34static_assert(!is_array<int>::value, "IsArray");
35static_assert(!is_array<int*>::value, "IsArray");
36static_assert(!is_array<int (*)[3]>::value, "IsArray");
37static_assert(is_array<int[]>::value, "IsArray");
38static_assert(is_array<const int[]>::value, "IsArray");
39static_assert(is_array<int[3]>::value, "IsArray");
40
41// is_non_const_reference<Type>
42static_assert(!is_non_const_reference<int>::value, "IsNonConstReference");
43static_assert(!is_non_const_reference<const int&>::value,
44              "IsNonConstReference");
45static_assert(is_non_const_reference<int&>::value, "IsNonConstReference");
46
47// is_convertible<From, To>
48
49// Extra parens needed to make preprocessor macro parsing happy. Otherwise,
50// it sees the equivalent of:
51//
52//     (is_convertible < Child), (Parent > ::value)
53//
54// Silly C++.
55static_assert((is_convertible<Child, Parent>::value), "IsConvertible");
56static_assert(!(is_convertible<Parent, Child>::value), "IsConvertible");
57static_assert(!(is_convertible<Parent, AStruct>::value), "IsConvertible");
58static_assert((is_convertible<int, double>::value), "IsConvertible");
59static_assert((is_convertible<int*, void*>::value), "IsConvertible");
60static_assert(!(is_convertible<void*, int*>::value), "IsConvertible");
61
62// Array types are an easy corner case.  Make sure to test that
63// it does indeed compile.
64static_assert(!(is_convertible<int[10], double>::value), "IsConvertible");
65static_assert(!(is_convertible<double, int[10]>::value), "IsConvertible");
66static_assert((is_convertible<int[10], int*>::value), "IsConvertible");
67
68// is_same<Type1, Type2>
69static_assert(!(is_same<Child, Parent>::value), "IsSame");
70static_assert(!(is_same<Parent, Child>::value), "IsSame");
71static_assert((is_same<Parent, Parent>::value), "IsSame");
72static_assert((is_same<int*, int*>::value), "IsSame");
73static_assert((is_same<int, int>::value), "IsSame");
74static_assert((is_same<void, void>::value), "IsSame");
75static_assert(!(is_same<int, double>::value), "IsSame");
76
77// is_class<Type>
78static_assert(is_class<AStruct>::value, "IsClass");
79static_assert(is_class<AClass>::value, "IsClass");
80static_assert(!is_class<AnEnum>::value, "IsClass");
81static_assert(!is_class<int>::value, "IsClass");
82static_assert(!is_class<char*>::value, "IsClass");
83static_assert(!is_class<int&>::value, "IsClass");
84static_assert(!is_class<char[3]>::value, "IsClass");
85
86static_assert(!is_member_function_pointer<int>::value,
87              "IsMemberFunctionPointer");
88static_assert(!is_member_function_pointer<int*>::value,
89              "IsMemberFunctionPointer");
90static_assert(!is_member_function_pointer<void*>::value,
91              "IsMemberFunctionPointer");
92static_assert(!is_member_function_pointer<AStruct>::value,
93              "IsMemberFunctionPointer");
94static_assert(!is_member_function_pointer<AStruct*>::value,
95              "IsMemberFunctionPointer");
96static_assert(!is_member_function_pointer<void (*)()>::value,
97              "IsMemberFunctionPointer");
98static_assert(!is_member_function_pointer<int (*)(int)>::value,
99              "IsMemberFunctionPointer");
100static_assert(!is_member_function_pointer<int (*)(int, int)>::value,
101              "IsMemberFunctionPointer");
102
103static_assert(is_member_function_pointer<void (AStruct::*)()>::value,
104              "IsMemberFunctionPointer");
105static_assert(is_member_function_pointer<void (AStruct::*)(int)>::value,
106              "IsMemberFunctionPointer");
107static_assert(is_member_function_pointer<int (AStruct::*)(int)>::value,
108              "IsMemberFunctionPointer");
109static_assert(is_member_function_pointer<int (AStruct::*)(int) const>::value,
110              "IsMemberFunctionPointer");
111static_assert(is_member_function_pointer<int (AStruct::*)(int, int)>::value,
112              "IsMemberFunctionPointer");
113
114}  // namespace
115}  // namespace base
116