diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 18:45:59 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 18:45:59 +0000 |
commit | 19fcec84d8d7d21e796c7624e521b60d28ee21ed (patch) | |
tree | 42d26aa27d1e3f7c0b8bd3fd14e7d7082f5008dc /src/boost/libs/config/test/boost_no_is_abstract.ipp | |
parent | Initial commit. (diff) | |
download | ceph-upstream/16.2.11+ds.tar.xz ceph-upstream/16.2.11+ds.zip |
Adding upstream version 16.2.11+ds.upstream/16.2.11+dsupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boost/libs/config/test/boost_no_is_abstract.ipp')
-rw-r--r-- | src/boost/libs/config/test/boost_no_is_abstract.ipp | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/boost/libs/config/test/boost_no_is_abstract.ipp b/src/boost/libs/config/test/boost_no_is_abstract.ipp new file mode 100644 index 000000000..257318eef --- /dev/null +++ b/src/boost/libs/config/test/boost_no_is_abstract.ipp @@ -0,0 +1,53 @@ +// (C) Copyright John Maddock and Dave Abrahams 2002. +// Use, modification and distribution are subject to 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) + +// See http://www.boost.org/libs/config for most recent version. + +// MACRO: BOOST_NO_IS_ABSTRACT +// TITLE: is_abstract implementation technique +// DESCRIPTION: Some compilers can't handle the code used for is_abstract even if they support SFINAE. + + +namespace boost_no_is_abstract{ + +#if defined(__CODEGEARC__) +template<class T> +struct is_abstract_test +{ + enum{ value = __is_abstract(T) }; +}; +#else +template<class T> +struct is_abstract_test +{ + // Deduction fails if T is void, function type, + // reference type (14.8.2/2)or an abstract class type + // according to review status issue #337 + // + template<class U> + static double check_sig(U (*)[1]); + template<class U> + static char check_sig(...); + +#ifdef __GNUC__ + enum{ s1 = sizeof(is_abstract_test<T>::template check_sig<T>(0)) }; +#else + enum{ s1 = sizeof(check_sig<T>(0)) }; +#endif + + enum{ value = (s1 == sizeof(char)) }; +}; +#endif + +struct non_abstract{}; +struct abstract{ virtual void foo() = 0; }; + +int test() +{ + return static_cast<bool>(is_abstract_test<non_abstract>::value) == static_cast<bool>(is_abstract_test<abstract>::value); +} + +} + |