BLI: remove deduplicated memory utility functions
These functions were originally implemented because: - Not all of them existed pre C++17, but now we are using C++17. - The call stack depth is quite a bit deeper with the std functions, making debugging slower and more annoying. I didn't find this to be a problem anymore recently. No functional changes are expected.
This commit is contained in:
@@ -7,121 +7,6 @@
|
||||
|
||||
namespace blender::tests {
|
||||
|
||||
namespace {
|
||||
struct MyValue {
|
||||
static inline int alive = 0;
|
||||
|
||||
MyValue()
|
||||
{
|
||||
if (alive == 15) {
|
||||
throw std::exception();
|
||||
}
|
||||
|
||||
alive++;
|
||||
}
|
||||
|
||||
MyValue(const MyValue & /*other*/)
|
||||
{
|
||||
if (alive == 15) {
|
||||
throw std::exception();
|
||||
}
|
||||
|
||||
alive++;
|
||||
}
|
||||
|
||||
~MyValue()
|
||||
{
|
||||
alive--;
|
||||
}
|
||||
};
|
||||
} // namespace
|
||||
|
||||
TEST(memory_utils, DefaultConstructN_ActuallyCallsConstructor)
|
||||
{
|
||||
constexpr int amount = 10;
|
||||
TypedBuffer<MyValue, amount> buffer;
|
||||
|
||||
EXPECT_EQ(MyValue::alive, 0);
|
||||
default_construct_n(buffer.ptr(), amount);
|
||||
EXPECT_EQ(MyValue::alive, amount);
|
||||
destruct_n(buffer.ptr(), amount);
|
||||
EXPECT_EQ(MyValue::alive, 0);
|
||||
}
|
||||
|
||||
TEST(memory_utils, DefaultConstructN_StrongExceptionSafety)
|
||||
{
|
||||
constexpr int amount = 20;
|
||||
TypedBuffer<MyValue, amount> buffer;
|
||||
|
||||
EXPECT_EQ(MyValue::alive, 0);
|
||||
EXPECT_THROW(default_construct_n(buffer.ptr(), amount), std::exception);
|
||||
EXPECT_EQ(MyValue::alive, 0);
|
||||
}
|
||||
|
||||
TEST(memory_utils, UninitializedCopyN_ActuallyCopies)
|
||||
{
|
||||
constexpr int amount = 5;
|
||||
TypedBuffer<MyValue, amount> buffer1;
|
||||
TypedBuffer<MyValue, amount> buffer2;
|
||||
|
||||
EXPECT_EQ(MyValue::alive, 0);
|
||||
default_construct_n(buffer1.ptr(), amount);
|
||||
EXPECT_EQ(MyValue::alive, amount);
|
||||
uninitialized_copy_n(buffer1.ptr(), amount, buffer2.ptr());
|
||||
EXPECT_EQ(MyValue::alive, 2 * amount);
|
||||
destruct_n(buffer1.ptr(), amount);
|
||||
EXPECT_EQ(MyValue::alive, amount);
|
||||
destruct_n(buffer2.ptr(), amount);
|
||||
EXPECT_EQ(MyValue::alive, 0);
|
||||
}
|
||||
|
||||
TEST(memory_utils, UninitializedCopyN_StrongExceptionSafety)
|
||||
{
|
||||
constexpr int amount = 10;
|
||||
TypedBuffer<MyValue, amount> buffer1;
|
||||
TypedBuffer<MyValue, amount> buffer2;
|
||||
|
||||
EXPECT_EQ(MyValue::alive, 0);
|
||||
default_construct_n(buffer1.ptr(), amount);
|
||||
EXPECT_EQ(MyValue::alive, amount);
|
||||
EXPECT_THROW(uninitialized_copy_n(buffer1.ptr(), amount, buffer2.ptr()), std::exception);
|
||||
EXPECT_EQ(MyValue::alive, amount);
|
||||
destruct_n(buffer1.ptr(), amount);
|
||||
EXPECT_EQ(MyValue::alive, 0);
|
||||
}
|
||||
|
||||
TEST(memory_utils, UninitializedFillN_ActuallyCopies)
|
||||
{
|
||||
constexpr int amount = 10;
|
||||
TypedBuffer<MyValue, amount> buffer;
|
||||
|
||||
EXPECT_EQ(MyValue::alive, 0);
|
||||
{
|
||||
MyValue value;
|
||||
EXPECT_EQ(MyValue::alive, 1);
|
||||
uninitialized_fill_n(buffer.ptr(), amount, value);
|
||||
EXPECT_EQ(MyValue::alive, 1 + amount);
|
||||
destruct_n(buffer.ptr(), amount);
|
||||
EXPECT_EQ(MyValue::alive, 1);
|
||||
}
|
||||
EXPECT_EQ(MyValue::alive, 0);
|
||||
}
|
||||
|
||||
TEST(memory_utils, UninitializedFillN_StrongExceptionSafety)
|
||||
{
|
||||
constexpr int amount = 20;
|
||||
TypedBuffer<MyValue, amount> buffer;
|
||||
|
||||
EXPECT_EQ(MyValue::alive, 0);
|
||||
{
|
||||
MyValue value;
|
||||
EXPECT_EQ(MyValue::alive, 1);
|
||||
EXPECT_THROW(uninitialized_fill_n(buffer.ptr(), amount, value), std::exception);
|
||||
EXPECT_EQ(MyValue::alive, 1);
|
||||
}
|
||||
EXPECT_EQ(MyValue::alive, 0);
|
||||
}
|
||||
|
||||
class TestBaseClass {
|
||||
virtual void mymethod(){};
|
||||
};
|
||||
|
Reference in New Issue
Block a user