X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Fmemory.cpp;h=0b2d8f4c1b7f49ec7ccb93222d2bf48915abf3fd;hp=af6ef3d44ce386ce2bd7d2caaf8b1a8de24a9fa7;hb=HEAD;hpb=c21ab7e49852585df01b4cc19599e25a918b581b diff --git a/source/io/memory.cpp b/source/io/memory.cpp index af6ef3d..0539fdb 100644 --- a/source/io/memory.cpp +++ b/source/io/memory.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "handle.h" #include "memory.h" @@ -8,87 +9,108 @@ 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(cd); - init(d, d+s, M_READ); -} +Memory::Memory(const char *d, std::size_t s): + Memory(const_cast(d), const_cast(d+s), M_READ) +{ } + +Memory::Memory(const char *b, const char *e): + Memory(const_cast(b), const_cast(e), M_READ) +{ } -Memory::Memory(const char *b, const char *e) +void Memory::set_block(bool) { - init(const_cast(b), const_cast(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_mode(M_WRITE); + check_access(M_WRITE); - size = min(size, end-pos); + size = min(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) { - eof_flag = true; + set_eof(); return 0; } - size = min(size, end-pos); + size = min(size, end-pos); memcpy(buf, pos, size); pos += size; return size; } -unsigned Memory::put(char c) +size_t Memory::put(char c) { - check_mode(M_WRITE); + 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(); + return false; + } + char *nl = find(pos, end, '\n'); line.assign(pos, nl); - bool result = (nl!=pos); - pos = nl; - return result; + pos = (nl==end ? end : nl+1); + return true; } int Memory::get() { + check_access(M_READ); + if(pos==end) { - eof_flag = true; + set_eof(); return -1; } return static_cast(*pos++); } -unsigned Memory::seek(int off, SeekType type) +const Handle &Memory::get_handle(Mode) +{ + throw unsupported("Memory::get_handle"); +} + +SeekOffset Memory::seek(SeekOffset off, SeekType type) { char *new_pos; if(type==S_BEG) @@ -101,17 +123,12 @@ unsigned Memory::seek(int 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; } -void Memory::check_mode(Mode m) const -{ - if(m==M_WRITE && !(mode&M_WRITE)) - throw invalid_access(M_WRITE); -} - } // namespace IO } // namespace Msp