Skip to content

Commit

Permalink
BaseX Size Estimations (#75)
Browse files Browse the repository at this point in the history
  • Loading branch information
cyberjunk committed Mar 9, 2024
1 parent 2641dc4 commit 7ee5b51
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 14 deletions.
39 changes: 39 additions & 0 deletions include/CppCore.Test/Encoding.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,43 @@ namespace CppCore { namespace Test
class BaseX
{
public:
INLINE static bool estimatebits()
{
return
CppCore::BaseX::estimateBits( 0, 2) == 0 &&
CppCore::BaseX::estimateBits( 1, 2) == 1 &&
CppCore::BaseX::estimateBits( 2, 2) == 2 &&
CppCore::BaseX::estimateBits( 1, 3) == 2 &&
CppCore::BaseX::estimateBits( 1, 12) == 4 &&
CppCore::BaseX::estimateBits( 1, 16) == 4 &&
CppCore::BaseX::estimateBits( 8, 16) == 32 &&
CppCore::BaseX::estimateBits(16, 16) == 64 &&
CppCore::BaseX::estimateBits( 6, 62) == 36 &&
CppCore::BaseX::estimateBits( 6, 64) == 36;
}
INLINE static bool estimatesymbols()
{
bool ok =
CppCore::BaseX::estimateSymbols( 0, 2) == 0 &&
CppCore::BaseX::estimateSymbols( 1, 2) == 1 &&
CppCore::BaseX::estimateSymbols(32, 16) == 8 &&
CppCore::BaseX::estimateSymbols(64, 16) == 16 &&
CppCore::BaseX::estimateSymbols(64, 32) == 13 &&
CppCore::BaseX::estimateSymbols(64, 62) == 13 &&
CppCore::BaseX::estimateSymbols(32, 64) == 6;
if (!ok)
return false;
std::string alphabet;
for (uint32_t b = 2; b < 256; b++)
{
alphabet.resize(b, '0');
uint32_t e = CppCore::BaseX::estimateSymbols(64, b);
std::string s = CppCore::BaseX::tostring(UINT64_MAX, alphabet.c_str());
if (s.length() > e)
return false;
}
return true;
}
INLINE static bool tostring8()
{
std::string ss;
Expand Down Expand Up @@ -1046,6 +1083,8 @@ namespace CppCore { namespace Test { namespace VS
public:
TEST_METHOD(ISDIGIT) { Assert::AreEqual(true, CppCore::Test::Encoding::isdigit()); }
TEST_METHOD(ISXDIGIT) { Assert::AreEqual(true, CppCore::Test::Encoding::isxdigit()); }
TEST_METHOD(BASEX_ESTIMATEBITS) { Assert::AreEqual(true, CppCore::Test::Encoding::BaseX::estimatebits()); }
TEST_METHOD(BASEX_ESTIMATESYMBOLS) { Assert::AreEqual(true, CppCore::Test::Encoding::BaseX::estimatesymbols()); }
TEST_METHOD(BASEX_TOSTRING8) { Assert::AreEqual(true, CppCore::Test::Encoding::BaseX::tostring8()); }
TEST_METHOD(BASEX_TOSTRING16) { Assert::AreEqual(true, CppCore::Test::Encoding::BaseX::tostring16()); }
TEST_METHOD(BASEX_TOSTRING32) { Assert::AreEqual(true, CppCore::Test::Encoding::BaseX::tostring32()); }
Expand Down
24 changes: 24 additions & 0 deletions include/CppCore/Encoding.h
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,30 @@ namespace CppCore
private:
INLINE BaseX() { }
public:
/// <summary>
/// Returns an upper bound of decoded bits required for encoded symbols.
/// </summary>
INLINE static uint32_t estimateBits(uint32_t symbols, uint32_t base)
{
assert(base >= 2);
uint32_t pow2b = CppCore::ngptwo32(base);
uint32_t nbits = CppCore::tzcnt32(pow2b);
return symbols * nbits;
}

/// <summary>
/// Returns an upper bound of encoded symbols required for decoded bits.
/// </summary>
INLINE static uint32_t estimateSymbols(uint32_t bits, uint32_t base)
{
assert(base >= 2);
uint32_t q, r;
uint32_t pow2b = CppCore::nlptwo32(base);
uint32_t nbits = CppCore::tzcnt32(pow2b);
CppCore::udivmod32(bits, nbits, q, r);
return r ? q + 1 : q;
}

/// <summary>
/// Encodes unsigned integer v into string s using alphabet.
/// </summary>
Expand Down
30 changes: 16 additions & 14 deletions src/CppCore.Test/Test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -704,20 +704,22 @@ int main()
std::cout << "-------------------------------" << std::endl;
std::cout << " CppCore::Encoding::BaseX " << std::endl;
std::cout << "-------------------------------" << std::endl;
TEST(CppCore::Test::Encoding::BaseX::tostring8, "tostring8: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::tostring16, "tostring16: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::tostring32, "tostring32: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::tostring64, "tostring64: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::parse8, "parse8: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::parse16, "parse16: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::parse32, "parse32: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::parse64, "parse64: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::parse128, "parse128: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::tryparse8, "tryparse8: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::tryparse16, "tryparse16: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::tryparse32, "tryparse32: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::tryparse64, "tryparse64: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::tryparse128,"tryparse128:", std::endl);
TEST(CppCore::Test::Encoding::BaseX::estimatebits, "estimatebits: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::estimatesymbols, "estimatesymbols: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::tostring8, "tostring8: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::tostring16, "tostring16: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::tostring32, "tostring32: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::tostring64, "tostring64: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::parse8, "parse8: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::parse16, "parse16: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::parse32, "parse32: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::parse64, "parse64: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::parse128, "parse128: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::tryparse8, "tryparse8: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::tryparse16, "tryparse16: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::tryparse32, "tryparse32: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::tryparse64, "tryparse64: ", std::endl);
TEST(CppCore::Test::Encoding::BaseX::tryparse128, "tryparse128: ", std::endl);

std::cout << "-------------------------------" << std::endl;
std::cout << " CppCore::Encoding::Decimal " << std::endl;
Expand Down

0 comments on commit 7ee5b51

Please sign in to comment.