1 //  Boost integer/integer_mask.hpp header file  ------------------------------//
2 
3 //  (C) Copyright Daryle Walker 2001.
4 //  Distributed under the Boost Software License, Version 1.0. (See
5 //  accompanying file LICENSE_1_0.txt or copy at
6 //  https://www.boost.org/LICENSE_1_0.txt)
7 
8 //  See https://www.boost.org for updates, documentation, and revision history.
9 
10 #ifndef BOOST_INTEGER_INTEGER_MASK_HPP
11 #define BOOST_INTEGER_INTEGER_MASK_HPP
12 
13 #include <boost/integer_fwd.hpp>  // self include
14 
15 #include <boost/config.hpp>   // for BOOST_STATIC_CONSTANT
16 #include <boost/integer.hpp>  // for boost::uint_t
17 
18 #include <climits>  // for UCHAR_MAX, etc.
19 #include <cstddef>  // for std::size_t
20 
21 #include <boost/limits.hpp>  // for std::numeric_limits
22 
23 //
24 // We simply cannot include this header on gcc without getting copious warnings of the kind:
25 //
26 // boost/integer/integer_mask.hpp:93:35: warning: use of C99 long long integer constant
27 //
28 // And yet there is no other reasonable implementation, so we declare this a system header
29 // to suppress these warnings.
30 //
31 #if defined(__GNUC__) && (__GNUC__ >= 4)
32 #pragma GCC system_header
33 #endif
34 
35 namespace boost
36 {
37 
38 
39 //  Specified single-bit mask class declaration  -----------------------------//
40 //  (Lowest bit starts counting at 0.)
41 
42 template < std::size_t Bit >
43 struct high_bit_mask_t
44 {
45     typedef typename uint_t<(Bit + 1)>::least  least;
46     typedef typename uint_t<(Bit + 1)>::fast   fast;
47 
48     BOOST_STATIC_CONSTANT( least, high_bit = (least( 1u ) << Bit) );
49     BOOST_STATIC_CONSTANT( fast, high_bit_fast = (fast( 1u ) << Bit) );
50 
51     BOOST_STATIC_CONSTANT( std::size_t, bit_position = Bit );
52 
53 };  // boost::high_bit_mask_t
54 
55 
56 //  Specified bit-block mask class declaration  ------------------------------//
57 //  Makes masks for the lowest N bits
58 //  (Specializations are needed when N fills up a type.)
59 
60 #ifdef BOOST_MSVC
61 #pragma warning(push)
62 #pragma warning(disable:4310)  // cast truncates constant value
63 #endif
64 
65 template < std::size_t Bits >
66 struct low_bits_mask_t
67 {
68     typedef typename uint_t<Bits>::least  least;
69     typedef typename uint_t<Bits>::fast   fast;
70 
71     BOOST_STATIC_CONSTANT( least, sig_bits = least(~(least(~(least( 0u ))) << Bits )) );
72     BOOST_STATIC_CONSTANT( fast, sig_bits_fast = fast(sig_bits) );
73 
74     BOOST_STATIC_CONSTANT( std::size_t, bit_count = Bits );
75 
76 };  // boost::low_bits_mask_t
77 
78 #ifdef BOOST_MSVC
79 #pragma warning(pop)
80 #endif
81 
82 #define BOOST_LOW_BITS_MASK_SPECIALIZE( Type )                                  \
83   template <  >  struct low_bits_mask_t< std::numeric_limits<Type>::digits >  { \
84       typedef std::numeric_limits<Type>           limits_type;                  \
85       typedef uint_t<limits_type::digits>::least  least;                        \
86       typedef uint_t<limits_type::digits>::fast   fast;                         \
87       BOOST_STATIC_CONSTANT( least, sig_bits = (~( least(0u) )) );              \
88       BOOST_STATIC_CONSTANT( fast, sig_bits_fast = fast(sig_bits) );            \
89       BOOST_STATIC_CONSTANT( std::size_t, bit_count = limits_type::digits );    \
90   }
91 
92 #ifdef BOOST_MSVC
93 #pragma warning(push)
94 #pragma warning(disable:4245)  // 'initializing' : conversion from 'int' to 'const boost::low_bits_mask_t<8>::least', signed/unsigned mismatch
95 #endif
96 
97 BOOST_LOW_BITS_MASK_SPECIALIZE( unsigned char );
98 
99 #if USHRT_MAX > UCHAR_MAX
100 BOOST_LOW_BITS_MASK_SPECIALIZE( unsigned short );
101 #endif
102 
103 #if UINT_MAX > USHRT_MAX
104 BOOST_LOW_BITS_MASK_SPECIALIZE( unsigned int );
105 #endif
106 
107 #if ULONG_MAX > UINT_MAX
108 BOOST_LOW_BITS_MASK_SPECIALIZE( unsigned long );
109 #endif
110 
111 #if defined(BOOST_HAS_LONG_LONG)
112     #if ((defined(ULLONG_MAX) && (ULLONG_MAX > ULONG_MAX)) ||\
113         (defined(ULONG_LONG_MAX) && (ULONG_LONG_MAX > ULONG_MAX)) ||\
114         (defined(ULONGLONG_MAX) && (ULONGLONG_MAX > ULONG_MAX)) ||\
115         (defined(_ULLONG_MAX) && (_ULLONG_MAX > ULONG_MAX)))
116     BOOST_LOW_BITS_MASK_SPECIALIZE( boost::ulong_long_type );
117     #endif
118 #elif defined(BOOST_HAS_MS_INT64)
119     #if 18446744073709551615ui64 > ULONG_MAX
120     BOOST_LOW_BITS_MASK_SPECIALIZE( unsigned __int64 );
121     #endif
122 #endif
123 
124 #ifdef BOOST_MSVC
125 #pragma warning(pop)
126 #endif
127 
128 #undef BOOST_LOW_BITS_MASK_SPECIALIZE
129 
130 
131 }  // namespace boost
132 
133 
134 #endif  // BOOST_INTEGER_INTEGER_MASK_HPP
135