// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/template_util.h" #include #include "testing/gtest/include/gtest/gtest.h" namespace base { namespace { enum SimpleEnum { SIMPLE_ENUM }; enum EnumWithExplicitType : uint64_t { ENUM_WITH_EXPLICIT_TYPE }; enum class ScopedEnum { SCOPED_ENUM }; enum class ScopedEnumWithOperator { SCOPED_ENUM_WITH_OPERATOR }; std::ostream& operator<<(std::ostream& os, ScopedEnumWithOperator v) { return os; } struct SimpleStruct {}; struct StructWithOperator {}; std::ostream& operator<<(std::ostream& os, const StructWithOperator& v) { return os; } // is_non_const_reference static_assert(!is_non_const_reference::value, "IsNonConstReference"); static_assert(!is_non_const_reference::value, "IsNonConstReference"); static_assert(is_non_const_reference::value, "IsNonConstReference"); // A few standard types that definitely support printing. static_assert(internal::SupportsOstreamOperator::value, "ints should be printable"); static_assert(internal::SupportsOstreamOperator::value, "C strings should be printable"); static_assert(internal::SupportsOstreamOperator::value, "std::string should be printable"); // Various kinds of enums operator<< support. static_assert(internal::SupportsOstreamOperator::value, "simple enum should be printable by value"); static_assert(internal::SupportsOstreamOperator::value, "simple enum should be printable by const ref"); static_assert(internal::SupportsOstreamOperator::value, "enum with explicit type should be printable by value"); static_assert( internal::SupportsOstreamOperator::value, "enum with explicit type should be printable by const ref"); static_assert(!internal::SupportsOstreamOperator::value, "scoped enum should not be printable by value"); static_assert(!internal::SupportsOstreamOperator::value, "simple enum should not be printable by const ref"); static_assert(internal::SupportsOstreamOperator::value, "scoped enum with operator<< should be printable by value"); static_assert( internal::SupportsOstreamOperator::value, "scoped enum with operator<< should be printable by const ref"); // operator<< support on structs. static_assert(!internal::SupportsOstreamOperator::value, "simple struct should not be printable by value"); static_assert(!internal::SupportsOstreamOperator::value, "simple struct should not be printable by const ref"); static_assert(internal::SupportsOstreamOperator::value, "struct with operator<< should be printable by value"); static_assert( internal::SupportsOstreamOperator::value, "struct with operator<< should be printable by const ref"); // underlying type of enums static_assert(std::is_integral::type>::value, "simple enum must have some integral type"); static_assert( std::is_same::type, uint64_t>::value, "explicit type must be detected"); static_assert(std::is_same::type, int>::value, "scoped enum defaults to int"); struct TriviallyDestructible { int field; }; class NonTriviallyDestructible { ~NonTriviallyDestructible() {} }; static_assert(is_trivially_destructible::value, "IsTriviallyDestructible"); static_assert(is_trivially_destructible::value, "IsTriviallyDestructible"); static_assert(!is_trivially_destructible::value, "IsTriviallyDestructible"); } // namespace } // namespace base