]> git.tdb.fi Git - libs/core.git/blob - source/io/file.h
Modernize noexcept specifiers
[libs/core.git] / source / io / file.h
1 #ifndef MSP_IO_FILE_H_
2 #define MSP_IO_FILE_H_
3
4 #include <stdexcept>
5 #include <string>
6 #include "buffered.h"
7 #include "handle.h"
8 #include "seekable.h"
9
10 namespace Msp {
11 namespace IO {
12
13 class file_not_found: public std::runtime_error
14 {
15 public:
16         file_not_found(const std::string &fn): std::runtime_error(fn) { }
17 };
18
19 class file_already_exists: public std::runtime_error
20 {
21 public:
22         file_already_exists(const std::string &fn): std::runtime_error(fn) { }
23 };
24
25
26 /**
27 A class for reading and writing files.
28
29 Non-blocking mode is not supported on Win32.
30 */
31 class File: public Seekable
32 {
33 public:
34         enum CreateMode
35         {
36                 C_NONE = 0,
37                 C_CREATE = 1,
38                 C_TRUNCATE = 2,
39                 C_OVERWRITE = C_CREATE+C_TRUNCATE,
40                 C_EXCLUSIVE = 4,
41                 C_NEW = C_CREATE+C_EXCLUSIVE
42         };
43
44 private:
45         Handle handle;
46
47 public:
48         /** Creates a new file object and opens it.  If the create flag is set and
49         write access is requested and the file does exist, it is created.  Otherwise
50         a missing file is an error. */
51         File(const std::string &, Mode = M_READ, CreateMode = C_OVERWRITE);
52 private:
53         void platform_init(const std::string &, CreateMode);
54 public:
55         ~File() override;
56
57         void set_block(bool) override;
58         void set_inherit(bool) override;
59
60 protected:
61         std::size_t do_write(const char *, std::size_t) override;
62         std::size_t do_read(char *, std::size_t) override;
63
64 public:
65         void sync();
66
67         SeekOffset seek(SeekOffset, SeekType) override;
68         SeekOffset tell() const override;
69
70         const Handle &get_handle(Mode) override;
71 };
72
73 inline File::CreateMode operator|(File::CreateMode m, File::CreateMode n)
74 { return File::CreateMode(static_cast<int>(m)|static_cast<int>(n)); }
75
76 inline File::CreateMode operator&(File::CreateMode m, File::CreateMode n)
77 { return File::CreateMode(static_cast<int>(m)&static_cast<int>(n)); }
78
79 inline File::CreateMode operator~(File::CreateMode m)
80 { return File::CreateMode(~static_cast<int>(m)); }
81
82
83 class BufferedFile: public Seekable
84 {
85 private:
86         File file;
87         Buffered buffer;
88         SeekOffset position;
89
90 public:
91         BufferedFile(const std::string &, Mode = M_READ, File::CreateMode = File::C_OVERWRITE);
92
93         void set_block(bool) override;
94         void set_inherit(bool) override;
95
96 protected:
97         std::size_t do_write(const char *, std::size_t) override;
98         std::size_t do_read(char *, std::size_t) override;
99 public:
100         std::size_t put(char) override;
101
102         bool getline(std::string &) override;
103         int get() override;
104
105         const Handle &get_handle(Mode) override;
106
107         SeekOffset seek(SeekOffset, SeekType) override;
108         SeekOffset tell() const override { return position; }
109 };
110
111 } // namespace IO
112 } // namespace Msp
113
114 #endif