Hi there,

I'm converting the following C++ function to D:

    void negate ()
    {
        const std::size_t max_chars_ = sizeof (CharT) == 1 ?
            num_chars : num_wchar_ts;
        CharT curr_char_ = sizeof (CharT) == 1 ? -128 : 0;
        string temp_;
        const CharT *curr_ = _charset.c_str ();
        const CharT *chars_end_ = curr_ + _charset.size ();

        _negated = !_negated;
        temp_.resize (max_chars_ - _charset.size ());

        CharT *ptr_ = const_cast<CharT *> (temp_.c_str ());
        std::size_t i_ = 0;

        while (curr_ < chars_end_)
        {
            while (*curr_ > curr_char_)
            {
                *ptr_ = curr_char_;
                ++ptr_;
                ++curr_char_;
                ++i_;
            }

            ++curr_char_;
            ++curr_;
            ++i_;
        }

        for (; i_ < max_chars_; ++i_)
        {
            *ptr_ = curr_char_;
            ++ptr_;
            ++curr_char_;
        }

        _charset = temp_;
    }

Here's the complete source:

module main;

import std.algorithm;
import std.string;

template regex(StringT)
{
struct basic_string_token
{
    bool _negated = false;
        StringT _charset;
        typedef typeof(StringT.init[0]) CharT;
        enum size_t MAX_CHARS = CharT.max + 1;

        this(const bool negated_, ref StringT charset_)
        {
                _negated = negated_;
                _charset = charset_;
        }

        void remove_duplicates()
        {
                _charset.sort;
                _charset = squeeze(_charset);
        }

        void normalise()
        {
                if (_charset.length == MAX_CHARS)
                {
            _negated = !_negated;
                        _charset.clear();
                }
                else if (_charset.length > MAX_CHARS / 2)
                {
                        negate();
                }
        }

        void negate()
        {
                CharT curr_char_ = MAX_CHARS == 256 ? 0x80 : 0;
                StringT temp_;
                size_t curr_ = 0;
                size_t end_ = _charset.length;
                size_t i_ = 0;

        _negated = !_negated;
                temp_.length = MAX_CHARS - end_;

                while (curr_ < end_)
                {
                        while (_charset[curr_] > curr_char_)
                        {
                                temp_[i_] = curr_char_;
                                ++curr_char_;
                                ++i_;
                        }

            ++curr_char_;
            ++curr_;
            ++i_;
                }

        for (; i_ < MAX_CHARS; ++i_)
        {
            temp_ ~= curr_char_;
            ++curr_char_;
        }

                _charset = temp_;
        }
};
}

int main(char[][]argv)
{
        regex!(string).basic_string_token token_;

        token_._charset = "cccbba";
        token_.remove_duplicates();
        token_.negate();
        return 0;
}

Can anyone explain the error 'main.d(61): Error: temp_[i_] isn't
mutable'? Can I use pointers instead like the C++ code? What's the
best approach for maximum efficiency in D (pointers would make the
conversion easier to, I guess).

Thanks,

Ben

Reply via email to