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