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;
  }
};

ひさびさに、さくっと、びしっと(?)書けた。