| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -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
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |