libebml_ng
io.h
Go to the documentation of this file.
1 #ifndef EBML_NG_IO_H
2 #define EBML_NG_IO_H
3 
4 #include <mutex>
5 #include <memory>
6 #include <iostream>
7 #include <sys/stat.h>
8 
9 #include "ptrs.h"
10 
11 namespace ebml {
22  class ioBase {
23  public:
24  ioBase() : _pos(0), _mutex() {};
25  virtual ~ioBase();
26  // Basic interface functions for file-like objects.
27  size_t read(char*, size_t);
28  size_t write(const char*, size_t);
29  off_t seek(off_t, int whence=SEEK_SET);
30  virtual bool seekable() = 0;
31  off_t tell();
32 
33  // Additional read/write overloads that accept position argument.
34  virtual size_t read(char*, off_t, size_t) = 0;
35  virtual size_t write(const char*, off_t, size_t) = 0;
36  void close();
37  bool closed() const;
38 
39  virtual void truncate() = 0;
40  virtual void truncate(off_t) = 0;
41 
42  virtual struct stat stat() = 0;
43  // TODO
44  // virtual bool readable() = 0;
45  // virtual bool writable() = 0;
46 
47  // Lock,
48  std::unique_lock<std::recursive_mutex> acquireLock() {
49  return std::unique_lock<std::recursive_mutex>(this->_mutex);
50  }
51  protected:
52  off_t _pos;
53  bool _closed = 0;
55 
56  // Custom implementations of read, write, and seek. When overriding, any
57  // errors must be thrown as c++ exceptions.
58  virtual size_t _read(char*, size_t) = 0;
59  virtual size_t _write(const char*, size_t) = 0;
60  virtual off_t _seek(off_t, int) = 0;
61  virtual off_t _tell() = 0;
62  virtual void _close() = 0;
63 
64  // Prohibit copy constructor and copy assignment.
65  ioBase(const ioBase&);
66  ioBase& operator=(const ioBase&);
67  private:
68  std::recursive_mutex _mutex;
69  };
70 
80  template<typename T>
81  class io : public ioBase {
82  public:
83  io(const T&);
84 
92  static ioBase_sp open(const std::string&, const std::ios_base::openmode&);
93 
100  static ioBase_sp wrap(const T&);
101 
102  std::ios_base::openmode mode() const;
103  bool seekable();
104 
105  // Read and write functions at specified offset.
106  // These functions have a default implementation of seek-then-read/write.
107  // Specializations may be defined, for example, to use pread and pseek for
108  // file descriptors.
109  size_t read(char*, off_t, size_t);
110  size_t write(const char*, off_t, size_t);
111  void truncate();
112  void truncate(off_t);
113  struct stat stat();
114  void close();
115 
116  private:
117  T _file;
118  static T _open(const std::string&, const std::ios_base::openmode&);
119  size_t _read(char*, size_t);
120  size_t _write(const char*, size_t);
121  off_t _seek(off_t, int);
122  void _close();
123  off_t _tell();
124  std::ios_base::openmode _mode;
125  };
126 }
127 
128 // #include "libebml_ng/io.tpp"
129 #endif
bool _close_on_dealloc
Definition: io.h:54
virtual ~ioBase()
Definition: io.cpp:50
virtual off_t _seek(off_t, int)=0
virtual void truncate()=0
size_t read(char *, size_t)
Definition: io.cpp:16
bool seekable()
virtual bool seekable()=0
void close()
off_t tell()
Definition: io.cpp:30
Template class that implements the ioBase interface.
Definition: io.h:81
static ioBase_sp wrap(const T &)
Wrap an already opened file into an io object.
std::ios_base::openmode mode() const
off_t _pos
Definition: io.h:52
io(const T &)
virtual void _close()=0
virtual struct stat stat()=0
Definition: basictypes.h:40
A drop-in replacement for std::shared_ptr tailored for EBML objects.
Definition: ptrs.h:27
void close()
Definition: io.cpp:42
size_t read(char *, off_t, size_t)
virtual off_t _tell()=0
bool closed() const
Definition: io.cpp:38
std::unique_lock< std::recursive_mutex > acquireLock()
Definition: io.h:48
ioBase()
Definition: io.h:24
virtual size_t _write(const char *, size_t)=0
static ioBase_sp open(const std::string &, const std::ios_base::openmode &)
Open a file and instantiate an io object.
bool _closed
Definition: io.h:53
void truncate()
virtual size_t _read(char *, size_t)=0
size_t write(const char *, off_t, size_t)
ioBase & operator=(const ioBase &)
Base class for file-like IO operations.
Definition: io.h:22
struct stat stat()
size_t write(const char *, size_t)
Definition: io.cpp:23
off_t seek(off_t, int whence=SEEK_SET)
Definition: io.cpp:9