X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Fmemory.cpp;h=eaaaeb1829dfc5a59b481ca32e6e48170a78cc53;hp=274f6bae91c1a6a1d53f67be3872319bdae85bc2;hb=ea8bf8f588310b0d7fd3297d74907602705bba1d;hpb=bff25a255af05f1ddd6c956a97fa6b8c50c9b22d diff --git a/source/io/memory.cpp b/source/io/memory.cpp index 274f6ba..eaaaeb1 100644 --- a/source/io/memory.cpp +++ b/source/io/memory.cpp @@ -8,14 +8,14 @@ using namespace std; namespace Msp { namespace IO { -Memory::Memory(char *d, unsigned s) +Memory::Memory(char *d, unsigned s, Mode m) { - init(d, d+s, M_RDWR); + init(d, d+s, m); } -Memory::Memory(char *b, char *e) +Memory::Memory(char *b, char *e, Mode m) { - init(b, e, M_RDWR); + init(b, e, m); } Memory::Memory(const char *cd, unsigned s) @@ -37,6 +37,16 @@ void Memory::init(char *b, char *e, Mode m) mode = m; } +void Memory::set_block(bool) +{ + throw logic_error("Memory::set_block"); +} + +void Memory::set_inherit(bool) +{ + throw logic_error("Memory::set_inherit"); +} + unsigned Memory::do_write(const char *buf, unsigned size) { check_access(M_WRITE); @@ -49,6 +59,8 @@ unsigned Memory::do_write(const char *buf, unsigned size) unsigned Memory::do_read(char *buf, unsigned size) { + check_access(M_READ); + if(pos==end) { set_eof(); @@ -64,12 +76,18 @@ unsigned Memory::do_read(char *buf, unsigned size) unsigned 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 +102,8 @@ bool Memory::getline(string &line) int Memory::get() { + check_access(M_READ); + if(pos==end) { set_eof(); @@ -93,6 +113,11 @@ int Memory::get() return static_cast(*pos++); } +const Handle &Memory::get_handle(Mode) +{ + throw logic_error("Memory::get_handle"); +} + SeekOffset Memory::seek(SeekOffset off, SeekType type) { char *new_pos; @@ -106,9 +131,10 @@ SeekOffset Memory::seek(SeekOffset off, SeekType type) throw invalid_argument("Memory::seek"); if(new_posend) - throw out_of_range("Memory::seek"); + throw bad_seek(off, type); pos = new_pos; + eof_flag = false; return pos-begin; }