|
|
@ -9,24 +9,25 @@ |
|
|
|
#include <fstream> // ifstream, ios, ofstream |
|
|
|
#include <fstream> // ifstream, ios, ofstream |
|
|
|
#include <memory> // make_unique |
|
|
|
#include <memory> // make_unique |
|
|
|
#include <string> |
|
|
|
#include <string> |
|
|
|
|
|
|
|
#include <string_view> |
|
|
|
|
|
|
|
|
|
|
|
#include "ruc/file.h" |
|
|
|
#include "ruc/file.h" |
|
|
|
#include "ruc/meta/assert.h" |
|
|
|
#include "ruc/meta/assert.h" |
|
|
|
|
|
|
|
|
|
|
|
namespace ruc { |
|
|
|
namespace ruc { |
|
|
|
|
|
|
|
|
|
|
|
File::File(const std::string& path) |
|
|
|
File::File(std::string_view path) |
|
|
|
: m_path(path) |
|
|
|
: m_path(path) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// Create input stream object and open file
|
|
|
|
// Create input stream object and open file
|
|
|
|
std::ifstream file(path, std::ios::in); |
|
|
|
std::ifstream file(path.data(), std::ios::in); |
|
|
|
VERIFY(file.is_open(), "failed to open file: '{}'", path); |
|
|
|
VERIFY(file.is_open(), "failed to open file: '{}'", path); |
|
|
|
|
|
|
|
|
|
|
|
// Get length of the file
|
|
|
|
// Get length of the file
|
|
|
|
file.seekg(0, std::ios::end); |
|
|
|
file.seekg(0, std::ios::end); |
|
|
|
int32_t size = file.tellg(); |
|
|
|
int32_t size = file.tellg(); |
|
|
|
file.seekg(0, std::ios::beg); |
|
|
|
file.seekg(0, std::ios::beg); |
|
|
|
VERIFY(size != -1, "failed to read file length: '{}', path"); |
|
|
|
VERIFY(size != -1, "failed to read file length: '{}'", path); |
|
|
|
|
|
|
|
|
|
|
|
// Allocate memory filled with zeros
|
|
|
|
// Allocate memory filled with zeros
|
|
|
|
auto buffer = std::make_unique<char[]>(size); |
|
|
|
auto buffer = std::make_unique<char[]>(size); |
|
|
@ -44,10 +45,10 @@ File::~File() |
|
|
|
|
|
|
|
|
|
|
|
// -----------------------------------------
|
|
|
|
// -----------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
File File::create(const std::string& path) |
|
|
|
File File::create(std::string_view path) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (!std::filesystem::exists(path)) { |
|
|
|
if (!std::filesystem::exists(path)) { |
|
|
|
std::ofstream { path }; |
|
|
|
std::ofstream { path.data() }; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return File(path); |
|
|
|
return File(path); |
|
|
@ -60,14 +61,14 @@ void File::clear() |
|
|
|
m_data.clear(); |
|
|
|
m_data.clear(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
File& File::append(const std::string& data) |
|
|
|
File& File::append(std::string_view data) |
|
|
|
{ |
|
|
|
{ |
|
|
|
m_data.append(data); |
|
|
|
m_data.append(data); |
|
|
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
return *this; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
File& File::replace(size_t index, size_t length, const std::string& data) |
|
|
|
File& File::replace(size_t index, size_t length, std::string_view data) |
|
|
|
{ |
|
|
|
{ |
|
|
|
m_data.replace(index, length, data); |
|
|
|
m_data.replace(index, length, data); |
|
|
|
|
|
|
|
|
|
|
@ -77,7 +78,7 @@ File& File::replace(size_t index, size_t length, const std::string& data) |
|
|
|
File& File::flush() |
|
|
|
File& File::flush() |
|
|
|
{ |
|
|
|
{ |
|
|
|
// Create output stream object and open file
|
|
|
|
// Create output stream object and open file
|
|
|
|
std::ofstream file(m_path, std::ios::out | std::ios::trunc); |
|
|
|
std::ofstream file(m_path.data(), std::ios::out | std::ios::trunc); |
|
|
|
VERIFY(file.is_open(), "failed to open file: '{}'", m_path); |
|
|
|
VERIFY(file.is_open(), "failed to open file: '{}'", m_path); |
|
|
|
|
|
|
|
|
|
|
|
// Write data to disk
|
|
|
|
// Write data to disk
|
|
|
|