aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorBastien Bouclet2019-04-08 19:23:31 +0200
committerFilippos Karapetis2019-04-13 16:24:25 +0300
commitae9eeb731f435d16f2bb9ae69d48ce60c3a47fa3 (patch)
treef9d0ad64b05a656f18a978517ffdcddd1ed6874c /test
parent2af325f60adce92528405cee61c3f4aca447c292 (diff)
downloadscummvm-rg350-ae9eeb731f435d16f2bb9ae69d48ce60c3a47fa3.tar.gz
scummvm-rg350-ae9eeb731f435d16f2bb9ae69d48ce60c3a47fa3.tar.bz2
scummvm-rg350-ae9eeb731f435d16f2bb9ae69d48ce60c3a47fa3.zip
COMMON: Rework the BitStream class to improve its performance
* Fixed peekBits not to seek the underlying stream. Seeking can be slow when the stream is a file. * Changed multi-bit operations to work on multiple bits at once rather than iterating over single-bit operations. This is an almost direct port of a patch for xoreos provided by DrMcCoy.
Diffstat (limited to 'test')
-rw-r--r--test/common/bitstream.h50
1 files changed, 47 insertions, 3 deletions
diff --git a/test/common/bitstream.h b/test/common/bitstream.h
index 0488169183..742f0c18b1 100644
--- a/test/common/bitstream.h
+++ b/test/common/bitstream.h
@@ -50,7 +50,7 @@ public:
private:
template<class MS, class BS>
void tmpl_skip() {
- byte contents[] = { 'a', 'b' };
+ byte contents[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' };
MS ms(contents, sizeof(contents));
@@ -61,6 +61,8 @@ private:
bs.skip(4);
TS_ASSERT_EQUALS(bs.pos(), 9u);
TS_ASSERT_EQUALS(bs.getBits(3), 6u);
+ bs.skip(65);
+ TS_ASSERT_EQUALS(bs.pos(), 77u);
TS_ASSERT(!bs.eos());
}
public:
@@ -133,7 +135,7 @@ private:
TS_ASSERT_EQUALS(bs.pos(), 3u);
bs.skip(8);
TS_ASSERT_EQUALS(bs.pos(), 11u);
- TS_ASSERT_EQUALS(bs.peekBits(5), 2u);
+ TS_ASSERT_EQUALS(bs.peekBits(6), 4u);
TS_ASSERT(!bs.eos());
}
public:
@@ -203,7 +205,7 @@ private:
TS_ASSERT_EQUALS(bs.pos(), 3u);
bs.skip(8);
TS_ASSERT_EQUALS(bs.pos(), 11u);
- TS_ASSERT_EQUALS(bs.peekBits(5), 12u);
+ TS_ASSERT_EQUALS(bs.peekBits(20), 12u);
TS_ASSERT(!bs.eos());
}
public:
@@ -211,4 +213,46 @@ public:
tmpl_peek_bits_lsb<Common::MemoryReadStream, Common::BitStream8LSB>();
tmpl_peek_bits_lsb<Common::BitStreamMemoryStream, Common::BitStreamMemory8LSB>();
}
+
+private:
+ template<class MS, class BS>
+ void tmpl_align() {
+ byte contents[] = { 'a', 'b' };
+
+ MS ms(contents, sizeof(contents));
+
+ BS bs(ms);
+ TS_ASSERT_EQUALS(bs.pos(), 0u);
+ bs.align();
+ TS_ASSERT_EQUALS(bs.pos(), 0u);
+ bs.skip(3);
+ bs.align();
+ TS_ASSERT_EQUALS(bs.pos(), 8u);
+ }
+public:
+ void test_align() {
+ tmpl_align<Common::MemoryReadStream, Common::BitStream8LSB>();
+ tmpl_align<Common::BitStreamMemoryStream, Common::BitStreamMemory8LSB>();
+ }
+
+private:
+ template<class MS, class BS>
+ void tmpl_align_16() {
+ byte contents[] = { 'a', 'b' };
+
+ MS ms(contents, sizeof(contents));
+
+ BS bs(ms);
+ TS_ASSERT_EQUALS(bs.pos(), 0u);
+ bs.align();
+ TS_ASSERT_EQUALS(bs.pos(), 0u);
+ bs.skip(3);
+ bs.align();
+ TS_ASSERT_EQUALS(bs.pos(), 16u);
+ }
+public:
+ void test_align_16() {
+ tmpl_align_16<Common::MemoryReadStream, Common::BitStream16BELSB>();
+ tmpl_align_16<Common::BitStreamMemoryStream, Common::BitStreamMemory16BELSB>();
+ }
};