brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.2 KiB · 725eb5b Raw
95 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++1410// type_traits11 12// template<class... B> struct conjunction;                           // C++1713// template<class... B>14//   constexpr bool conjunction_v = conjunction<B...>::value;         // C++1715 16#include <cassert>17#include <type_traits>18 19#include "test_macros.h"20 21struct True  { static constexpr bool value = true; };22struct False { static constexpr bool value = false; };23 24struct MySpecialTrueType { static constexpr auto value = true; static constexpr auto MySpecial = 23; };25struct MyOtherSpecialTrueType { static constexpr auto value = -1; static constexpr auto MySpecial = 46; };26struct MySpecialFalseType { static constexpr auto value = false; static constexpr auto MySpecial = 37; };27struct HasNoValue {};28struct ExplicitlyConvertibleToBool { explicit constexpr operator bool() const { return true; } };29struct ValueExplicitlyConvertible { static constexpr ExplicitlyConvertibleToBool value {}; };30 31static_assert( std::conjunction<>::value);32static_assert( std::conjunction<std::true_type >::value);33static_assert(!std::conjunction<std::false_type>::value);34 35static_assert( std::conjunction_v<>);36static_assert( std::conjunction_v<std::true_type >);37static_assert(!std::conjunction_v<std::false_type>);38 39static_assert( std::conjunction<std::true_type,  std::true_type >::value);40static_assert(!std::conjunction<std::true_type,  std::false_type>::value);41static_assert(!std::conjunction<std::false_type, std::true_type >::value);42static_assert(!std::conjunction<std::false_type, std::false_type>::value);43 44static_assert( std::conjunction_v<std::true_type,  std::true_type >);45static_assert(!std::conjunction_v<std::true_type,  std::false_type>);46static_assert(!std::conjunction_v<std::false_type, std::true_type >);47static_assert(!std::conjunction_v<std::false_type, std::false_type>);48 49static_assert( std::conjunction<std::true_type,  std::true_type,  std::true_type >::value);50static_assert(!std::conjunction<std::true_type,  std::false_type, std::true_type >::value);51static_assert(!std::conjunction<std::false_type, std::true_type,  std::true_type >::value);52static_assert(!std::conjunction<std::false_type, std::false_type, std::true_type >::value);53static_assert(!std::conjunction<std::true_type,  std::true_type,  std::false_type>::value);54static_assert(!std::conjunction<std::true_type,  std::false_type, std::false_type>::value);55static_assert(!std::conjunction<std::false_type, std::true_type,  std::false_type>::value);56static_assert(!std::conjunction<std::false_type, std::false_type, std::false_type>::value);57 58static_assert( std::conjunction_v<std::true_type,  std::true_type,  std::true_type >);59static_assert(!std::conjunction_v<std::true_type,  std::false_type, std::true_type >);60static_assert(!std::conjunction_v<std::false_type, std::true_type,  std::true_type >);61static_assert(!std::conjunction_v<std::false_type, std::false_type, std::true_type >);62static_assert(!std::conjunction_v<std::true_type,  std::true_type,  std::false_type>);63static_assert(!std::conjunction_v<std::true_type,  std::false_type, std::false_type>);64static_assert(!std::conjunction_v<std::false_type, std::true_type,  std::false_type>);65static_assert(!std::conjunction_v<std::false_type, std::false_type, std::false_type>);66 67static_assert( std::conjunction<True >::value);68static_assert(!std::conjunction<False>::value);69 70static_assert( std::conjunction_v<True >);71static_assert(!std::conjunction_v<False>);72 73static_assert(std::is_base_of_v<MySpecialTrueType, std::conjunction<MyOtherSpecialTrueType, MySpecialTrueType>>);74static_assert(std::is_base_of_v<MyOtherSpecialTrueType, std::conjunction<MySpecialTrueType, MyOtherSpecialTrueType>>);75static_assert(std::is_base_of_v<MySpecialFalseType, std::conjunction<MySpecialFalseType, MyOtherSpecialTrueType>>);76static_assert(std::is_base_of_v<MySpecialFalseType, std::conjunction<MyOtherSpecialTrueType, MySpecialFalseType>>);77 78static_assert(std::is_base_of_v<std::false_type, std::conjunction<std::false_type, HasNoValue>>);79 80static_assert(!std::conjunction<std::false_type, HasNoValue>::value);81static_assert(!std::conjunction_v<std::false_type, HasNoValue>);82 83// Also check the case where HasNoValue is not the last in the list (https://llvm.org/PR584900).84static_assert(!std::conjunction<std::false_type, HasNoValue, std::true_type>::value);85static_assert(!std::conjunction_v<std::false_type, HasNoValue, std::true_type>);86 87static_assert(!std::conjunction<std::false_type, HasNoValue, std::false_type>::value);88static_assert(!std::conjunction_v<std::false_type, HasNoValue, std::false_type>);89 90static_assert(std::conjunction<MyOtherSpecialTrueType>::value == -1);91static_assert(std::conjunction_v<MyOtherSpecialTrueType>);92 93static_assert(std::is_base_of_v<ValueExplicitlyConvertible, std::conjunction<ValueExplicitlyConvertible>>);94static_assert(std::conjunction_v<ValueExplicitlyConvertible, std::true_type>);95