]> git.tdb.fi Git - libs/core.git/blob - source/io/memory.cpp
Add move semantics to Variant
[libs/core.git] / source / io / memory.cpp
1 #include <algorithm>
2 #include <cstring>
3 #include <msp/core/except.h>
4 #include "handle.h"
5 #include "memory.h"
6
7 using namespace std;
8
9 namespace Msp {
10 namespace IO {
11
12 Memory::Memory(char *d, std::size_t s, Mode m):
13         Memory(d, d+s, m)
14 { }
15
16 Memory::Memory(char *b, char *e, Mode m):
17         begin(b),
18         end(e),
19         pos(begin)
20 {
21         mode = m;
22 }
23
24 Memory::Memory(const char *d, std::size_t s):
25         Memory(const_cast<char *>(d), const_cast<char *>(d+s), M_READ)
26 { }
27
28 Memory::Memory(const char *b, const char *e):
29         Memory(const_cast<char *>(b), const_cast<char *>(e), M_READ)
30 { }
31
32 void Memory::set_block(bool)
33 {
34         throw unsupported("Memory::set_block");
35 }
36
37 void Memory::set_inherit(bool)
38 {
39         throw unsupported("Memory::set_inherit");
40 }
41
42 size_t Memory::do_write(const char *buf, size_t size)
43 {
44         check_access(M_WRITE);
45
46         size = min<size_t>(size, end-pos);
47         memcpy(pos, buf, size);
48         pos += size;
49         return size;
50 }
51
52 size_t Memory::do_read(char *buf, size_t size)
53 {
54         check_access(M_READ);
55
56         if(pos==end)
57         {
58                 set_eof();
59                 return 0;
60         }
61
62         size = min<size_t>(size, end-pos);
63         memcpy(buf, pos, size);
64         pos += size;
65         return size;
66 }
67
68 size_t Memory::put(char c)
69 {
70         check_access(M_WRITE);
71
72         if(pos==end)
73                 return 0;
74
75         *pos++ = c;
76         return 1;
77 }
78
79 bool Memory::getline(string &line)
80 {
81         check_access(M_READ);
82
83         if(pos==end)
84         {
85                 set_eof();
86                 return false;
87         }
88
89         char *nl = find(pos, end, '\n');
90         line.assign(pos, nl);
91         pos = (nl==end ? end : nl+1);
92         return true;
93 }
94
95 int Memory::get()
96 {
97         check_access(M_READ);
98
99         if(pos==end)
100         {
101                 set_eof();
102                 return -1;
103         }
104
105         return static_cast<unsigned char>(*pos++);
106 }
107
108 const Handle &Memory::get_handle(Mode)
109 {
110         throw unsupported("Memory::get_handle");
111 }
112
113 SeekOffset Memory::seek(SeekOffset off, SeekType type)
114 {
115         char *new_pos;
116         if(type==S_BEG)
117                 new_pos = begin+off;
118         else if(type==S_CUR)
119                 new_pos = pos+off;
120         else if(type==S_END)
121                 new_pos = end+off;
122         else
123                 throw invalid_argument("Memory::seek");
124
125         if(new_pos<begin || new_pos>end)
126                 throw bad_seek(off, type);
127
128         pos = new_pos;
129         eof_flag = false;
130         return pos-begin;
131 }
132
133 } // namespace IO
134 } // namespace Msp