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

  1. #pragma once
  2.  
  3. #include "common.h"
  4. #include "util.h"
  5.  
  6. struct SeekMode
  7. {
  8.     enum Enum
  9.     {
  10.         kBEGIN,
  11.         kCURRENT,
  12.         kEND,
  13.     };
  14. };
  15.  
  16. class IStream
  17. {
  18. public:
  19.     virtual ~IStream()
  20.     {
  21.     }
  22.  
  23.     virtual bool read(void* const data, const uint32_t size, uint32_t* const num_read = nullptr) = 0;
  24.     virtual bool write(const void* const data, const uint32_t size, uint32_t* const num_written = nullptr) = 0;
  25.  
  26.     virtual bool seek(const uint64_t offset, const SeekMode::Enum mode = SeekMode::kBEGIN, uint64_t* const position = nullptr) = 0;
  27.  
  28.     inline uint64_t tell()
  29.     {
  30.         uint64_t pos;
  31.         if (!seek(0, SeekMode::kCURRENT, &pos))
  32.             return 0;
  33.         return pos;
  34.     }
  35.  
  36.     template<typename T>
  37.     inline typename std::enable_if<std::is_arithmetic<T>::value, bool>::type read_le(T& data)
  38.     {
  39.         if (!read(&data, sizeof(data)))
  40.             return false;
  41.         data = host_to_little(data);
  42.         return true;
  43.     }
  44.  
  45.     template<typename T>
  46.     inline typename std::enable_if<std::is_arithmetic<T>::value, bool>::type read_be(T& data)
  47.     {
  48.         if (!read(&data, sizeof(data)))
  49.             return false;
  50.         data = host_to_big(data);
  51.         return true;
  52.     }
  53.  
  54.     template<typename T>
  55.     inline typename std::enable_if<std::is_arithmetic<T>::value, bool>::type write_le(T data)
  56.     {
  57.         data = little_to_host(data);
  58.         if (!write(&data, sizeof(data)))
  59.             return false;
  60.         return true;
  61.     }
  62.  
  63.     template<typename T>
  64.     inline typename std::enable_if<std::is_arithmetic<T>::value, bool>::type write_be(T data)
  65.     {
  66.         data = big_to_host(data);
  67.         if (!write(&data, sizeof(data)))
  68.             return false;
  69.         return true;
  70.     }
  71. };
  72.