our
@ISA
=
qw{Data::ParseBinary::Stream::StringRefReader Data::ParseBinary::Stream::WrapperBase}
;
__PACKAGE__->_registerStreamType(
"StringBuffer"
);
sub
new {
my
(
$class
,
$sub_stream
) =
@_
;
my
$string
=
''
;
my
$self
=
$class
->SUPER::new(\
$string
);
$self
->_warping(
$sub_stream
);
return
$self
;
}
sub
ReadBytes {
my
(
$self
,
$count
) =
@_
;
if
(
$self
->{location} +
$count
>
$self
->{
length
}) {
my
$more_needed
=
$count
- (
$self
->{
length
} -
$self
->{location});
my
$new_bytes
=
$self
->{ss}->ReadBytes(
$more_needed
);
${
$self
->{data} } .=
$new_bytes
;
$self
->{
length
} +=
$more_needed
;
}
return
$self
->SUPER::ReadBytes(
$count
);
}
sub
seek
{
my
(
$self
,
$newpos
) =
@_
;
if
(
$newpos
>
$self
->{
length
}) {
my
$more_needed
=
$newpos
-
$self
->{
length
};
my
$new_bytes
=
$self
->{ss}->ReadBytes(
$more_needed
);
${
$self
->{data} } .=
$new_bytes
;
$self
->{
length
} +=
$more_needed
;
}
$self
->SUPER::
seek
(
$newpos
);
}
our
@ISA
=
qw{Data::ParseBinary::Stream::StringRefWriter Data::ParseBinary::Stream::WrapperBase}
;
__PACKAGE__->_registerStreamType(
"StringBuffer"
);
sub
new {
my
(
$class
,
$sub_stream
) =
@_
;
my
$source
=
''
;
my
$self
=
$class
->SUPER::new(\
$source
);
$self
->_warping(
$sub_stream
);
return
$self
;
}
sub
Flush {
my
$self
=
shift
;
my
$data
=
$self
->SUPER::Flush();
$self
->{ss}->WriteBytes(
$$data
);
my
$empty_string
=
''
;
$self
->{data} = \
$empty_string
;
$self
->{offset} = 0;
return
$self
->{ss}->Flush();
}
1;