X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FPacketParser.cci;h=db3939d8d9b3937d7511f8b51c2eecbbdf6cefce;hb=78a6e233083efa63a9cd0684a92abc64202a9ee7;hp=510c2a61b2b0a6715be48c34c7f6086989e566d8;hpb=601d1f509f5bb24df167a4dd5a20da67a0af9af8;p=senf.git diff --git a/senf/Packets/PacketParser.cci b/senf/Packets/PacketParser.cci index 510c2a6..db3939d 100644 --- a/senf/Packets/PacketParser.cci +++ b/senf/Packets/PacketParser.cci @@ -49,15 +49,36 @@ prefix_ senf::PacketParserBase::data_iterator senf::PacketParserBase::end() return data_->end(); } +prefix_ senf::PacketParserBase::ParserProtector::ParserProtector(PacketParserBase const * p) + : safe_i_( *p), parser_(p) +{} + +prefix_ senf::PacketParserBase::ParserProtector::ParserProtector(ParserProtector const & other_) + : safe_i_( *other_.parser_), parser_(other_.parser_) +{ + other_.parser_ = 0; +} + +prefix_ senf::PacketParserBase::ParserProtector::~ParserProtector() +{ + if (parser_) const_cast(parser_)->i_ = safe_i_; +} + // protected members +prefix_ senf::PacketParserBase::ParserProtector senf::PacketParserBase::protect() + const +{ + return ParserProtector(this); +} + prefix_ bool senf::PacketParserBase::check(size_type size) const { return size <= size_type(std::distance(i(),end())); } -prefix_ void senf::PacketParserBase::validate(size_type size) +prefix_ void senf::PacketParserBase::validate(size_type size) const { if (! check(size)) @@ -68,7 +89,7 @@ prefix_ senf::PacketParserBase::PacketParserBase(data_iterator i, state_type s) : i_ (i), data_ (s) {} -prefix_ senf::PacketParserBase::PacketParserBase(data_iterator i, state_type s, +prefix_ senf::PacketParserBase::PacketParserBase(data_iterator i, state_type s, size_type size) : i_ (i), data_ (s) {