main.d(61): Error: temp_[i_] isn't mutable
Ellery Newcomer
ellery-newcomer at utulsa.edu
Sat Jun 19 12:08:41 PDT 2010
On 06/19/2010 12:30 PM, Ben Hanson wrote:
> 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
because strings aren't mutable. char[]'s on the other hand are, so you
could just change temp_'s type to
import std.traits;
Unqual!(typeof(StringT.init[0]))[] temp_;
or something like that.
More information about the Digitalmars-d
mailing list