mirror of
https://github.com/boostorg/detail.git
synced 2025-12-20 14:02:39 +01:00
Compare commits
10 Commits
boost-1.87
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
08d3386bf4 | ||
|
|
43238b75ce | ||
|
|
8651f245fe | ||
|
|
5628638ade | ||
|
|
d3a556f694 | ||
|
|
d533b69b87 | ||
|
|
1a28d9d60f | ||
|
|
002caaa54f | ||
|
|
f7fdaf08a3 | ||
|
|
5b10a0b9b5 |
128
.github/workflows/ci.yml
vendored
128
.github/workflows/ci.yml
vendored
@@ -1,4 +1,4 @@
|
||||
# Copyright 2021-2024 Andrey Semashev
|
||||
# Copyright 2021-2025 Andrey Semashev
|
||||
#
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
||||
@@ -33,14 +33,6 @@ jobs:
|
||||
matrix:
|
||||
include:
|
||||
# Linux, gcc
|
||||
- toolset: gcc-4.6
|
||||
cxxstd: "0x"
|
||||
os: ubuntu-latest
|
||||
container: ubuntu:16.04
|
||||
install:
|
||||
- g++-4.6
|
||||
sources:
|
||||
- "ppa:ubuntu-toolchain-r/test"
|
||||
- toolset: gcc-4.7
|
||||
cxxstd: "11"
|
||||
os: ubuntu-latest
|
||||
@@ -85,12 +77,14 @@ jobs:
|
||||
- g++-8
|
||||
- toolset: gcc-9
|
||||
cxxstd: "11,14,17,2a"
|
||||
os: ubuntu-20.04
|
||||
os: ubuntu-latest
|
||||
container: ubuntu:20.04
|
||||
install:
|
||||
- g++-9
|
||||
- toolset: gcc-10
|
||||
cxxstd: "11,14,17,20"
|
||||
os: ubuntu-20.04
|
||||
os: ubuntu-latest
|
||||
container: ubuntu:20.04
|
||||
install:
|
||||
- g++-10
|
||||
- toolset: gcc-11
|
||||
@@ -105,18 +99,28 @@ jobs:
|
||||
- g++-12
|
||||
- toolset: gcc-13
|
||||
cxxstd: "11,14,17,20,23"
|
||||
os: ubuntu-latest
|
||||
container: ubuntu:23.04
|
||||
os: ubuntu-24.04
|
||||
install:
|
||||
- g++-13
|
||||
- toolset: gcc-14
|
||||
cxxstd: "11,14,17,20,23,26"
|
||||
os: ubuntu-24.04
|
||||
install:
|
||||
- g++-14
|
||||
- toolset: gcc-15
|
||||
cxxstd: "11,14,17,20,23,26"
|
||||
os: ubuntu-latest
|
||||
container: ubuntu:25.04
|
||||
install:
|
||||
- g++-15
|
||||
- name: UBSAN
|
||||
toolset: gcc-11
|
||||
toolset: gcc-13
|
||||
cxxstd: "11,14,17,20,23"
|
||||
ubsan: 1
|
||||
build_variant: debug
|
||||
os: ubuntu-22.04
|
||||
os: ubuntu-24.04
|
||||
install:
|
||||
- g++-11
|
||||
- g++-13
|
||||
|
||||
# Linux, clang
|
||||
- toolset: clang
|
||||
@@ -195,13 +199,15 @@ jobs:
|
||||
- toolset: clang
|
||||
compiler: clang++-9
|
||||
cxxstd: "11,14,17,2a"
|
||||
os: ubuntu-20.04
|
||||
os: ubuntu-latest
|
||||
container: ubuntu:20.04
|
||||
install:
|
||||
- clang-9
|
||||
- toolset: clang
|
||||
compiler: clang++-10
|
||||
cxxstd: "11,14,17,20"
|
||||
os: ubuntu-20.04
|
||||
os: ubuntu-latest
|
||||
container: ubuntu:20.04
|
||||
install:
|
||||
- clang-10
|
||||
- toolset: clang
|
||||
@@ -245,60 +251,70 @@ jobs:
|
||||
- toolset: clang
|
||||
compiler: clang++-16
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
os: ubuntu-22.04
|
||||
os: ubuntu-24.04
|
||||
install:
|
||||
- clang-16
|
||||
sources:
|
||||
- "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-16 main"
|
||||
source_keys:
|
||||
- "https://apt.llvm.org/llvm-snapshot.gpg.key"
|
||||
- g++-11
|
||||
gcc_toolchain: 11
|
||||
- toolset: clang
|
||||
compiler: clang++-17
|
||||
cxxstd: "11,14,17,20,23"
|
||||
os: ubuntu-22.04
|
||||
os: ubuntu-24.04
|
||||
install:
|
||||
- clang-17
|
||||
sources:
|
||||
- "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-17 main"
|
||||
source_keys:
|
||||
- "https://apt.llvm.org/llvm-snapshot.gpg.key"
|
||||
- g++-11
|
||||
gcc_toolchain: 11
|
||||
- toolset: clang
|
||||
compiler: clang++-17
|
||||
cxxstd: "11,14,17,20,23"
|
||||
os: ubuntu-22.04
|
||||
compiler: clang++-18
|
||||
cxxstd: "11,14,17,20,23,26"
|
||||
os: ubuntu-24.04
|
||||
install:
|
||||
- clang-17
|
||||
- libc++-17-dev
|
||||
- libc++abi-17-dev
|
||||
sources:
|
||||
- "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-17 main"
|
||||
source_keys:
|
||||
- "https://apt.llvm.org/llvm-snapshot.gpg.key"
|
||||
- clang-18
|
||||
- g++-13
|
||||
- toolset: clang
|
||||
compiler: clang++-19
|
||||
cxxstd: "11,14,17,20,23,26"
|
||||
os: ubuntu-24.04
|
||||
install:
|
||||
- clang-19
|
||||
- toolset: clang
|
||||
compiler: clang++-20
|
||||
cxxstd: "11,14,17,20,23,26"
|
||||
os: ubuntu-latest
|
||||
container: ubuntu:25.04
|
||||
install:
|
||||
- clang-20
|
||||
- toolset: clang
|
||||
compiler: clang++-20
|
||||
cxxstd: "11,14,17,20,23,26"
|
||||
cxxflags: -stdlib=libc++
|
||||
linkflags: -stdlib=libc++
|
||||
os: ubuntu-latest
|
||||
container: ubuntu:25.04
|
||||
install:
|
||||
- clang-20
|
||||
- libc++-20-dev
|
||||
- libc++abi-20-dev
|
||||
- name: UBSAN
|
||||
toolset: clang
|
||||
compiler: clang++-15
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
compiler: clang++-18
|
||||
cxxstd: "11,14,17,20,23,26"
|
||||
cxxflags: -stdlib=libc++
|
||||
linkflags: -stdlib=libc++
|
||||
ubsan: 1
|
||||
build_variant: debug
|
||||
os: ubuntu-22.04
|
||||
os: ubuntu-24.04
|
||||
install:
|
||||
- clang-15
|
||||
- libc++-15-dev
|
||||
- libc++abi-15-dev
|
||||
- clang-18
|
||||
- libc++-18-dev
|
||||
- libc++abi-18-dev
|
||||
|
||||
- toolset: clang
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
os: macos-12
|
||||
- toolset: clang
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
os: macos-13
|
||||
- toolset: clang
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
os: macos-14
|
||||
- toolset: clang
|
||||
cxxstd: "11,14,17,20,23"
|
||||
os: macos-15
|
||||
|
||||
timeout-minutes: 15
|
||||
runs-on: ${{matrix.os}}
|
||||
@@ -516,14 +532,6 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- toolset: msvc-14.0
|
||||
cxxstd: "14"
|
||||
addrmd: 32,64
|
||||
os: windows-2019
|
||||
- toolset: msvc-14.2
|
||||
cxxstd: "14,17,20,latest"
|
||||
addrmd: 32,64
|
||||
os: windows-2019
|
||||
- toolset: msvc-14.3
|
||||
cxxstd: "14,17,20,latest"
|
||||
addrmd: 32,64
|
||||
@@ -533,9 +541,9 @@ jobs:
|
||||
addrmd: 32,64
|
||||
os: windows-2022
|
||||
- toolset: gcc
|
||||
cxxstd: "11,14,17,2a"
|
||||
cxxstd: "11,14,17,20,23"
|
||||
addrmd: 64
|
||||
os: windows-2019
|
||||
os: windows-2022
|
||||
|
||||
timeout-minutes: 15
|
||||
runs-on: ${{matrix.os}}
|
||||
|
||||
88
appveyor.yml
Normal file
88
appveyor.yml
Normal file
@@ -0,0 +1,88 @@
|
||||
# Copyright 2025 Andrey Semashev
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
||||
|
||||
version: 1.0.{build}-{branch}
|
||||
|
||||
shallow_clone: true
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- develop
|
||||
- /feature\/.*/
|
||||
|
||||
environment:
|
||||
matrix:
|
||||
- TOOLSET: msvc-12.0
|
||||
ADDRMD: 32,64
|
||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||
- TOOLSET: msvc-14.0
|
||||
ADDRMD: 32,64
|
||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||
- TOOLSET: msvc-14.1
|
||||
CXXSTD: 14,17,latest
|
||||
ADDRMD: 32,64
|
||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||
- TOOLSET: msvc-14.2
|
||||
ADDRMD: 32,64
|
||||
CXXSTD: 14,17,20,latest
|
||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
|
||||
- TOOLSET: msvc-14.3
|
||||
ADDRMD: 32,64
|
||||
CXXSTD: 14,17,20,latest
|
||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022
|
||||
- TOOLSET: clang-win
|
||||
ADDRMD: 32
|
||||
CXXSTD: 14,17,latest
|
||||
ENV_SCRIPT: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat
|
||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
|
||||
- TOOLSET: clang-win
|
||||
ADDRMD: 64
|
||||
CXXSTD: 14,17,latest
|
||||
ENV_SCRIPT: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat
|
||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
|
||||
- TOOLSET: gcc
|
||||
CXXSTD: 11,14,1z
|
||||
ADDPATH: C:\cygwin\bin;
|
||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||
- TOOLSET: gcc
|
||||
CXXSTD: 11,14,1z
|
||||
ADDPATH: C:\cygwin64\bin;
|
||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||
- TOOLSET: gcc
|
||||
CXXSTD: 11,14,17
|
||||
ADDPATH: C:\mingw-w64\x86_64-7.3.0-posix-seh-rt_v5-rev0\mingw64\bin;
|
||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||
- TOOLSET: gcc
|
||||
CXXSTD: 11,14,17,2a
|
||||
ADDPATH: C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin;
|
||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||
|
||||
install:
|
||||
- set GIT_FETCH_JOBS=8
|
||||
- set BOOST_BRANCH=develop
|
||||
- if "%APPVEYOR_REPO_BRANCH%" == "master" set BOOST_BRANCH=master
|
||||
- cd ..
|
||||
- git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||
- cd boost-root
|
||||
- git submodule init tools/build
|
||||
- git submodule init tools/boostdep
|
||||
- git submodule init tools/boost_install
|
||||
- git submodule init libs/headers
|
||||
- git submodule init libs/config
|
||||
- git submodule update --jobs %GIT_FETCH_JOBS%
|
||||
- xcopy /s /e /q %APPVEYOR_BUILD_FOLDER% libs\detail
|
||||
- python tools/boostdep/depinst/depinst.py --git_args "--jobs %GIT_FETCH_JOBS%" detail
|
||||
- cmd /c bootstrap
|
||||
- b2 -d0 headers
|
||||
|
||||
build: off
|
||||
|
||||
test_script:
|
||||
- PATH=%ADDPATH%%PATH%
|
||||
- if not "%ENV_SCRIPT%" == "" call "%ENV_SCRIPT%"
|
||||
- if not "%CXXSTD%" == "" set CXXSTD=cxxstd=%CXXSTD%
|
||||
- if not "%ADDRMD%" == "" set ADDRMD=address-model=%ADDRMD%
|
||||
- if not "%THREADING%" == "" set THREADING=threading=%THREADING%
|
||||
- b2 -j %NUMBER_OF_PROCESSORS% libs/detail/test toolset=%TOOLSET% %CXXSTD% %ADDRMD% %THREADING%
|
||||
@@ -1,6 +1,7 @@
|
||||
// boost/detail/bitmask.hpp ------------------------------------------------//
|
||||
|
||||
// Copyright Beman Dawes 2006
|
||||
// Copyright Andrey Semashev 2025
|
||||
|
||||
// Distributed under the Boost Software License, Version 1.0
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
@@ -18,41 +19,73 @@
|
||||
#define BOOST_BITMASK_HPP
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/cstdint.hpp>
|
||||
|
||||
#define BOOST_BITMASK(Bitmask) \
|
||||
\
|
||||
inline BOOST_CONSTEXPR Bitmask operator| (Bitmask x , Bitmask y ) \
|
||||
{ return static_cast<Bitmask>( static_cast<boost::int_least32_t>(x) \
|
||||
| static_cast<boost::int_least32_t>(y)); } \
|
||||
\
|
||||
inline BOOST_CONSTEXPR Bitmask operator& (Bitmask x , Bitmask y ) \
|
||||
{ return static_cast<Bitmask>( static_cast<boost::int_least32_t>(x) \
|
||||
& static_cast<boost::int_least32_t>(y)); } \
|
||||
\
|
||||
inline BOOST_CONSTEXPR Bitmask operator^ (Bitmask x , Bitmask y ) \
|
||||
{ return static_cast<Bitmask>( static_cast<boost::int_least32_t>(x) \
|
||||
^ static_cast<boost::int_least32_t>(y)); } \
|
||||
\
|
||||
inline BOOST_CONSTEXPR Bitmask operator~ (Bitmask x ) \
|
||||
{ return static_cast<Bitmask>(~static_cast<boost::int_least32_t>(x)); } \
|
||||
\
|
||||
inline Bitmask & operator&=(Bitmask& x , Bitmask y) \
|
||||
{ x = x & y ; return x ; } \
|
||||
\
|
||||
inline Bitmask & operator|=(Bitmask& x , Bitmask y) \
|
||||
{ x = x | y ; return x ; } \
|
||||
\
|
||||
inline Bitmask & operator^=(Bitmask& x , Bitmask y) \
|
||||
{ x = x ^ y ; return x ; } \
|
||||
\
|
||||
/* Boost extensions to [bitmask.types] */ \
|
||||
\
|
||||
inline BOOST_CONSTEXPR bool operator!(Bitmask x) \
|
||||
{ return !static_cast<int>(x); } \
|
||||
\
|
||||
inline BOOST_CONSTEXPR bool bitmask_set(Bitmask x) \
|
||||
#if defined(__has_builtin)
|
||||
#if __has_builtin(__underlying_type)
|
||||
#define BOOST_BITMASK_DETAIL_UNDERLYING_TYPE(enum_type) __underlying_type(enum_type)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_BITMASK_DETAIL_UNDERLYING_TYPE) && \
|
||||
((defined(BOOST_GCC_VERSION) && (BOOST_GCC_VERSION >= 40700)) || (defined(_MSC_VER) && (_MSC_VER >= 1700)))
|
||||
#define BOOST_BITMASK_DETAIL_UNDERLYING_TYPE(enum_type) __underlying_type(enum_type)
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_BITMASK_DETAIL_UNDERLYING_TYPE)
|
||||
#include <type_traits>
|
||||
#endif
|
||||
|
||||
namespace boost {
|
||||
namespace detail {
|
||||
namespace bitmask {
|
||||
|
||||
#if defined(BOOST_BITMASK_DETAIL_UNDERLYING_TYPE)
|
||||
template< typename Enum >
|
||||
using underlying_type_t = BOOST_BITMASK_DETAIL_UNDERLYING_TYPE(Enum);
|
||||
#elif (BOOST_CXX_VERSION >= 201402)
|
||||
using std::underlying_type_t;
|
||||
#else
|
||||
template< typename Enum >
|
||||
using underlying_type_t = typename std::underlying_type< Enum >::type;
|
||||
#endif
|
||||
|
||||
}}}
|
||||
|
||||
#undef BOOST_BITMASK_DETAIL_UNDERLYING_TYPE
|
||||
|
||||
#define BOOST_BITMASK(Bitmask) \
|
||||
\
|
||||
inline BOOST_CONSTEXPR Bitmask operator| (Bitmask x, Bitmask y) BOOST_NOEXCEPT \
|
||||
{ return static_cast< Bitmask >(static_cast< ::boost::detail::bitmask::underlying_type_t< Bitmask > >(x) \
|
||||
| static_cast< ::boost::detail::bitmask::underlying_type_t< Bitmask > >(y)); } \
|
||||
\
|
||||
inline BOOST_CONSTEXPR Bitmask operator& (Bitmask x, Bitmask y) BOOST_NOEXCEPT \
|
||||
{ return static_cast< Bitmask >(static_cast< ::boost::detail::bitmask::underlying_type_t< Bitmask > >(x) \
|
||||
& static_cast< ::boost::detail::bitmask::underlying_type_t< Bitmask > >(y)); } \
|
||||
\
|
||||
inline BOOST_CONSTEXPR Bitmask operator^ (Bitmask x, Bitmask y) BOOST_NOEXCEPT \
|
||||
{ return static_cast< Bitmask >(static_cast< ::boost::detail::bitmask::underlying_type_t< Bitmask > >(x) \
|
||||
^ static_cast< ::boost::detail::bitmask::underlying_type_t< Bitmask > >(y)); } \
|
||||
\
|
||||
inline BOOST_CONSTEXPR Bitmask operator~ (Bitmask x) BOOST_NOEXCEPT \
|
||||
{ return static_cast< Bitmask >(~static_cast< ::boost::detail::bitmask::underlying_type_t< Bitmask > >(x)); } \
|
||||
\
|
||||
inline BOOST_CXX14_CONSTEXPR Bitmask& operator&=(Bitmask& x, Bitmask y) BOOST_NOEXCEPT \
|
||||
{ x = x & y; return x; } \
|
||||
\
|
||||
inline BOOST_CXX14_CONSTEXPR Bitmask& operator|=(Bitmask& x, Bitmask y) BOOST_NOEXCEPT \
|
||||
{ x = x | y; return x; } \
|
||||
\
|
||||
inline BOOST_CXX14_CONSTEXPR Bitmask& operator^=(Bitmask& x, Bitmask y) BOOST_NOEXCEPT \
|
||||
{ x = x ^ y; return x; } \
|
||||
\
|
||||
/* Boost extensions to [bitmask.types] */ \
|
||||
\
|
||||
inline BOOST_CONSTEXPR bool operator!(Bitmask x) BOOST_NOEXCEPT \
|
||||
{ return !static_cast< ::boost::detail::bitmask::underlying_type_t< Bitmask > >(x); } \
|
||||
\
|
||||
BOOST_DEPRECATED("bitmask_set(enum) is deprecated, use !!enum or comparison operators instead") \
|
||||
inline BOOST_CONSTEXPR bool bitmask_set(Bitmask x) BOOST_NOEXCEPT \
|
||||
{ return !!x; }
|
||||
|
||||
#endif // BOOST_BITMASK_HPP
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
################################################################################
|
||||
|
||||
import testing ;
|
||||
import config : requires ;
|
||||
|
||||
build-project container_fwd ;
|
||||
|
||||
@@ -27,6 +28,7 @@ import config : requires ;
|
||||
|
||||
run binary_search_test.cpp ;
|
||||
run blank_test.cpp ;
|
||||
run bitmask_test.cpp : : : [ requires cxx11_scoped_enums ] ;
|
||||
run is_sorted_test.cpp /boost/array//boost_array ;
|
||||
run numeric_traits_test.cpp ;
|
||||
run is_xxx_test.cpp /boost/preprocessor//boost_preprocessor ;
|
||||
|
||||
184
test/bitmask_test.cpp
Normal file
184
test/bitmask_test.cpp
Normal file
@@ -0,0 +1,184 @@
|
||||
/*
|
||||
* 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)
|
||||
*
|
||||
* Copyright (c) 2025 Andrey Semashev
|
||||
*/
|
||||
|
||||
#include <boost/detail/bitmask.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
enum unscoped_enum
|
||||
{
|
||||
zero = 0,
|
||||
one = 1,
|
||||
two = 2,
|
||||
four = 4
|
||||
};
|
||||
|
||||
BOOST_BITMASK(unscoped_enum)
|
||||
|
||||
void test_unscoped_enum()
|
||||
{
|
||||
BOOST_TEST((one | two) == ((unscoped_enum)(1 | 2)));
|
||||
BOOST_TEST((one & two) == ((unscoped_enum)(1 & 2)));
|
||||
BOOST_TEST((one ^ two) == ((unscoped_enum)(1 ^ 2)));
|
||||
BOOST_TEST((one | one) == ((unscoped_enum)(1 | 1)));
|
||||
BOOST_TEST((one & one) == ((unscoped_enum)(1 & 1)));
|
||||
BOOST_TEST((one ^ one) == ((unscoped_enum)(1 ^ 1)));
|
||||
BOOST_TEST((~one) == ((unscoped_enum)(~1)));
|
||||
{
|
||||
unscoped_enum val = one;
|
||||
val |= two;
|
||||
BOOST_TEST(val == ((unscoped_enum)(1 | 2)));
|
||||
}
|
||||
{
|
||||
unscoped_enum val = one;
|
||||
val &= two;
|
||||
BOOST_TEST(val == ((unscoped_enum)(1 & 2)));
|
||||
}
|
||||
{
|
||||
unscoped_enum val = one;
|
||||
val ^= two;
|
||||
BOOST_TEST(val == ((unscoped_enum)(1 ^ 2)));
|
||||
}
|
||||
{
|
||||
unscoped_enum val = one;
|
||||
val |= one;
|
||||
BOOST_TEST(val == ((unscoped_enum)(1 | 1)));
|
||||
}
|
||||
{
|
||||
unscoped_enum val = one;
|
||||
val &= one;
|
||||
BOOST_TEST(val == ((unscoped_enum)(1 & 1)));
|
||||
}
|
||||
{
|
||||
unscoped_enum val = one;
|
||||
val ^= one;
|
||||
BOOST_TEST(val == ((unscoped_enum)(1 ^ 1)));
|
||||
}
|
||||
BOOST_TEST(!zero);
|
||||
BOOST_TEST(!!one);
|
||||
}
|
||||
|
||||
|
||||
enum class scoped_enum
|
||||
{
|
||||
none = 0,
|
||||
x = 8,
|
||||
y = 16,
|
||||
z = 32
|
||||
};
|
||||
|
||||
BOOST_BITMASK(scoped_enum)
|
||||
|
||||
void test_scoped_enum()
|
||||
{
|
||||
BOOST_TEST((scoped_enum::x | scoped_enum::y) == ((scoped_enum)(8 | 16)));
|
||||
BOOST_TEST((scoped_enum::x & scoped_enum::y) == ((scoped_enum)(8 & 16)));
|
||||
BOOST_TEST((scoped_enum::x ^ scoped_enum::y) == ((scoped_enum)(8 ^ 16)));
|
||||
BOOST_TEST((scoped_enum::x | scoped_enum::x) == ((scoped_enum)(8 | 8)));
|
||||
BOOST_TEST((scoped_enum::x & scoped_enum::x) == ((scoped_enum)(8 & 8)));
|
||||
BOOST_TEST((scoped_enum::x ^ scoped_enum::x) == ((scoped_enum)(8 ^ 8)));
|
||||
BOOST_TEST((~scoped_enum::x) == ((scoped_enum)(~8)));
|
||||
{
|
||||
scoped_enum val = scoped_enum::x;
|
||||
val |= scoped_enum::y;
|
||||
BOOST_TEST(val == ((scoped_enum)(8 | 16)));
|
||||
}
|
||||
{
|
||||
scoped_enum val = scoped_enum::x;
|
||||
val &= scoped_enum::y;
|
||||
BOOST_TEST(val == ((scoped_enum)(8 & 16)));
|
||||
}
|
||||
{
|
||||
scoped_enum val = scoped_enum::x;
|
||||
val ^= scoped_enum::y;
|
||||
BOOST_TEST(val == ((scoped_enum)(8 ^ 16)));
|
||||
}
|
||||
{
|
||||
scoped_enum val = scoped_enum::x;
|
||||
val |= scoped_enum::x;
|
||||
BOOST_TEST(val == ((scoped_enum)(8 | 8)));
|
||||
}
|
||||
{
|
||||
scoped_enum val = scoped_enum::x;
|
||||
val &= scoped_enum::x;
|
||||
BOOST_TEST(val == ((scoped_enum)(8 & 8)));
|
||||
}
|
||||
{
|
||||
scoped_enum val = scoped_enum::x;
|
||||
val ^= scoped_enum::x;
|
||||
BOOST_TEST(val == ((scoped_enum)(8 ^ 8)));
|
||||
}
|
||||
BOOST_TEST(!scoped_enum::none);
|
||||
BOOST_TEST(!!scoped_enum::x);
|
||||
}
|
||||
|
||||
|
||||
namespace my_namespace {
|
||||
|
||||
enum class namespaced_enum : unsigned int
|
||||
{
|
||||
empty = 0,
|
||||
a = 64,
|
||||
b = 128,
|
||||
c = 256
|
||||
};
|
||||
|
||||
BOOST_BITMASK(namespaced_enum)
|
||||
|
||||
} // namespace my_namespace
|
||||
|
||||
void test_namespaced_enum()
|
||||
{
|
||||
BOOST_TEST((my_namespace::namespaced_enum::a | my_namespace::namespaced_enum::b) == ((my_namespace::namespaced_enum)(64u | 128u)));
|
||||
BOOST_TEST((my_namespace::namespaced_enum::a & my_namespace::namespaced_enum::b) == ((my_namespace::namespaced_enum)(64u & 128u)));
|
||||
BOOST_TEST((my_namespace::namespaced_enum::a ^ my_namespace::namespaced_enum::b) == ((my_namespace::namespaced_enum)(64u ^ 128u)));
|
||||
BOOST_TEST((my_namespace::namespaced_enum::a | my_namespace::namespaced_enum::a) == ((my_namespace::namespaced_enum)(64u | 64u)));
|
||||
BOOST_TEST((my_namespace::namespaced_enum::a & my_namespace::namespaced_enum::a) == ((my_namespace::namespaced_enum)(64u & 64u)));
|
||||
BOOST_TEST((my_namespace::namespaced_enum::a ^ my_namespace::namespaced_enum::a) == ((my_namespace::namespaced_enum)(64u ^ 64u)));
|
||||
BOOST_TEST((~my_namespace::namespaced_enum::a) == ((my_namespace::namespaced_enum)(~64u)));
|
||||
{
|
||||
my_namespace::namespaced_enum val = my_namespace::namespaced_enum::a;
|
||||
val |= my_namespace::namespaced_enum::b;
|
||||
BOOST_TEST(val == ((my_namespace::namespaced_enum)(64u | 128u)));
|
||||
}
|
||||
{
|
||||
my_namespace::namespaced_enum val = my_namespace::namespaced_enum::a;
|
||||
val &= my_namespace::namespaced_enum::b;
|
||||
BOOST_TEST(val == ((my_namespace::namespaced_enum)(64u & 128u)));
|
||||
}
|
||||
{
|
||||
my_namespace::namespaced_enum val = my_namespace::namespaced_enum::a;
|
||||
val ^= my_namespace::namespaced_enum::b;
|
||||
BOOST_TEST(val == ((my_namespace::namespaced_enum)(64u ^ 128u)));
|
||||
}
|
||||
{
|
||||
my_namespace::namespaced_enum val = my_namespace::namespaced_enum::a;
|
||||
val |= my_namespace::namespaced_enum::a;
|
||||
BOOST_TEST(val == ((my_namespace::namespaced_enum)(64u | 64u)));
|
||||
}
|
||||
{
|
||||
my_namespace::namespaced_enum val = my_namespace::namespaced_enum::a;
|
||||
val &= my_namespace::namespaced_enum::a;
|
||||
BOOST_TEST(val == ((my_namespace::namespaced_enum)(64u & 64u)));
|
||||
}
|
||||
{
|
||||
my_namespace::namespaced_enum val = my_namespace::namespaced_enum::a;
|
||||
val ^= my_namespace::namespaced_enum::a;
|
||||
BOOST_TEST(val == ((my_namespace::namespaced_enum)(64u ^ 64u)));
|
||||
}
|
||||
BOOST_TEST(!my_namespace::namespaced_enum::empty);
|
||||
BOOST_TEST(!!my_namespace::namespaced_enum::a);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test_unscoped_enum();
|
||||
test_scoped_enum();
|
||||
test_namespaced_enum();
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
Reference in New Issue
Block a user