]> git.tdb.fi Git - libs/core.git/blobdiff - source/io/memory.cpp
Add move semantics to Variant
[libs/core.git] / source / io / memory.cpp
index 274f6bae91c1a6a1d53f67be3872319bdae85bc2..0539fdbc4245f3c9c9ada441bf2aefdbcf0c0707 100644 (file)
@@ -1,5 +1,6 @@
 #include <algorithm>
 #include <cstring>
+#include <msp/core/except.h>
 #include "handle.h"
 #include "memory.h"
 
@@ -8,68 +9,77 @@ using namespace std;
 namespace Msp {
 namespace IO {
 
-Memory::Memory(char *d, unsigned s)
-{
-       init(d, d+s, M_RDWR);
-}
+Memory::Memory(char *d, std::size_t s, Mode m):
+       Memory(d, d+s, m)
+{ }
 
-Memory::Memory(char *b, char *e)
+Memory::Memory(char *b, char *e, Mode m):
+       begin(b),
+       end(e),
+       pos(begin)
 {
-       init(b, e, M_RDWR);
+       mode = m;
 }
 
-Memory::Memory(const char *cd, unsigned s)
-{
-       char *d = const_cast<char *>(cd);
-       init(d, d+s, M_READ);
-}
+Memory::Memory(const char *d, std::size_t s):
+       Memory(const_cast<char *>(d), const_cast<char *>(d+s), M_READ)
+{ }
 
-Memory::Memory(const char *b, const char *e)
+Memory::Memory(const char *b, const char *e):
+       Memory(const_cast<char *>(b), const_cast<char *>(e), M_READ)
+{ }
+
+void Memory::set_block(bool)
 {
-       init(const_cast<char *>(b), const_cast<char *>(e), M_READ);
+       throw unsupported("Memory::set_block");
 }
 
-void Memory::init(char *b, char *e, Mode m)
+void Memory::set_inherit(bool)
 {
-       begin = b;
-       end = e;
-       pos = begin;
-       mode = m;
+       throw unsupported("Memory::set_inherit");
 }
 
-unsigned Memory::do_write(const char *buf, unsigned size)
+size_t Memory::do_write(const char *buf, size_t size)
 {
        check_access(M_WRITE);
 
-       size = min<unsigned>(size, end-pos);
+       size = min<size_t>(size, end-pos);
        memcpy(pos, buf, size);
        pos += size;
        return size;
 }
 
-unsigned Memory::do_read(char *buf, unsigned size)
+size_t Memory::do_read(char *buf, size_t size)
 {
+       check_access(M_READ);
+
        if(pos==end)
        {
                set_eof();
                return 0;
        }
 
-       size = min<unsigned>(size, end-pos);
+       size = min<size_t>(size, end-pos);
        memcpy(buf, pos, size);
        pos += size;
        return size;
 }
 
-unsigned Memory::put(char c)
+size_t Memory::put(char c)
 {
        check_access(M_WRITE);
+
+       if(pos==end)
+               return 0;
+
        *pos++ = c;
        return 1;
 }
 
 bool Memory::getline(string &line)
 {
+       check_access(M_READ);
+
        if(pos==end)
        {
                set_eof();
@@ -84,6 +94,8 @@ bool Memory::getline(string &line)
 
 int Memory::get()
 {
+       check_access(M_READ);
+
        if(pos==end)
        {
                set_eof();
@@ -93,6 +105,11 @@ int Memory::get()
        return static_cast<unsigned char>(*pos++);
 }
 
+const Handle &Memory::get_handle(Mode)
+{
+       throw unsupported("Memory::get_handle");
+}
+
 SeekOffset Memory::seek(SeekOffset off, SeekType type)
 {
        char *new_pos;
@@ -106,9 +123,10 @@ SeekOffset Memory::seek(SeekOffset off, SeekType type)
                throw invalid_argument("Memory::seek");
 
        if(new_pos<begin || new_pos>end)
-               throw out_of_range("Memory::seek");
+               throw bad_seek(off, type);
 
        pos = new_pos;
+       eof_flag = false;
        return pos-begin;
 }