Files
Fig-TreeWalker/src/Module/CppLibrary/File/File.hpp

74 lines
1.9 KiB
C++

#pragma once
#include <cassert>
#include <cstdint>
#include <fstream>
#include <limits>
#include <vector>
namespace Fig::CppLibrary
{
using FileIDType = uint16_t;
struct File
{
FileIDType id;
std::fstream *fs;
};
class FileManager
{
private:
std::vector<File *> handlers;
std::vector<FileIDType> free_handlers;
FileIDType allocated = 0;
public:
static constexpr FileIDType MAX_HANDLERS = std::numeric_limits<FileIDType>::max();
static constexpr unsigned int MAX_FILE_BUF = 961200; // bytes
FileIDType AllocFile(std::fstream *fs)
{
FileIDType id = allocated++;
File *f = new File{.id = id, .fs = fs};
handlers.push_back(f);
return id;
}
void CloseFile(FileIDType id)
{
assert(id < allocated && "CloseHandler: id out of range");
File *f = handlers[id];
if (f == nullptr) { return; }
f->fs->close();
delete f->fs;
delete f;
free_handlers.push_back(id);
handlers[id] = nullptr;
}
File *GetNextFreeFile()
{
// if there is no free handler, create a new one
if (free_handlers.size() > 0)
{
FileIDType id = *free_handlers.begin();
handlers[id] = new File{.id = id, .fs = new std::fstream};
free_handlers.erase(free_handlers.begin());
return handlers[id];
}
return handlers[AllocFile(new std::fstream)];
}
File *GetFile(FileIDType id)
{
assert(id < allocated && "GetFile: id out of range");
return handlers[id];
}
static FileManager &getInstance()
{
static FileManager fm;
return fm;
}
};
}; // namespace Fig::CppLibrary