Phobos assumes that you only want to fill with spaces when justifying text. I merged the functions with a user supplied character. Don't think it should be much slower.. Just the switch extra switch if the function is inlined.. (but don't take my word for it :) )?

enum Alignment { Right, Left, Center }

string justify(string text, Alignment alignment, int width, char symbol)
{
    if (text.length >= width)
        return text;

    char[] result = new char[width];
    switch(alignment)
    {
        case Alignment.Right:
            result[0 .. width - text.length] = symbol;
            result[width - text.length .. width] = text;
            break;
        case Alignment.Center:
            int left = (width - text.length) / 2;
            result[0 .. left] = symbol;
            result[left .. left + text.length] = text;
            result[left + text.length .. width] = symbol;
            break;
        case Alignment.Left:
            result[0 .. text.length] = text;
            result[text.length .. width] = symbol;
            break;
        default:
            assert(false);
    }

    return assumeUnique(result);
}

string ljustify(string s, int width)
{
    return justify(s, Alignment.Left, width, ' ');
}

string rjustify(string s, int width)
{
    return justify(s, Alignment.Right, width, ' ');
}

string center(string s, int width)
{
    return justify(s, Alignment.Center, width, ' ');
}

Reply via email to