mmap クラス
Boostの正規表現クラスを使う - bkブログ の記事を見て、こりゃいいやと。
class MemoryMappedFile : private Ash::Nonconstructible , private Ash::Noncopyable , private Ash::Nonassignable { int mFileDesc; const char* mpFirst; std::size_t mByteCount; public: MemoryMappedFile(const char* pFilePath) : mFileDesc(::open(pFilePath, O_RDONLY)) , mpFirst(0) , mByteCount(0) { ASH_ENFORCE(-1 != mFileDesc); struct stat st; ASH_ENFORCE(-1 != ::fstat(mFileDesc, &st)); if (st.st_size > 0) { mByteCount = st.st_size; void* p = ::mmap(0, mByteCount, PROT_READ, MAP_SHARED, mFileDesc, 0); ASH_ENFORCE(MAP_FAILED != p); ASH_ENFORCE(-1 != ::madvise(p, mByteCount, MADV_SEQUENTIAL)); mpFirst = static_cast<char*>(p); } } ~MemoryMappedFile() { if (mpFirst) { ::munmap(static_cast<void*>(const_cast<char*>(mpFirst)), mByteCount); mpFirst = 0; } mByteCount = 0; ::close(mFileDesc); mFileDesc = 0; } /* adapt to standard */ const char* begin() const { return mpFirst; } const char* end() const { return mpFirst + mByteCount; } std::size_t size() const { return mByteCount; } bool empty() const { return mpFirst == 0; } };
ひさびさに、さくっと、びしっと(?)書けた。