On 2012-08-01 22:10, Jonathan M Davis wrote:

It may very well be a good idea to templatize Token on range type. It would be
nice not to have to templatize it, but that may be the best route to go. The
main question is whether str is _always_ a slice (or the result of
takeExactly) of the orignal range. I _think_ that it is, but I'd have to make
sure of that. If it's not and can't be for whatever reason, then that poses a
problem. If Token _does_ get templatized, then I believe that R will end up
being the original type in the case of the various string types or a range
which has slicing, but it'll be the result of takeExactly(range, len) for
everything else.

To me a string type would be enough. I don't need support for ranges. How about adding a union instead?

enum StringType
{
    utf8,
    utf16,
    utf32
}

struct Token
{
    StringType stringType;

    union
    {
        string strc;
        wstring strw;
        dstring strd;
    }

    @property T str (T = string) ()
    {
        static if (is(T == string))
        {
            assert(stringType == StringType.utf8);
            return strc;
        }
        ...
    }
}

Most use cases would look like this:

string s = token.str;

I just made str a string to begin with, since it was simple, and I was still
working on a lot of the initial design and how I was going to go about things.
If it makes more sense for it to be templated, then it'll be changed so that
it's templated.

I completely understand that.

--
/Jacob Carlborg

Reply via email to