/
githubmirror
/
omim
Обзор
Документация
Войти
/
githubmirror
/
omim
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
android-951
coding/mmap_reader.cpp
103 строки
2 KB
Maxim Pimenov
Fixed some warnings.
15 май 2019, 13:35
15 май 2019, 13:35
c11c41d
Код
Авторство
О чём код?
#include "coding/mmap_reader.hpp" #include "std/target_os.hpp" #include <cstring> // @TODO we don't support windows at the moment #ifndef OMIM_OS_WINDOWS #include <unistd.h> #include <sys/mman.h> #include <sys/stat.h> #ifdef OMIM_OS_ANDROID #include <fcntl.h> #else #include <sys/fcntl.h> #endif #endif using namespace std; class MmapReader::MmapData { int m_fd; public: uint8_t * m_memory; uint64_t m_size; explicit MmapData(string const & fileName) { // @TODO add windows support #ifndef OMIM_OS_WINDOWS m_fd = open(fileName.c_str(), O_RDONLY | O_NONBLOCK); if (m_fd == -1) MYTHROW(OpenException, ("open failed for file", fileName)); struct stat s; if (-1 == fstat(m_fd, &s)) MYTHROW(OpenException, ("fstat failed for file", fileName)); m_size = s.st_size; m_memory = static_cast<uint8_t *>( mmap(0, static_cast<size_t>(m_size), PROT_READ, MAP_SHARED, m_fd, 0)); if (m_memory == MAP_FAILED) { close(m_fd); MYTHROW(OpenException, ("mmap failed for file", fileName)); } #endif } ~MmapData() { // @TODO add windows support #ifndef OMIM_OS_WINDOWS munmap(m_memory, static_cast<size_t>(m_size)); close(m_fd); #endif } }; MmapReader::MmapReader(string const & fileName) : base_type(fileName), m_offset(0) { m_data = shared_ptr<MmapData>(new MmapData(fileName)); m_size = m_data->m_size; } MmapReader::MmapReader(MmapReader const & reader, uint64_t offset, uint64_t size) : base_type(reader.GetName()), m_data(reader.m_data), m_offset(offset), m_size(size) { } uint64_t MmapReader::Size() const { return m_size; } void MmapReader::Read(uint64_t pos, void * p, size_t size) const { ASSERT_LESS_OR_EQUAL(pos + size, Size(), (pos, size)); memcpy(p, m_data->m_memory + m_offset + pos, size); } unique_ptr<Reader> MmapReader::CreateSubReader(uint64_t pos, uint64_t size) const { ASSERT_LESS_OR_EQUAL(pos + size, Size(), (pos, size)); // Can't use make_unique with private constructor. return unique_ptr<Reader>(new MmapReader(*this, m_offset + pos, size)); } uint8_t * MmapReader::Data() const { return m_data->m_memory; } void MmapReader::SetOffsetAndSize(uint64_t offset, uint64_t size) { ASSERT_LESS_OR_EQUAL(offset + size, Size(), (offset, size)); m_offset = offset; m_size = size; }