maybe a simpler unique_ptr
This commit is contained in:
@@ -8,17 +8,7 @@
|
||||
|
||||
namespace aocpp {
|
||||
|
||||
class ConditionalDeleter {
|
||||
bool should_delete_;
|
||||
|
||||
public:
|
||||
ConditionalDeleter(bool should_delete) : should_delete_ {should_delete} {}
|
||||
|
||||
template <typename T>
|
||||
auto operator()(T * pointer) -> void { if (should_delete_) { delete pointer; }}
|
||||
};
|
||||
|
||||
auto Startup(int argc, char ** argv) -> std::unique_ptr<std::istream, ConditionalDeleter>;
|
||||
auto Startup(int argc, char ** argv) -> std::unique_ptr<std::istream, void(*)(std::istream*)>;
|
||||
|
||||
}
|
||||
|
||||
|
@@ -12,29 +12,20 @@
|
||||
|
||||
namespace aocpp {
|
||||
|
||||
auto Startup(int argc, char ** argv) -> std::unique_ptr<std::istream, ConditionalDeleter> {
|
||||
auto Startup(int argc, char ** argv) -> std::unique_ptr<std::istream, void(*)(std::istream*)> {
|
||||
if (std::getenv("DOCTEST")) {
|
||||
exit(doctest::Context{argc, argv}.run());
|
||||
}
|
||||
|
||||
bool should_delete;
|
||||
std::istream* result_ptr;
|
||||
|
||||
switch (argc) {
|
||||
case 2:
|
||||
should_delete = true;
|
||||
result_ptr = new std::ifstream{argv[1]};
|
||||
break;
|
||||
return {new std::ifstream{argv[1]}, [](std::istream* p) { delete p; }};
|
||||
case 1:
|
||||
should_delete = false;
|
||||
result_ptr = &std::cin;
|
||||
break;
|
||||
return {&std::cin, [](std::istream*){}};
|
||||
default:
|
||||
std::cerr << "bad arguments\n";
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
return {result_ptr, should_delete};
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user