home *** CD-ROM | disk | FTP | other *** search
/ Xentax forum attachments archive / xentax.7z / 7662 / gttool_src_bin.7z / gttool / src / memory_file.h < prev    next >
Encoding:
C/C++ Source or Header  |  2014-08-01  |  1.7 KB  |  82 lines

  1. #pragma once
  2.  
  3. #include "common.h"
  4. #include "stream.h"
  5.  
  6. // TODO:
  7. // check boundaries & buffer availability
  8.  
  9. class MemoryFile
  10.     : public IStream
  11. {
  12. public:
  13.     MemoryFile()
  14.         : buffer_(nullptr)
  15.         , current_(nullptr)
  16.         , size_(0)
  17.     {
  18.     }
  19.  
  20.     MemoryFile(void* const buffer, const uint64_t size)
  21.         : buffer_(buffer)
  22.         , current_(buffer_)
  23.         , size_(size)
  24.     {
  25.     }
  26.  
  27.     ~MemoryFile()
  28.     {
  29.     }
  30.  
  31.     bool read(void* const data, const uint32_t size, uint32_t* const num_read = nullptr)
  32.     {
  33.         // TODO: boundary check
  34.         memcpy(data, current_, size);
  35.         if (num_read)
  36.             *num_read = size;
  37.         current_ = static_cast<char*>(current_) + size;
  38.         return true;
  39.     }
  40.  
  41.     bool write(const void* const data, const uint32_t size, uint32_t* const num_written = nullptr)
  42.     {
  43.         // TODO: boundary check
  44.         memcpy(current_, data, size);
  45.         if (num_written)
  46.             *num_written = size;
  47.         current_ = static_cast<char*>(current_) + size;
  48.         return true;
  49.     }
  50.  
  51.     bool seek(const uint64_t offset, const SeekMode::Enum mode = SeekMode::kBEGIN, uint64_t* const position = nullptr)
  52.     {
  53.         // TODO: boundary check
  54.         switch (mode) {
  55.             case SeekMode::kBEGIN: current_ = static_cast<char*>(buffer_) + offset; break;
  56.             case SeekMode::kCURRENT: current_ = static_cast<char*>(current_) + offset; break;
  57.             case SeekMode::kEND: current_ = static_cast<char*>(buffer_) + size_ + offset; break;
  58.             default:
  59.                 assert(0 && "Invalid mode specified.");
  60.                 return false;
  61.         }
  62.         if (position)
  63.             *position = static_cast<char*>(current_) - static_cast<char*>(buffer_);
  64.         return true;
  65.     }
  66.  
  67.     uint64_t file_size() const
  68.     {
  69.         return size_;
  70.     }
  71.  
  72.     bool is_valid() const
  73.     {
  74.         return buffer_ != nullptr;
  75.     }
  76.  
  77. private:
  78.     void* buffer_;
  79.     void* current_;
  80.     uint64_t size_;
  81. };
  82.