Skip to content
Snippets Groups Projects
hexavigesimal.cpp 1 KiB
Newer Older
#include "hexavigesimal.h"
Jan Trávníček's avatar
Jan Trávníček committed
#include <stdexcept>
Jan Trávníček's avatar
Jan Trávníček committed

namespace ext {
Jan Trávníček's avatar
Jan Trávníček committed

	constexpr int BASE26 = 26;
unsigned fromBase26( const std::string & rep ) {
Jan Trávníček's avatar
Jan Trávníček committed
	unsigned n = 0;
	for ( char repSymbol : rep ) {
Jan Trávníček's avatar
Jan Trávníček committed
		unsigned remainder = repSymbol - 'A';
		if(remainder > BASE26)
Jan Trávníček's avatar
Jan Trávníček committed
			throw std::invalid_argument(rep);
		n = n * BASE26 + remainder;
std::string toBase26( unsigned n ) {
	std::string name;
Jan Trávníček's avatar
Jan Trávníček committed
	do {
		name.push_back ( n % BASE26 + 'A' );
		n /= BASE26;
Jan Trávníček's avatar
Jan Trávníček committed
	} while (n > 0);
Jan Trávníček's avatar
Jan Trávníček committed

	return std::string( name.rbegin( ), name.rend( ) );
Jan Trávníček's avatar
Jan Trávníček committed
}

unsigned bijectiveFromBase26 ( const std::string & rep ) {
Jan Trávníček's avatar
Jan Trávníček committed
	unsigned n = 0;
	for ( char repSymbol : rep ) {
Jan Trávníček's avatar
Jan Trávníček committed
		unsigned remainder = repSymbol - 'A';
		if(remainder > BASE26)
Jan Trávníček's avatar
Jan Trávníček committed
			throw std::invalid_argument(rep);
		n = n * BASE26 + remainder + 1;
Jan Trávníček's avatar
Jan Trávníček committed
	}
	return n;
}

std::string bijectiveToBase26(unsigned n) {
	std::string name;
Jan Trávníček's avatar
Jan Trávníček committed
	while(n > 0) {
		--n;
		name.push_back ( n % BASE26 + 'A' );
	return std::string(name.rbegin(), name.rend());
} /* namespace ext */