@@ -75,20 +75,27 @@ template<class T, std::size_t BlockBytes, std::size_t BlockSize, class StoredSiz
7575struct deque_block_traits
7676{
7777 BOOST_CONTAINER_STATIC_ASSERT_MSG (!(BlockBytes && BlockSize), " BlockBytes and BlockSize can't be specified at the same time" );
78+ // Calculate default block size
7879 BOOST_STATIC_CONSTEXPR std::size_t default_block_bytes = sizeof (void *)*128u ;
79- BOOST_STATIC_CONSTEXPR std::size_t default_block_start = default_block_bytes/sizeof (T);
80- BOOST_STATIC_CONSTEXPR std::size_t default_min_block_size = 16u ;
81- BOOST_STATIC_CONSTEXPR std::size_t default_block_size_initial = default_block_start < default_min_block_size
80+ BOOST_STATIC_CONSTEXPR std::size_t default_block_start = (default_block_bytes - 1u )/sizeof (T) + 1u ;
81+ // Round to the next power of two
82+ BOOST_STATIC_CONSTEXPR std::size_t default_block_size_upp_pow2 = dtl::upper_power_of_2_ct<std::size_t , default_block_start>::value;
83+
84+ // Check minimal size
85+ BOOST_STATIC_CONSTEXPR std::size_t default_min_block_size_pow = 3u ;
86+ BOOST_STATIC_CONSTEXPR std::size_t default_min_block_size = 8u ;
87+ BOOST_STATIC_CONSTEXPR std::size_t default_block_size_initial = default_block_size_upp_pow2 < default_min_block_size
8288 ? default_min_block_size
83- : dtl::upper_power_of_2_ct<std::size_t , default_block_start>::value;
84- BOOST_STATIC_CONSTEXPR std::size_t max_stored_size_block_size = std::size_t (1u ) << (sizeof (StoredSizeType)*CHAR_BIT - 4u );
85- BOOST_STATIC_CONSTEXPR std::size_t default_block_size = default_block_size_initial > max_stored_size_block_size
86- ? max_stored_size_block_size
87- : default_block_size_initial;
89+ : default_block_size_upp_pow2;
8890
89- BOOST_STATIC_CONSTEXPR std::size_t value = BlockSize ? BlockSize
90- : BlockBytes ? (BlockBytes-1u )/sizeof (T) + 1u
91- : default_block_size
91+ // Limit by stored size max value
92+ BOOST_STATIC_CONSTEXPR std::size_t max_stored_size_block_size = std::size_t (1u ) << (sizeof (StoredSizeType)*CHAR_BIT - default_min_block_size_pow);
93+ BOOST_STATIC_CONSTEXPR std::size_t default_block_size = default_block_size_initial > max_stored_size_block_size
94+ ? max_stored_size_block_size
95+ : default_block_size_initial;
96+ // Now select between the default or the specified by the user
97+ BOOST_STATIC_CONSTEXPR std::size_t value = BlockSize ? BlockSize
98+ : BlockBytes ? (BlockBytes-1u )/sizeof (T) + 1u : default_block_size
9299 ;
93100 BOOST_CONTAINER_STATIC_ASSERT_MSG (value <= max_stored_size_block_size, " BlockSize or BlockBytes is too big for the stored_size_type" );
94101
0 commit comments