Refactor regular_sizeof function and fix type conversion warnings in test_pmr_new.cpp

This commit is contained in:
mutouyun 2024-01-06 18:10:52 +08:00
parent 397e25a6ab
commit de80de3828
2 changed files with 18 additions and 14 deletions

View File

@ -22,21 +22,21 @@
LIBPMR_NAMESPACE_BEG_
constexpr inline std::size_t regular_level(std::size_t s) noexcept {
if (s <= 128 ) return 0;
if (s <= 1024 ) return 1;
if (s <= 8192 ) return 2;
if (s <= 65536) return 3;
return 4;
return (s <= 128 ) ? 0 :
(s <= 1024 ) ? 1 :
(s <= 8192 ) ? 2 :
(s <= 65536) ? 3 : 4;
}
constexpr inline std::size_t regular_sizeof_impl(std::size_t l, std::size_t s) noexcept {
return (l == 0) ? std::max<std::size_t>(::LIBIMP::round_up<std::size_t>(s, 8), regular_head_size) :
(l == 1) ? ::LIBIMP::round_up<std::size_t>(s, 128) :
(l == 2) ? ::LIBIMP::round_up<std::size_t>(s, 1024) :
(l == 3) ? ::LIBIMP::round_up<std::size_t>(s, 8192) : (std::numeric_limits<std::size_t>::max)();
}
constexpr inline std::size_t regular_sizeof(std::size_t s) noexcept {
switch (regular_level(s)) {
case 0 : return std::max<std::size_t>(::LIBIMP::round_up<std::size_t>(s, 8), regular_head_size);
case 1 : return ::LIBIMP::round_up<std::size_t>(s, 128);
case 2 : return ::LIBIMP::round_up<std::size_t>(s, 1024);
case 3 : return ::LIBIMP::round_up<std::size_t>(s, 8192);
default: return (std::numeric_limits<std::size_t>::max)();
}
return regular_sizeof_impl(regular_level(s), s);
}
template <typename T>
@ -179,7 +179,11 @@ void delete$(T *p) noexcept {
::LIBIMP::destroy(p);
auto *mem_res = regular_resource<regular_sizeof<T>()>::get();
if (mem_res == nullptr) return;
#if defined(LIBIMP_CC_MSVC_2015)
mem_res->deallocate(p, sizeof(T));
#else
mem_res->deallocate(p, sizeof(T), alignof(T));
#endif
}
LIBPMR_NAMESPACE_END_

View File

@ -42,12 +42,12 @@ template <std::size_t Pts, std::size_t N>
void test_new$array() {
std::array<void *, Pts> pts;
using T = std::array<char, N>;
for (int i = 0; i < pts.size(); ++i) {
for (int i = 0; i < (int)pts.size(); ++i) {
auto p = pmr::new$<T>();
pts[i] = p;
std::memset(p, i, sizeof(T));
}
for (int i = 0; i < pts.size(); ++i) {
for (int i = 0; i < (int)pts.size(); ++i) {
T tmp;
std::memset(&tmp, i, sizeof(T));
ASSERT_EQ(std::memcmp(pts[i], &tmp, sizeof(T)), 0);