#pragma once #include struct data_holder { uint8_t *buf = nullptr; size_t sz = 0; using str_pairs = std::initializer_list>; int patch(str_pairs list); bool contains(std::string_view pattern); protected: void consume(data_holder &other); }; enum data_type { HEAP, MMAP }; template struct auto_data : public data_holder { auto_data() = default; auto_data(const auto_data&) = delete; auto_data(auto_data &&other) { consume(other); } ~auto_data() {} auto_data& operator=(auto_data &&other) { consume(other); return *this; } }; template <> inline auto_data::~auto_data() { if (buf) munmap(buf, sz); } template <> inline auto_data::~auto_data() { free(buf); } namespace raw_data { auto_data read(const char *name); auto_data read(int fd); auto_data mmap_rw(const char *name); auto_data mmap_ro(const char *name); }