int2roman.cc 1.3 KB
Newer Older
Jan Möbius's avatar
Jan Möbius committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
#include <OpenMesh/Core/System/config.hh>
#if defined(OM_CC_MIPS)
#  include <assert.h>
#else
#  include <cassert>
#endif
#include "int2roman.hh"


std::string int2roman( size_t decimal, size_t length )
{
  assert( decimal > 0 && decimal < 1000 );

  const size_t nrows = 4;
  const size_t ncols = 4;

  static size_t table_arabs[ nrows ][ ncols ] = { { 1000, 1000, 1000, 1000 },
                                                  {  900,  500,  400,  100 },
                                                  {   90,   50,   40,   10 },
                                                  {    9,    5,    4,    1 } };

  static char *table_romans[ nrows ][ ncols ] = { {  "M",  "M",  "M", "M" },
                                                  { "CM",  "D", "CD", "C" },
                                                  { "XC",  "L", "XL", "X" },
                                                  { "IX",  "V", "IV", "I" } };

  size_t power;	// power of ten
  size_t index;  // Indexes thru values to subtract
  
Jan Möbius's avatar
Jan Möbius committed
30
  std::string roman = "";
Jan Möbius's avatar
Jan Möbius committed
31 32 33 34 35 36 37 38 39 40 41 42
  roman.reserve(length);

  for ( power = 0; power < nrows; power++ )
    for ( index = 0; index < ncols; index++ )
	while ( decimal >= table_arabs[ power ][ index ] ) 
        {
	   roman   += table_romans[ power ][ index ];
	   decimal -= table_arabs[ power ][ index ];
	}

  return roman;
}