#include <cassert>
#include <memory>
#include <utility>
#include "../types.h"
void test_replace_int_p() {
auto replace_int_p = [](int** pp) {
assert(**pp == 90);
delete *pp;
*pp = new int{84};
};
{
auto rPtr = new int{90};
replace_int_p(std::inout_ptr<int*>(rPtr));
assert(*rPtr == 84);
delete rPtr;
}
{
auto uPtr = std::make_unique<int>(90);
replace_int_p(std::inout_ptr(uPtr));
assert(*uPtr == 84);
}
{
MoveOnlyDeleter<int> del;
std::unique_ptr<int, MoveOnlyDeleter<int>> uPtr{new int{90}};
replace_int_p(std::inout_ptr(uPtr, std::move(del)));
assert(*uPtr == 84);
assert(uPtr.get_deleter().wasMoveInitilized == true);
}
{
ConstructiblePtr<int> cPtr(new int{90});
replace_int_p(std::inout_ptr(cPtr));
assert(cPtr == 84);
}
{
ResettablePtr<int> rPtr(new int{90});
replace_int_p(std::inout_ptr(rPtr));
assert(rPtr == 84);
}
{
NonConstructiblePtr<int> nPtr;
nPtr.reset(new int{90});
replace_int_p(std::inout_ptr(nPtr));
assert(nPtr == 84);
}
}
void test_replace_int_p_with_nullptr() {
auto replace_int_p_with_nullptr = [](int** pp) -> void {
assert(**pp == 90);
delete *pp;
*pp = nullptr;
};
{
auto rPtr = new int{90};
replace_int_p_with_nullptr(std::inout_ptr<int*>(rPtr));
assert(rPtr == nullptr);
}
{
auto uPtr = std::make_unique<int>(90);
replace_int_p_with_nullptr(std::inout_ptr(uPtr));
assert(uPtr == nullptr);
}
}
void test_replace_int_void_p() {
auto replace_int_void_p = [](void** pp) {
assert(*(static_cast<int*>(*pp)) == 90);
delete static_cast<int*>(*pp);
*pp = new int{84};
};
{
auto rPtr = new int{90};
replace_int_void_p(std::inout_ptr<int*>(rPtr));
assert(*rPtr == 84);
delete rPtr;
}
{
auto uPtr = std::make_unique<int>(90);
replace_int_void_p(std::inout_ptr(uPtr));
assert(*uPtr == 84);
}
}
void test_replace_int_void_p_with_nullptr() {
auto replace_int_void_p_with_nullptr = [](void** pp) {
assert(*(static_cast<int*>(*pp)) == 90);
delete static_cast<int*>(*pp);
*pp = nullptr;
};
{
auto rPtr = new int{90};
replace_int_void_p_with_nullptr(std::inout_ptr<int*>(rPtr));
assert(rPtr == nullptr);
}
{
auto uPtr = std::make_unique<int>(90);
replace_int_void_p_with_nullptr(std::inout_ptr(uPtr));
assert(uPtr == nullptr);
}
}
void test_replace_nullptr_with_int_p() {
auto replace_nullptr_with_int_p = [](int** pp) {
assert(*pp == nullptr);
*pp = new int{84};
};
{
int* rPtr = nullptr;
replace_nullptr_with_int_p(std::inout_ptr<int*>(rPtr));
assert(*rPtr == 84);
delete rPtr;
}
{
std::unique_ptr<int> uPtr;
replace_nullptr_with_int_p(std::inout_ptr(uPtr));
assert(*uPtr == 84);
}
}
int main(int, char**) {
test_replace_int_p();
test_replace_int_p_with_nullptr();
test_replace_int_void_p();
test_replace_int_void_p_with_nullptr();
test_replace_nullptr_with_int_p();
return 0;
}