diff --git a/doc/conjunction.qbk b/doc/conjunction.qbk new file mode 100644 index 0000000..668ec3f --- /dev/null +++ b/doc/conjunction.qbk @@ -0,0 +1,36 @@ +[/ +Copyright 2020 Glen Joseph Fernandes +(glenjofe@gmail.com) + +Distributed under the Boost Software License, +Version 1.0. (See accompanying file LICENSE_1_0.txt +or copy at http://www.boost.org/LICENSE_1_0.txt). +] + +[section:conjunction conjunction] + + template + struct conjunction; + +__inherit Inherits from the first type `U` in the list for which +`bool(U::value)` is `false`, or the last type in the list if there is no such +type. If `sizeof...(T)` is `0` then inherits from `__true_type`. + +__header `#include ` + +[all_compilers] In the absence of variadic-template support, `conjunction` has +only 2 parameters. + +__examples + +[:Given: `template struct Int { static const int value = N };` ] + +[:`conjunction<>` inherits from `__true_type`.] + +[:`conjunction >` inherits from `Int<1>`.] + +[:`conjunction, Int<2>, Int<3> >` inherits from `Int<3>`.] + +[:`conjunction, Int<0>, Int<3> >` inherits from `Int<0>`.] + +[endsect] diff --git a/doc/disjunction.qbk b/doc/disjunction.qbk new file mode 100644 index 0000000..bbaf7a1 --- /dev/null +++ b/doc/disjunction.qbk @@ -0,0 +1,36 @@ +[/ +Copyright 2020 Glen Joseph Fernandes +(glenjofe@gmail.com) + +Distributed under the Boost Software License, +Version 1.0. (See accompanying file LICENSE_1_0.txt +or copy at http://www.boost.org/LICENSE_1_0.txt). +] + +[section:disjunction disjunction] + + template + struct disjunction; + +__inherit Inherits from the first type `U` in the list for which +`bool(U::value)` is `true`, or the last type in the list if there is no such +type. If `sizeof...(T)` is `0` then inherits from `__false_type`. + +__header `#include ` + +[all_compilers] In the absence of variadic-template support, `disjunction` has +only 2 parameters. + +__examples + +[:Given: `template struct Int { static const int value = N };` ] + +[:`disjunction<>` inherits from `__false_type`.] + +[:`disjunction >` inherits from `Int<1>`.] + +[:`disjunction, Int<2>, Int<3> >` inherits from `Int<1>`.] + +[:`disjunction, Int<2>, Int<3> >` inherits from `Int<2>`.] + +[endsect] diff --git a/doc/negation.qbk b/doc/negation.qbk new file mode 100644 index 0000000..0bf5501 --- /dev/null +++ b/doc/negation.qbk @@ -0,0 +1,35 @@ +[/ +Copyright 2020 Glen Joseph Fernandes +(glenjofe@gmail.com) + +Distributed under the Boost Software License, +Version 1.0. (See accompanying file LICENSE_1_0.txt +or copy at http://www.boost.org/LICENSE_1_0.txt). +] + +[section:negation negation] + + template + struct negation + : public __integral_constant { }; + +__inherit Inherits from `__integral_constant`. + +__header `#include ` + +[all_compilers] + +__examples + +[:`negation<__true_type>` inherits from `__false_type`.] + +[:`negation<__false_type>` inherits from `__true_type`.] + +[:`negation<__integral_constant >::type` is the type `__false_type`.] + +[:`negation<__integral_constant >::value` is an integral constant +expression that evaluates to /true/.] + +[:`negation::value_type` is the type `bool`.] + +[endsect] diff --git a/doc/type_traits.qbk b/doc/type_traits.qbk index ce3f1d4..b67ed55 100644 --- a/doc/type_traits.qbk +++ b/doc/type_traits.qbk @@ -129,6 +129,9 @@ [def __add_cv [link boost_typetraits.reference.add_cv add_cv]] [def __common_type [link boost_typetraits.reference.common_type common_type]] [def __conditional [link boost_typetraits.reference.conditional conditional]] +[def __conjunction [link boost_typetraits.reference.conjunction conjunction]] +[def __disjunction [link boost_typetraits.reference.disjunction disjunction]] +[def __negation [link boost_typetraits.reference.negation negation]] [def __type_with_alignment [link boost_typetraits.reference.type_with_alignment type_with_alignment]] [def __aligned_storage [link boost_typetraits.reference.aligned_storage aligned_storage]] @@ -307,6 +310,7 @@ that is the result of the transformation. [include aligned_storage.qbk] [include alignment_of.qbk] [include conditional.qbk] +[include conjunction.qbk] [include common_type.qbk] [include copy_cv.qbk] [include copy_cv_ref.qbk] @@ -315,6 +319,7 @@ that is the result of the transformation. [include declval.qbk] [include detected.qbk] [include detected_or.qbk] +[include disjunction.qbk] [include enable_if.qbk] [include extent.qbk] [include floating_point_promotion.qbk] @@ -441,6 +446,7 @@ See __has_trivial_constructor. [include make_signed.qbk] [include make_unsigned.qbk] [include make_void.qbk] +[include negation.qbk] [include nonesuch.qbk] [include promote.qbk] diff --git a/include/boost/type_traits.hpp b/include/boost/type_traits.hpp index 8e55bc5..052cf00 100644 --- a/include/boost/type_traits.hpp +++ b/include/boost/type_traits.hpp @@ -21,11 +21,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -136,6 +138,7 @@ #include #include #include +#include #include #include #include diff --git a/include/boost/type_traits/conjunction.hpp b/include/boost/type_traits/conjunction.hpp new file mode 100644 index 0000000..aa5440b --- /dev/null +++ b/include/boost/type_traits/conjunction.hpp @@ -0,0 +1,40 @@ +/* +Copyright 2020 Glen Joseph Fernandes +(glenjofe@gmail.com) + +Distributed under the Boost Software License, +Version 1.0. (See accompanying file LICENSE_1_0.txt +or copy at http://www.boost.org/LICENSE_1_0.txt) +*/ + +#ifndef BOOST_TT_CONJUNCTION_HPP_INCLUDED +#define BOOST_TT_CONJUNCTION_HPP_INCLUDED + +#include +#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) +#include +#endif + +namespace boost { + +#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) +template +struct conjunction + : true_type { }; + +template +struct conjunction + : T { }; + +template +struct conjunction + : conditional, T>::type { }; +#else +template +struct conjunction + : conditional::type { }; +#endif + +} /* boost */ + +#endif diff --git a/include/boost/type_traits/disjunction.hpp b/include/boost/type_traits/disjunction.hpp new file mode 100644 index 0000000..dd06991 --- /dev/null +++ b/include/boost/type_traits/disjunction.hpp @@ -0,0 +1,40 @@ +/* +Copyright 2020 Glen Joseph Fernandes +(glenjofe@gmail.com) + +Distributed under the Boost Software License, +Version 1.0. (See accompanying file LICENSE_1_0.txt +or copy at http://www.boost.org/LICENSE_1_0.txt) +*/ + +#ifndef BOOST_TT_DISJUNCTION_HPP_INCLUDED +#define BOOST_TT_DISJUNCTION_HPP_INCLUDED + +#include +#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) +#include +#endif + +namespace boost { + +#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) +template +struct disjunction + : false_type { }; + +template +struct disjunction + : T { }; + +template +struct disjunction + : conditional >::type { }; +#else +template +struct disjunction + : conditional::type { }; +#endif + +} /* boost */ + +#endif diff --git a/include/boost/type_traits/negation.hpp b/include/boost/type_traits/negation.hpp new file mode 100644 index 0000000..939e7a7 --- /dev/null +++ b/include/boost/type_traits/negation.hpp @@ -0,0 +1,23 @@ +/* +Copyright 2020 Glen Joseph Fernandes +(glenjofe@gmail.com) + +Distributed under the Boost Software License, +Version 1.0. (See accompanying file LICENSE_1_0.txt +or copy at http://www.boost.org/LICENSE_1_0.txt) +*/ + +#ifndef BOOST_TT_NEGATION_HPP_INCLUDED +#define BOOST_TT_NEGATION_HPP_INCLUDED + +#include + +namespace boost { + +template +struct negation + : integral_constant { }; + +} /* boost */ + +#endif diff --git a/test/conjunction_test.cpp b/test/conjunction_test.cpp new file mode 100644 index 0000000..246f1c6 --- /dev/null +++ b/test/conjunction_test.cpp @@ -0,0 +1,35 @@ +/* +Copyright 2020 Glen Joseph Fernandes +(glenjofe@gmail.com) + +Distributed under the Boost Software License, +Version 1.0. (See accompanying file LICENSE_1_0.txt +or copy at http://www.boost.org/LICENSE_1_0.txt) +*/ +#ifdef TEST_STD +#include +#else +#include +#endif +#include "check_integral_constant.hpp" + +template +struct Int { + static const int value = V; +}; + +TT_TEST_BEGIN(conjunction) + +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::conjunction, Int<4> >::value), 4); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::conjunction, Int<4> >::value), 0); + +#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::conjunction, Int<4>, Int<6>, + Int<8>, Int<10> >::value), 10); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::conjunction, Int<0>, Int<4>, + Int<6>, Int<8> >::value), 0); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::conjunction >::value, 4); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::conjunction<>::value, true); +#endif + +TT_TEST_END diff --git a/test/disjunction_test.cpp b/test/disjunction_test.cpp new file mode 100644 index 0000000..56b3416 --- /dev/null +++ b/test/disjunction_test.cpp @@ -0,0 +1,35 @@ +/* +Copyright 2020 Glen Joseph Fernandes +(glenjofe@gmail.com) + +Distributed under the Boost Software License, +Version 1.0. (See accompanying file LICENSE_1_0.txt +or copy at http://www.boost.org/LICENSE_1_0.txt) +*/ +#ifdef TEST_STD +#include +#else +#include +#endif +#include "check_integral_constant.hpp" + +template +struct Int { + static const int value = V; +}; + +TT_TEST_BEGIN(disjunction) + +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::disjunction, Int<4> >::value), 2); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::disjunction, Int<4> >::value), 4); + +#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::disjunction, Int<4>, Int<6>, + Int<8>, Int<10> >::value), 2); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::disjunction, Int<0>, Int<6>, + Int<0>, Int<0> >::value), 6); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::disjunction >::value, 4); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::disjunction<>::value, false); +#endif + +TT_TEST_END diff --git a/test/negation_test.cpp b/test/negation_test.cpp new file mode 100644 index 0000000..604b7fe --- /dev/null +++ b/test/negation_test.cpp @@ -0,0 +1,26 @@ +/* +Copyright 2020 Glen Joseph Fernandes +(glenjofe@gmail.com) + +Distributed under the Boost Software License, +Version 1.0. (See accompanying file LICENSE_1_0.txt +or copy at http://www.boost.org/LICENSE_1_0.txt) +*/ +#ifdef TEST_STD +#include +#else +#include +#endif +#include "check_integral_constant.hpp" + +template +struct Int { + static const int value = V; +}; + +TT_TEST_BEGIN(negation) + +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::negation >::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::negation >::value, true); + +TT_TEST_END